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