blob: 512462d89005cc4f62b6024970e20b4dfc7a264f [file] [log] [blame]
Charles Davis53ca1f32010-11-29 19:44:50 +00001//= llvm/Support/Win32/ThreadLocal.inc - Win32 Thread Local Data -*- C++ -*-===//
Michael J. Spencer1f6efa32010-11-29 18:16:10 +00002//
Owen Anderson4a285222009-06-25 21:58:01 +00003// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Michael J. Spencer1f6efa32010-11-29 18:16:10 +00007//
Owen Anderson4a285222009-06-25 21:58:01 +00008//===----------------------------------------------------------------------===//
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
Michael J. Spencer1f6efa32010-11-29 18:16:10 +000019#include "Windows.h"
20#include "llvm/Support/ThreadLocal.h"
Owen Anderson4a285222009-06-25 21:58:01 +000021
22namespace llvm {
23using namespace sys;
24
25ThreadLocalImpl::ThreadLocalImpl() {
26 DWORD* tls = new DWORD;
27 *tls = TlsAlloc();
28 assert(*tls != TLS_OUT_OF_INDEXES);
29 data = tls;
30}
31
32ThreadLocalImpl::~ThreadLocalImpl() {
33 DWORD* tls = static_cast<DWORD*>(data);
34 TlsFree(*tls);
35 delete tls;
36}
37
Owen Anderson438d3942009-06-25 23:31:18 +000038const void* ThreadLocalImpl::getInstance() {
Owen Anderson4a285222009-06-25 21:58:01 +000039 DWORD* tls = static_cast<DWORD*>(data);
40 return TlsGetValue(*tls);
41}
42
Owen Anderson438d3942009-06-25 23:31:18 +000043void ThreadLocalImpl::setInstance(const void* d){
Owen Anderson4a285222009-06-25 21:58:01 +000044 DWORD* tls = static_cast<DWORD*>(data);
Duncan Sands05897c82010-10-25 13:10:03 +000045 int errorcode = TlsSetValue(*tls, const_cast<void*>(d));
Oscar Fuentes2b1a6e72009-06-30 14:12:28 +000046 assert(errorcode != 0);
Duncan Sands05897c82010-10-25 13:10:03 +000047 (void)errorcode;
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}