1218885Sdim//= llvm/Support/Win32/ThreadLocal.inc - Win32 Thread Local Data -*- C++ -*-===// 2218885Sdim// 3218885Sdim// The LLVM Compiler Infrastructure 4218885Sdim// 5218885Sdim// This file is distributed under the University of Illinois Open Source 6218885Sdim// License. See LICENSE.TXT for details. 7218885Sdim// 8218885Sdim//===----------------------------------------------------------------------===// 9218885Sdim// 10218885Sdim// This file implements the Win32 specific (non-pthread) ThreadLocal class. 11218885Sdim// 12218885Sdim//===----------------------------------------------------------------------===// 13218885Sdim 14218885Sdim//===----------------------------------------------------------------------===// 15218885Sdim//=== WARNING: Implementation here must contain only generic Win32 code that 16218885Sdim//=== is guaranteed to work on *all* Win32 variants. 17218885Sdim//===----------------------------------------------------------------------===// 18218885Sdim 19218885Sdim#include "Windows.h" 20218885Sdim#include "llvm/Support/ThreadLocal.h" 21218885Sdim 22218885Sdimnamespace llvm { 23218885Sdimusing namespace sys; 24218885Sdim 25239462SdimThreadLocalImpl::ThreadLocalImpl() : data() { 26239462Sdim typedef int SIZE_TOO_BIG[sizeof(DWORD) <= sizeof(data) ? 1 : -1]; 27239462Sdim DWORD* tls = reinterpret_cast<DWORD*>(&data); 28218885Sdim *tls = TlsAlloc(); 29218885Sdim assert(*tls != TLS_OUT_OF_INDEXES); 30218885Sdim} 31218885Sdim 32218885SdimThreadLocalImpl::~ThreadLocalImpl() { 33239462Sdim DWORD* tls = reinterpret_cast<DWORD*>(&data); 34218885Sdim TlsFree(*tls); 35218885Sdim} 36218885Sdim 37218885Sdimconst void* ThreadLocalImpl::getInstance() { 38239462Sdim DWORD* tls = reinterpret_cast<DWORD*>(&data); 39218885Sdim return TlsGetValue(*tls); 40218885Sdim} 41218885Sdim 42218885Sdimvoid ThreadLocalImpl::setInstance(const void* d){ 43239462Sdim DWORD* tls = reinterpret_cast<DWORD*>(&data); 44218885Sdim int errorcode = TlsSetValue(*tls, const_cast<void*>(d)); 45218885Sdim assert(errorcode != 0); 46218885Sdim (void)errorcode; 47218885Sdim} 48218885Sdim 49218885Sdimvoid ThreadLocalImpl::removeInstance() { 50218885Sdim setInstance(0); 51218885Sdim} 52218885Sdim 53218885Sdim} 54