diff options
Diffstat (limited to 'base/thread_local_storage.h')
-rw-r--r-- | base/thread_local_storage.h | 81 |
1 files changed, 29 insertions, 52 deletions
diff --git a/base/thread_local_storage.h b/base/thread_local_storage.h index fba90ae..245a73f 100644 --- a/base/thread_local_storage.h +++ b/base/thread_local_storage.h @@ -32,62 +32,43 @@ #include "base/basictypes.h" -#if defined(OS_POSIX) +#if defined(OS_WIN) +typedef int TLSSlot; +#elif defined(OS_POSIX) #include <pthread.h> -#endif +typedef pthread_key_t TLSSlot; +#endif // OS_* -// Wrapper for thread local storage. This class doesn't do much except provide -// an API for portability. +// Wrapper for thread local storage. This class doesn't +// do much except provide an API for portability later. class ThreadLocalStorage { public: - - // Prototype for the TLS destructor function, which can be optionally used to - // cleanup thread local storage on thread exit. 'value' is the data that is - // stored in thread local storage. + // Prototype for the TLS destructor function, which can be + // optionally used to cleanup thread local storage on + // thread exit. 'value' is the data that is stored + // in thread local storage. typedef void (*TLSDestructorFunc)(void* value); - // A key representing one value stored in TLS. - class Slot { - public: - Slot(TLSDestructorFunc destructor = NULL); - - // This constructor should be used for statics. - // It returns an uninitialized Slot. - explicit Slot(base::LinkerInitialized x) {} - - // Set up the TLS slot. Called by the constructor. - // 'destructor' is a pointer to a function to perform per-thread cleanup of - // this object. If set to NULL, no cleanup is done for this TLS slot. - // Returns false on error. - bool Initialize(TLSDestructorFunc destructor); - - // Free a previously allocated TLS 'slot'. - // If a destructor was set for this slot, removes - // the destructor so that remaining threads exiting - // will not free data. - void Free(); + // Allocate a TLS 'slot'. + // 'destructor' is a pointer to a function to perform + // per-thread cleanup of this object. If set to NULL, + // no cleanup is done for this TLS slot. + // Returns an index > 0 on success, or -1 on failure. + static TLSSlot Alloc(TLSDestructorFunc destructor = NULL); - // Get the thread-local value stored in slot 'slot'. - // Values are guaranteed to initially be zero. - void* Get() const; + // Free a previously allocated TLS 'slot'. + // If a destructor was set for this slot, removes + // the destructor so that remaining threads exiting + // will not free data. + static void Free(TLSSlot slot); - // Set the thread-local value stored in slot 'slot' to - // value 'value'. - void Set(void* value); + // Get the thread-local value stored in slot 'slot'. + // Values are guaranteed to initially be zero. + static void* Get(TLSSlot slot); - bool initialized() const { return initialized_; } - - private: - // The internals of this struct should be considered private. - bool initialized_; -#if defined(OS_WIN) - int slot_; -#elif defined(OS_POSIX) - pthread_key_t key_; -#endif - - DISALLOW_COPY_AND_ASSIGN(Slot); - }; + // Set the thread-local value stored in slot 'slot' to + // value 'value'. + static void Set(TLSSlot slot, void* value); #if defined(OS_WIN) // Function called when on thread exit to call TLS @@ -109,11 +90,7 @@ class ThreadLocalStorage { static TLSDestructorFunc tls_destructors_[kThreadLocalStorageSize]; #endif // OS_WIN - DISALLOW_COPY_AND_ASSIGN(ThreadLocalStorage); + DISALLOW_EVIL_CONSTRUCTORS(ThreadLocalStorage); }; -// Temporary backwards-compatible name. -// TODO(evanm): replace all usage of TLSSlot. -typedef ThreadLocalStorage::Slot TLSSlot; - #endif // BASE_THREAD_LOCAL_STORAGE_H_ |