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
14static 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
33static 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
55static int32_t gCounter;
56
57static void* FakeCreateTLS() {
58    sk_atomic_inc(&gCounter);
59    return NULL;
60}
61
62static void FakeDeleteTLS(void*) {
63    sk_atomic_dec(&gCounter);
64}
65
66static void testTLSDestructor(void*) {
67    SkTLS::Get(FakeCreateTLS, FakeDeleteTLS);
68}
69
70DEF_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