Upstream version 7.35.144.0
[platform/framework/web/crosswalk.git] / src / mojo / public / utility / lib / thread_local.h
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_UTILITY_LIB_THREAD_LOCAL_H_
6 #define MOJO_PUBLIC_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_UTILITY_LIB_THREAD_LOCAL_H_