Split TLS implementation into its own translation unit.
SkTLS has it's own header separate from SkThread, and having SkThread own
the platform implementation of SkTLS is problematic with Chromium. The
simplest way to clean this up is to put the implementation in its own set
of files, where it is also more easily found.
R=robertphillips@google.com
Review URL: https://codereview.chromium.org/19240007
git-svn-id: http://skia.googlecode.com/svn/trunk@10105 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/ports/SkTLS_pthread.cpp b/src/ports/SkTLS_pthread.cpp
new file mode 100644
index 0000000..4264890
--- /dev/null
+++ b/src/ports/SkTLS_pthread.cpp
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2013 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkTLS.h"
+
+#include <pthread.h>
+
+static pthread_key_t gSkTLSKey;
+static pthread_once_t gSkTLSKey_Once = PTHREAD_ONCE_INIT;
+
+static void sk_tls_make_key() {
+ (void)pthread_key_create(&gSkTLSKey, SkTLS::Destructor);
+}
+
+void* SkTLS::PlatformGetSpecific(bool forceCreateTheSlot) {
+ // should we use forceCreateTheSlot to potentially skip calling pthread_once
+ // and just return NULL if we've never been called with
+ // forceCreateTheSlot==true ?
+
+ (void)pthread_once(&gSkTLSKey_Once, sk_tls_make_key);
+ return pthread_getspecific(gSkTLSKey);
+}
+
+void SkTLS::PlatformSetSpecific(void* ptr) {
+ (void)pthread_setspecific(gSkTLSKey, ptr);
+}