[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
Thu Jun 25 17:48:05 PDT 2009


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20090626/4a060534/attachment.html>


More information about the llvm-commits mailing list