Changeset 346 for cpp/common


Ignore:
Timestamp:
04/07/15 04:20:14 (10 years ago)
Author:
Maciej Komosinski
Message:

Each thread can use its own simulator's GenMan?

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpp/common/threads.h

    r286 r346  
    6666};
    6767
     68template<class T> class ThreadSingletonPtr
     69{
     70pthread_key_t mt_key;
     71
     72  public:
     73
     74ThreadSingletonPtr()
     75 {
     76 pthread_key_create(&mt_key,NULL);
     77 }
     78
     79T* setptr(T* new_o)
     80 {
     81 T* o=(T*)pthread_getspecific(mt_key);
     82 pthread_setspecific(mt_key,new_o);
     83 return o;
     84 }
     85
     86T* get()
     87 {
     88 return (T*)pthread_getspecific(mt_key);
     89 }
     90};
     91
    6892#else
    6993
     
    82106////////////////////////////////////
    83107
     108// THREAD_LOCAL(cls) - behaves like object of class cls (automatic creation/destruction)
     109// THREAD_LOCAL(cls)..._PTR - behaves like pointer to cls (initial NULL, no autocreation/destruction)
     110// _PTR can only be accessed using tls...Ptr() variant of Get/Set, _ptr suffix is internally used in variable name to avoid mistakes
    84111#ifdef USE_CPP_TLS
    85112
     
    88115#define THREAD_LOCAL_DECL(cls,var) CPP_TLS cls* var
    89116#define THREAD_LOCAL_DEF(cls,var) CPP_TLS cls* var=NULL
     117#define THREAD_LOCAL_DECL_PTR(cls,var) CPP_TLS cls* var ## _ptr
     118#define THREAD_LOCAL_DEF_PTR(cls,var) CPP_TLS cls* var ## _ptr=NULL
    90119
    91120template<class T> T* tlsGet(T*& var)
     
    93122if (!var)
    94123        var=new T();
     124return var;
     125}
     126
     127template<class T> T* tlsGetPtr(T*& var)
     128{
    95129return var;
    96130}
     
    105139}
    106140
     141#define tlsGetSetPtr(var,o) tlsSet(var ## _ptr,o)
     142
    107143#else
    108144
     
    115151#define tlsSet(var,o) var.set(o)
    116152
     153#define THREAD_LOCAL_DECL_PTR(cls,var) ThreadSingletonPtr<cls> var ## _ptr
     154#define THREAD_LOCAL_DEF_PTR(cls,var) ThreadSingletonPtr<cls> var ## _ptr
     155#define tlsGetPtr(var) var ## _ptr.get()
     156#define tlsSetPtr(var,o) var ## _ptr.setptr(o)
     157
    117158#endif
    118159
Note: See TracChangeset for help on using the changeset viewer.