| /* |
| * 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 "Test.h" |
| #include "TestClassDef.h" |
| #include "SkGraphics.h" |
| #include "SkPaint.h" |
| #include "SkTLS.h" |
| #include "SkThreadUtils.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); |
| } |