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