1b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com/*
2b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com * Copyright 2012 Google Inc.
3b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com *
4b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com * Use of this source code is governed by a BSD-style license that can be
5b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com * found in the LICENSE file.
6b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com */
7b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com
8b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com#include "SkGraphics.h"
9b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com#include "SkPaint.h"
10b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com#include "SkTLS.h"
11b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com#include "SkThreadUtils.h"
128f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.h"
13b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com
14b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.comstatic void thread_main(void*) {
15b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com    SkGraphics::SetTLSFontCacheLimit(1 * 1024 * 1024);
16b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com
17b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com    const char text[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
18b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com    size_t len = strlen(text);
19b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com
20b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com    SkPaint paint;
21b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com
22b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com    for (int j = 0; j < 10; ++j) {
23b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com        for (int i = 9; i <= 48; ++i) {
24b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com            paint.setTextSize(SkIntToScalar(i));
25b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com            paint.setAntiAlias(false);
26b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com            paint.measureText(text, len);
27b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com            paint.setAntiAlias(true);
28b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com            paint.measureText(text, len);
29b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com        }
30b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com    }
31b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com}
32b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com
3393897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.comstatic void test_threads(SkThread::entryPointProc proc) {
34b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com    SkThread* threads[8];
35b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com    int N = SK_ARRAY_COUNT(threads);
36b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com    int i;
37b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com
38b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com    for (i = 0; i < N; ++i) {
3993897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.com        threads[i] = new SkThread(proc);
40b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com    }
41d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
42b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com    for (i = 0; i < N; ++i) {
43b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com        threads[i]->start();
44b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com    }
45b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com
46b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com    for (i = 0; i < N; ++i) {
47b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com        threads[i]->join();
48b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com    }
49b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com
50b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com    for (i = 0; i < N; ++i) {
51b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com        delete threads[i];
52b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com    }
53b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com}
54b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com
5593897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.comstatic int32_t gCounter;
5693897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.com
5793897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.comstatic void* FakeCreateTLS() {
5893897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.com    sk_atomic_inc(&gCounter);
5993897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.com    return NULL;
6093897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.com}
6193897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.com
6254f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.comstatic void FakeDeleteTLS(void*) {
6393897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.com    sk_atomic_dec(&gCounter);
6493897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.com}
6593897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.com
6654f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.comstatic void testTLSDestructor(void*) {
6793897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.com    SkTLS::Get(FakeCreateTLS, FakeDeleteTLS);
6893897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.com}
6993897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.com
70e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(TLS, reporter) {
7193897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.com    // TODO: Disabled for now to work around
7293897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.com    // http://code.google.com/p/skia/issues/detail?id=619
7393897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.com    // ('flaky segfault in TLS test on Shuttle_Ubuntu12 buildbots')
7405af1afd429808913683da75644e48bece12e820humper@google.com    if( false ) test_threads(&thread_main);
7593897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.com
7693897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.com    // Test to ensure that at thread destruction, TLS destructors
7793897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.com    // have been called.
7893897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.com    test_threads(&testTLSDestructor);
7993897637bc65eab919be40ec4b1b2c3242179b24scroggo@google.com    REPORTER_ASSERT(reporter, 0 == gCounter);
80b6a4b7363faaf57e7dc123b040346e45c0efc9eareed@google.com}
81