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 14namespace mojo { 15namespace internal { 16 17// Helper functions that abstract the cross-platform APIs. 18struct 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. 32template <typename P> 33class 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