1 /* 2 * Copyright (c) 2005, Eric Crahen 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a copy 5 * of this software and associated documentation files (the "Software"), to deal 6 * in the Software without restriction, including without limitation the rights 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 * copies of the Software, and to permit persons to whom the Software is furnished 9 * to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included in all 12 * copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 19 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 20 * 21 */ 22 23 #ifndef __ZTTSS_H__ 24 #define __ZTTSS_H__ 25 26 #include "zthread/NonCopyable.h" 27 #include <pthread.h> 28 #include <assert.h> 29 30 namespace ZThread { 31 32 /** 33 * @class TSS 34 * @author Eric Crahen <http://www.code-foo.com> 35 * @date <2003-07-27T14:18:37-0400> 36 * @version 2.3.0 37 * 38 * An abstraction for dealing with POSIX thread specific storage (tss). 39 * Provides get/set and creation/destruction. 40 */ 41 template <typename T> 42 class TSS : private NonCopyable { 43 44 pthread_key_t _key; 45 46 public: 47 48 /** 49 * Create a new object for accessing tss. 50 */ TSS()51 TSS() { 52 53 if(pthread_key_create(&_key, 0) != 0) { 54 assert(0); // Key creation failed 55 } 56 57 } 58 59 /** 60 * Destroy the underlying supoprt for accessing tss with this 61 * object. 62 */ ~TSS()63 ~TSS() { 64 65 pthread_key_delete(_key); 66 67 } 68 69 /** 70 * Get the value stored in tss. 71 * 72 * @return T 73 * 74 * @exception InvalidOp_exception thrown when the tss is not properly initialized 75 */ get()76 T get() const { 77 return reinterpret_cast<T>(pthread_getspecific(_key)); 78 } 79 80 81 /** 82 * Store a value in tss. 83 * 84 * @param value T 85 * @return T old value 86 * 87 * @exception InvalidOp_exception thrown when the tss is not properly initialized 88 */ set(T value)89 T set(T value) const { 90 91 T oldValue = get(); 92 pthread_setspecific(_key, value); 93 94 return oldValue; 95 96 } 97 98 }; 99 100 } 101 102 #endif 103 104 105