1 /*
2  * Copyright 2012 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "SkGraphics.h"
9 #include "SkPaint.h"
10 #include "SkTLS.h"
11 #include "SkThreadUtils.h"
12 #include "Test.h"
13 
thread_main(void *)14 static void thread_main(void*) {
15     SkGraphics::SetTLSFontCacheLimit(1 * 1024 * 1024);
16 
17     const char text[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
18     size_t len = strlen(text);
19 
20     SkPaint paint;
21 
22     for (int j = 0; j < 10; ++j) {
23         for (int i = 9; i <= 48; ++i) {
24             paint.setTextSize(SkIntToScalar(i));
25             paint.setAntiAlias(false);
26             paint.measureText(text, len);
27             paint.setAntiAlias(true);
28             paint.measureText(text, len);
29         }
30     }
31 }
32 
test_threads(SkThread::entryPointProc proc)33 static void test_threads(SkThread::entryPointProc proc) {
34     SkThread* threads[8];
35     int N = SK_ARRAY_COUNT(threads);
36     int i;
37 
38     for (i = 0; i < N; ++i) {
39         threads[i] = new SkThread(proc);
40     }
41 
42     for (i = 0; i < N; ++i) {
43         threads[i]->start();
44     }
45 
46     for (i = 0; i < N; ++i) {
47         threads[i]->join();
48     }
49 
50     for (i = 0; i < N; ++i) {
51         delete threads[i];
52     }
53 }
54 
55 static int32_t gCounter;
56 
FakeCreateTLS()57 static void* FakeCreateTLS() {
58     sk_atomic_inc(&gCounter);
59     return nullptr;
60 }
61 
FakeDeleteTLS(void *)62 static void FakeDeleteTLS(void*) {
63     sk_atomic_dec(&gCounter);
64 }
65 
testTLSDestructor(void *)66 static void testTLSDestructor(void*) {
67     SkTLS::Get(FakeCreateTLS, FakeDeleteTLS);
68 }
69 
DEF_TEST(TLS,reporter)70 DEF_TEST(TLS, reporter) {
71     // TODO: Disabled for now to work around
72     // http://code.google.com/p/skia/issues/detail?id=619
73     // ('flaky segfault in TLS test on Shuttle_Ubuntu12 buildbots')
74     if( false ) test_threads(&thread_main);
75 
76     // Test to ensure that at thread destruction, TLS destructors
77     // have been called.
78     test_threads(&testTLSDestructor);
79     REPORTER_ASSERT(reporter, 0 == gCounter);
80 }
81