blob: b13c119c4e6eeb9740ccbcadaacbf08c4c964881 [file] [log] [blame]
Owen Anderson4a285222009-06-25 21:58:01 +00001//= llvm/System/Win32/ThreadLocal.inc - Win32 Thread Local Data -*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the Win32 specific (non-pthread) ThreadLocal class.
11//
12//===----------------------------------------------------------------------===//
13
14//===----------------------------------------------------------------------===//
15//=== WARNING: Implementation here must contain only generic Win32 code that
16//=== is guaranteed to work on *all* Win32 variants.
17//===----------------------------------------------------------------------===//
18
19#include "Win32.h"
NAKAMURA Takumif10c5192010-10-20 04:05:29 +000020#include "llvm/Support/Compiler.h"
Owen Anderson4a285222009-06-25 21:58:01 +000021#include "llvm/System/ThreadLocal.h"
22
23namespace llvm {
24using namespace sys;
25
26ThreadLocalImpl::ThreadLocalImpl() {
27 DWORD* tls = new DWORD;
28 *tls = TlsAlloc();
29 assert(*tls != TLS_OUT_OF_INDEXES);
30 data = tls;
31}
32
33ThreadLocalImpl::~ThreadLocalImpl() {
34 DWORD* tls = static_cast<DWORD*>(data);
35 TlsFree(*tls);
36 delete tls;
37}
38
Owen Anderson438d3942009-06-25 23:31:18 +000039const void* ThreadLocalImpl::getInstance() {
Owen Anderson4a285222009-06-25 21:58:01 +000040 DWORD* tls = static_cast<DWORD*>(data);
41 return TlsGetValue(*tls);
42}
43
Owen Anderson438d3942009-06-25 23:31:18 +000044void ThreadLocalImpl::setInstance(const void* d){
Owen Anderson4a285222009-06-25 21:58:01 +000045 DWORD* tls = static_cast<DWORD*>(data);
NAKAMURA Takumif10c5192010-10-20 04:05:29 +000046 int ATTRIBUTE_UNUSED errorcode = TlsSetValue(*tls, const_cast<void*>(d));
Oscar Fuentes2b1a6e72009-06-30 14:12:28 +000047 assert(errorcode != 0);
Owen Anderson4a285222009-06-25 21:58:01 +000048}
49
Owen Anderson826c1482010-07-28 22:49:43 +000050void ThreadLocalImpl::removeInstance() {
51 setInstance(0);
52}
53
Owen Anderson4a285222009-06-25 21:58:01 +000054}