Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / mojo / public / cpp / 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_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   void Allocate() { ThreadLocalPlatform::AllocateSlot(&slot_); }
38
39   void Free() { ThreadLocalPlatform::FreeSlot(slot_); }
40
41   P* Get() {
42     return static_cast<P*>(ThreadLocalPlatform::GetValueFromSlot(slot_));
43   }
44
45   void Set(P* value) { ThreadLocalPlatform::SetValueInSlot(slot_, value); }
46
47  private:
48   ThreadLocalPlatform::SlotType slot_;
49 };
50
51 }  // namespace internal
52 }  // namespace mojo
53
54 #endif  // MOJO_PUBLIC_CPP_UTILITY_LIB_THREAD_LOCAL_H_