Home | History | Annotate | Download | only in lib
      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:
     35   ThreadLocalPointer() : slot_() {
     36   }
     37 
     38   void Allocate() {
     39     ThreadLocalPlatform::AllocateSlot(&slot_);
     40   }
     41 
     42   void Free() {
     43     ThreadLocalPlatform::FreeSlot(slot_);
     44   }
     45 
     46   P* Get() {
     47     return static_cast<P*>(ThreadLocalPlatform::GetValueFromSlot(slot_));
     48   }
     49 
     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