[FreeType] Incorrect application of glyph positioning in the Y direction
[WebKit-https.git] / Source / WebCore / platform / mac / ThreadCheck.mm
1 /*
2  * Copyright (C) 2007 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #import "config.h"
27 #import "ThreadCheck.h"
28
29 #if PLATFORM(MAC)
30
31 #import <wtf/HashSet.h>
32 #import <wtf/NeverDestroyed.h>
33 #import <wtf/StdLibExtras.h>
34 #import <wtf/text/StringHash.h>
35
36 namespace WebCore {
37
38 static bool didReadThreadViolationBehaviorFromUserDefaults = false;
39 static bool threadViolationBehaviorIsDefault = true;
40 static ThreadViolationBehavior threadViolationBehavior[MaximumThreadViolationRound] = { RaiseExceptionOnThreadViolation, RaiseExceptionOnThreadViolation, RaiseExceptionOnThreadViolation };
41
42 static void readThreadViolationBehaviorFromUserDefaults()
43 {
44     didReadThreadViolationBehaviorFromUserDefaults = true;
45
46     ThreadViolationBehavior newBehavior = LogOnFirstThreadViolation;
47     NSString *threadCheckLevel = [[NSUserDefaults standardUserDefaults] stringForKey:@"WebCoreThreadCheck"];
48     if (!threadCheckLevel)
49         return;
50
51     if ([threadCheckLevel isEqualToString:@"None"])
52         newBehavior = NoThreadCheck;
53     else if ([threadCheckLevel isEqualToString:@"Exception"])
54         newBehavior = RaiseExceptionOnThreadViolation;
55     else if ([threadCheckLevel isEqualToString:@"Log"])
56         newBehavior = LogOnThreadViolation;
57     else if ([threadCheckLevel isEqualToString:@"LogOnce"])
58         newBehavior = LogOnFirstThreadViolation;
59     else
60         ASSERT_NOT_REACHED();
61
62     threadViolationBehaviorIsDefault = false;
63
64     for (unsigned i = 0; i < MaximumThreadViolationRound; ++i)
65         threadViolationBehavior[i] = newBehavior;
66 }
67
68 void setDefaultThreadViolationBehavior(ThreadViolationBehavior behavior, ThreadViolationRound round)
69 {
70     ASSERT(round < MaximumThreadViolationRound);
71     if (round >= MaximumThreadViolationRound)
72         return;
73     if (!didReadThreadViolationBehaviorFromUserDefaults)
74         readThreadViolationBehaviorFromUserDefaults();
75     if (threadViolationBehaviorIsDefault)
76         threadViolationBehavior[round] = behavior;
77 }
78
79 void reportThreadViolation(const char* function, ThreadViolationRound round)
80 {
81     ASSERT(round < MaximumThreadViolationRound);
82     if (round >= MaximumThreadViolationRound)
83         return;
84     if (!didReadThreadViolationBehaviorFromUserDefaults)
85         readThreadViolationBehaviorFromUserDefaults();
86     if (threadViolationBehavior[round] == NoThreadCheck)
87         return;
88     if (pthread_main_np())
89         return;
90     WebCoreReportThreadViolation(function, round);
91 }
92
93 } // namespace WebCore
94
95 // Split out the actual reporting of the thread violation to make it easier to set a breakpoint
96 void WebCoreReportThreadViolation(const char* function, WebCore::ThreadViolationRound round)
97 {
98     using namespace WebCore;
99
100     ASSERT(round < MaximumThreadViolationRound);
101     if (round >= MaximumThreadViolationRound)
102         return;
103
104     static NeverDestroyed<HashSet<String>> loggedFunctions;
105     switch (threadViolationBehavior[round]) {
106         case NoThreadCheck:
107             break;
108         case LogOnFirstThreadViolation:
109             if (loggedFunctions.get().add(function).isNewEntry) {
110                 NSLog(@"WebKit Threading Violation - %s called from secondary thread", function);
111                 NSLog(@"Additional threading violations for this function will not be logged.");
112             }
113             break;
114         case LogOnThreadViolation:
115             NSLog(@"WebKit Threading Violation - %s called from secondary thread", function);
116             break;
117         case RaiseExceptionOnThreadViolation:
118             [NSException raise:@"WebKitThreadingException" format:@"%s was called from a secondary thread", function];
119             break;
120     }
121 }
122
123 #endif // PLATFORM(MAC)