[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