00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef LIBMUTH_PTHREADTHREADLOCAL_H
00020 #define LIBMUTH_PTHREADTHREADLOCAL_H
00021
00022 #include <assert.h>
00023 #include <pthread.h>
00024
00025 #ifndef USE_PTHREAD
00026 #error this file must be compiled with -DUSE_PTHREAD
00027 #endif
00028
00033 template<class T> class PthreadThreadLocal {
00034 private:
00035 pthread_key_t key;
00036 public:
00040 PthreadThreadLocal() {
00041 const int r(pthread_key_create(&this->key,
00042 NULL));
00043 assert(r == 0);
00044 }
00048 ~PthreadThreadLocal() {
00049 const int r(pthread_key_delete(this->key));
00050 assert(r == 0);
00051 }
00058 PthreadThreadLocal &operator=(T *v) {
00059 const int r(pthread_setspecific(this->key,
00060 static_cast<void*>(v)));
00061 assert(r == 0);
00062 return *this;
00063 }
00069 T &operator*() {
00070 return *(static_cast<T*>(pthread_getspecific(
00071 this->key)));
00072 }
00078 T &operator*() const {
00079 return *(static_cast<T*>(pthread_getspecific(
00080 this->key)));
00081 }
00082 };
00083
00084 #endif