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 "Test.h"
     12 #include <atomic>
     13 #include <thread>
     14 
     15 static void thread_main() {
     16     SkGraphics::SetTLSFontCacheLimit(1 * 1024 * 1024);
     17 
     18     const char text[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
     19     size_t len = strlen(text);
     20 
     21     SkPaint paint;
     22 
     23     for (int j = 0; j < 10; ++j) {
     24         for (int i = 9; i <= 48; ++i) {
     25             paint.setTextSize(SkIntToScalar(i));
     26             paint.setAntiAlias(false);
     27             paint.measureText(text, len);
     28             paint.setAntiAlias(true);
     29             paint.measureText(text, len);
     30         }
     31     }
     32 }
     33 
     34 template <typename Fn>
     35 static void test_threads(Fn fn) {
     36     std::thread threads[8];
     37 
     38     for (auto& thread : threads) {
     39         thread = std::thread(fn);
     40     }
     41     for (auto& thread : threads) {
     42         thread.join();
     43     }
     44 }
     45 
     46 static std::atomic<int> gCounter{0};
     47 
     48 static void* fake_create_TLS() {
     49     gCounter++;
     50     return nullptr;
     51 }
     52 static void fake_delete_TLS(void*) {
     53     gCounter--;
     54 }
     55 
     56 DEF_TEST(TLS, reporter) {
     57     // TODO: Disabled for now to work around
     58     // http://code.google.com/p/skia/issues/detail?id=619
     59     // ('flaky segfault in TLS test on Shuttle_Ubuntu12 buildbots')
     60     if( false ) test_threads(&thread_main);
     61 
     62     // Test to ensure that at thread destruction, TLS destructors
     63     // have been called.
     64     test_threads([] {
     65         SkTLS::Get(fake_create_TLS, fake_delete_TLS);
     66     });
     67     REPORTER_ASSERT(reporter, 0 == gCounter.load());
     68 }
     69