| /* | 
 |  * Copyright 2012 Google Inc. | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 |  | 
 | #include "SkGraphics.h" | 
 | #include "SkPaint.h" | 
 | #include "SkTLS.h" | 
 | #include "SkThreadUtils.h" | 
 | #include "Test.h" | 
 |  | 
 | static void thread_main(void*) { | 
 |     SkGraphics::SetTLSFontCacheLimit(1 * 1024 * 1024); | 
 |  | 
 |     const char text[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; | 
 |     size_t len = strlen(text); | 
 |  | 
 |     SkPaint paint; | 
 |  | 
 |     for (int j = 0; j < 10; ++j) { | 
 |         for (int i = 9; i <= 48; ++i) { | 
 |             paint.setTextSize(SkIntToScalar(i)); | 
 |             paint.setAntiAlias(false); | 
 |             paint.measureText(text, len); | 
 |             paint.setAntiAlias(true); | 
 |             paint.measureText(text, len); | 
 |         } | 
 |     } | 
 | } | 
 |  | 
 | static void test_threads(SkThread::entryPointProc proc) { | 
 |     SkThread* threads[8]; | 
 |     int N = SK_ARRAY_COUNT(threads); | 
 |     int i; | 
 |  | 
 |     for (i = 0; i < N; ++i) { | 
 |         threads[i] = new SkThread(proc); | 
 |     } | 
 |  | 
 |     for (i = 0; i < N; ++i) { | 
 |         threads[i]->start(); | 
 |     } | 
 |  | 
 |     for (i = 0; i < N; ++i) { | 
 |         threads[i]->join(); | 
 |     } | 
 |  | 
 |     for (i = 0; i < N; ++i) { | 
 |         delete threads[i]; | 
 |     } | 
 | } | 
 |  | 
 | static int32_t gCounter; | 
 |  | 
 | static void* FakeCreateTLS() { | 
 |     sk_atomic_inc(&gCounter); | 
 |     return NULL; | 
 | } | 
 |  | 
 | static void FakeDeleteTLS(void*) { | 
 |     sk_atomic_dec(&gCounter); | 
 | } | 
 |  | 
 | static void testTLSDestructor(void*) { | 
 |     SkTLS::Get(FakeCreateTLS, FakeDeleteTLS); | 
 | } | 
 |  | 
 | DEF_TEST(TLS, reporter) { | 
 |     // TODO: Disabled for now to work around | 
 |     // http://code.google.com/p/skia/issues/detail?id=619 | 
 |     // ('flaky segfault in TLS test on Shuttle_Ubuntu12 buildbots') | 
 |     if( false ) test_threads(&thread_main); | 
 |  | 
 |     // Test to ensure that at thread destruction, TLS destructors | 
 |     // have been called. | 
 |     test_threads(&testTLSDestructor); | 
 |     REPORTER_ASSERT(reporter, 0 == gCounter); | 
 | } |