1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef MOJO_PUBLIC_CPP_UTILITY_LIB_THREAD_LOCAL_H_ 6 #define MOJO_PUBLIC_CPP_UTILITY_LIB_THREAD_LOCAL_H_ 7 8 #ifndef _WIN32 9 #include <pthread.h> 10 #endif 11 12 #include "mojo/public/cpp/system/macros.h" 13 14 namespace mojo { 15 namespace internal { 16 17 // Helper functions that abstract the cross-platform APIs. 18 struct ThreadLocalPlatform { 19 #ifdef _WIN32 20 typedef unsigned long SlotType; 21 #else 22 typedef pthread_key_t SlotType; 23 #endif 24 25 static void AllocateSlot(SlotType* slot); 26 static void FreeSlot(SlotType slot); 27 static void* GetValueFromSlot(SlotType slot); 28 static void SetValueInSlot(SlotType slot, void* value); 29 }; 30 31 // This class is intended to be statically allocated. 32 template <typename P> 33 class ThreadLocalPointer { 34 public: ThreadLocalPointer()35 ThreadLocalPointer() : slot_() { 36 } 37 Allocate()38 void Allocate() { 39 ThreadLocalPlatform::AllocateSlot(&slot_); 40 } 41 Free()42 void Free() { 43 ThreadLocalPlatform::FreeSlot(slot_); 44 } 45 Get()46 P* Get() { 47 return static_cast<P*>(ThreadLocalPlatform::GetValueFromSlot(slot_)); 48 } 49 Set(P * value)50 void Set(P* value) { 51 ThreadLocalPlatform::SetValueInSlot(slot_, value); 52 } 53 54 private: 55 ThreadLocalPlatform::SlotType slot_; 56 }; 57 58 } // namespace internal 59 } // namespace mojo 60 61 #endif // MOJO_PUBLIC_CPP_UTILITY_LIB_THREAD_LOCAL_H_ 62