[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