• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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