[llvm-commits] [llvm] r74209 - in /llvm/trunk: include/llvm/System/ThreadLocal.h lib/System/ThreadLocal.cpp lib/System/Unix/ThreadLocal.inc lib/System/Win32/ThreadLocal.inc
Howard Su
howard0su at gmail.com
Fri Jun 26 21:23:48 PDT 2009
any issue, the assert should change to:void
ThreadLocalImpl::setInstance(const void* d){
DWORD* tls = static_cast<DWORD*>(data);
int errorcode = TlsSetValue(*tls, const_cast<void*>(d));
assert(errorcode != 0); <====
}
>From MSDN:
Return Value
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error
information, call*GetLastError*<http://msdn.microsoft.com/en-us/library/ms679360(VS.85).aspx>
.
On Fri, Jun 26, 2009 at 8:48 AM, Howard Su <howard0su at gmail.com> wrote:
> c:\llvm\lib\system\Win32/ThreadLocal.inc(45) : error C2664: 'TlsSetValue' :
> cann
> ot convert parameter 2 from 'const void *' to 'LPVOID'
> Conversion loses qualifiers
>
> It is safe to add a force cast here.
>
> On Fri, Jun 26, 2009 at 5:58 AM, Owen Anderson <resistor at mac.com> wrote:
>
>> Author: resistor
>> Date: Thu Jun 25 16:58:01 2009
>> New Revision: 74209
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=74209&view=rev
>> Log:
>> Add a class for supporting platform independent thread-local storage.
>>
>> Windows people, please double-check/patch this.
>>
>> Added:
>> llvm/trunk/include/llvm/System/ThreadLocal.h
>> llvm/trunk/lib/System/ThreadLocal.cpp
>> llvm/trunk/lib/System/Unix/ThreadLocal.inc
>> llvm/trunk/lib/System/Win32/ThreadLocal.inc
>>
>> Added: llvm/trunk/include/llvm/System/ThreadLocal.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/ThreadLocal.h?rev=74209&view=auto
>>
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/System/ThreadLocal.h (added)
>> +++ llvm/trunk/include/llvm/System/ThreadLocal.h Thu Jun 25 16:58:01 2009
>> @@ -0,0 +1,41 @@
>> +//===- llvm/System/ThreadLocal.h - Thread Local Data ------------*- C++
>> -*-===//
>> +//
>> +// The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// This file declares the llvm::sys::ThreadLocal class.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef LLVM_SYSTEM_THREAD_LOCAL_H
>> +#define LLVM_SYSTEM_THREAD_LOCAL_H
>> +
>> +#include "llvm/System/Threading.h"
>> +#include <cassert>
>> +
>> +namespace llvm {
>> + namespace sys {
>> + class ThreadLocalImpl {
>> + void* data;
>> + public:
>> + ThreadLocalImpl();
>> + virtual ~ThreadLocalImpl();
>> + void setInstance(void* d);
>> + void* getInstance();
>> + };
>> +
>> + template<class T>
>> + class ThreadLocal : public ThreadLocalImpl {
>> + public:
>> + ThreadLocal() : ThreadLocalImpl() { }
>> + T* get() { return static_cast<T*>(getInstance()); }
>> + void set(T* d) { setInstance(d); }
>> + };
>> + }
>> +}
>> +
>> +#endif
>>
>> Added: llvm/trunk/lib/System/ThreadLocal.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/ThreadLocal.cpp?rev=74209&view=auto
>>
>>
>> ==============================================================================
>> --- llvm/trunk/lib/System/ThreadLocal.cpp (added)
>> +++ llvm/trunk/lib/System/ThreadLocal.cpp Thu Jun 25 16:58:01 2009
>> @@ -0,0 +1,77 @@
>> +//===- ThreadLocal.cpp - Thread Local Data ----------------------*- C++
>> -*-===//
>> +//
>> +// The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// This file implements the llvm::sys::ThreadLocal class.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "llvm/Config/config.h"
>> +#include "llvm/System/ThreadLocal.h"
>> +
>>
>> +//===----------------------------------------------------------------------===//
>> +//=== WARNING: Implementation here must contain only TRULY operating
>> system
>> +//=== independent code.
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +#if !defined(ENABLE_THREADS) || ENABLE_THREADS == 0
>> +// Define all methods as no-ops if threading is explicitly disabled
>> +namespace llvm {
>> +using namespace sys;
>> +ThreadLocalImpl::ThreadLocalImpl() { }
>> +ThreadLocalImpl::~ThreadLocalImpl() { }
>> +void ThreadLocalImpl::setInstance(void* d) { data = d; }
>> +void* ThreadLocalImpl::getInstance() { return data; }
>> +}
>> +#else
>> +
>> +#if defined(HAVE_PTHREAD_H) && defined(HAVE_PTHREAD_MUTEX_LOCK)
>> +
>> +#include <cassert>
>> +#include <pthread.h>
>> +#include <stdlib.h>
>> +
>> +namespace llvm {
>> +using namespace sys;
>> +
>> +ThreadLocalImpl::ThreadLocalImpl() : data(0) {
>> + pthread_key_t* key = new pthread_key_t;
>> + int errorcode = pthread_key_create(key, NULL);
>> + assert(errorcode == 0);
>> + data = key;
>> +}
>> +
>> +ThreadLocalImpl::~ThreadLocalImpl() {
>> + pthread_key_t* key = static_cast<pthread_key_t*>(data);
>> + int errorcode = pthread_key_delete(*key);
>> + assert(errorcode = 0);
>> + delete key;
>> +}
>> +
>> +void ThreadLocalImpl::setInstance(void* d) {
>> + pthread_key_t* key = static_cast<pthread_key_t*>(data);
>> + int errorcode = pthread_setspecific(*key, d);
>> + assert(errorcode == 0);
>> +}
>> +
>> +void* ThreadLocalImpl::getInstance() {
>> + pthread_key_t* key = static_cast<pthread_key_t*>(data);
>> + return pthread_getspecific(*key);
>> +}
>> +
>> +}
>> +
>> +#elif defined(LLVM_ON_UNIX)
>> +#include "Unix/ThreadLocal.inc"
>> +#elif defined( LLVM_ON_WIN32)
>> +#include "Win32/ThreadLocal.inc"
>> +#else
>> +#warning Neither LLVM_ON_UNIX nor LLVM_ON_WIN32 was set in
>> System/ThreadLocal.cpp
>> +#endif
>> +#endif
>> +
>>
>> Added: llvm/trunk/lib/System/Unix/ThreadLocal.inc
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/ThreadLocal.inc?rev=74209&view=auto
>>
>>
>> ==============================================================================
>> --- llvm/trunk/lib/System/Unix/ThreadLocal.inc (added)
>> +++ llvm/trunk/lib/System/Unix/ThreadLocal.inc Thu Jun 25 16:58:01 2009
>> @@ -0,0 +1,25 @@
>> +//=== llvm/System/Unix/ThreadLocal.inc - Unix Thread Local Data -*- C++
>> -*-===//
>> +//
>> +// The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// This file implements the Unix specific (non-pthread) ThreadLocal
>> class.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>>
>> +//===----------------------------------------------------------------------===//
>> +//=== WARNING: Implementation here must contain only generic UNIX code
>> that
>> +//=== is guaranteed to work on *all* UNIX variants.
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +namespace llvm {
>> +using namespace sys;
>> +ThreadLocalImpl::ThreadLocalImpl() { }
>> +ThreadLocalImpl::~ThreadLocalImpl() { }
>> +void ThreadLocalImpl::setInstance(void* d) { data = d; }
>> +void* ThreadLocalImpl::getInstance() { return data; }
>> +}
>> \ No newline at end of file
>>
>> Added: llvm/trunk/lib/System/Win32/ThreadLocal.inc
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Win32/ThreadLocal.inc?rev=74209&view=auto
>>
>>
>> ==============================================================================
>> --- llvm/trunk/lib/System/Win32/ThreadLocal.inc (added)
>> +++ llvm/trunk/lib/System/Win32/ThreadLocal.inc Thu Jun 25 16:58:01 2009
>> @@ -0,0 +1,49 @@
>> +//= llvm/System/Win32/ThreadLocal.inc - Win32 Thread Local Data -*- C++
>> -*-===//
>> +//
>> +// The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// This file implements the Win32 specific (non-pthread) ThreadLocal
>> class.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>>
>> +//===----------------------------------------------------------------------===//
>> +//=== WARNING: Implementation here must contain only generic Win32 code
>> that
>> +//=== is guaranteed to work on *all* Win32 variants.
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "Win32.h"
>> +#include "llvm/System/ThreadLocal.h"
>> +
>> +namespace llvm {
>> +using namespace sys;
>> +
>> +ThreadLocalImpl::ThreadLocalImpl() {
>> + DWORD* tls = new DWORD;
>> + *tls = TlsAlloc();
>> + assert(*tls != TLS_OUT_OF_INDEXES);
>> + data = tls;
>> +}
>> +
>> +ThreadLocalImpl::~ThreadLocalImpl() {
>> + DWORD* tls = static_cast<DWORD*>(data);
>> + TlsFree(*tls);
>> + delete tls;
>> +}
>> +
>> +void* ThreadLocalImpl::getInstance() {
>> + DWORD* tls = static_cast<DWORD*>(data);
>> + return TlsGetValue(*tls);
>> +}
>> +
>> +void ThreadLocalImpl::setInstance(void* d){
>> + DWORD* tls = static_cast<DWORD*>(data);
>> + int errorcode = TlsSetValue(*tls, d);
>> + assert(errorcode == 0);
>> +}
>> +
>> +}
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
>
>
> --
> -Howard
>
--
-Howard
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20090627/ac9fd4cb/attachment.html>
More information about the llvm-commits
mailing list