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