00001 // -*- C++ -*- 00002 // 00003 // $Id: TSS_T.inl 91124 2010-07-19 11:54:35Z vzykov $ 00004 00005 #include "ace/Thread.h" 00006 #include "ace/Log_Msg.h" 00007 00008 ACE_BEGIN_VERSIONED_NAMESPACE_DECL 00009 00010 #if !(defined (ACE_HAS_THREADS) && (defined (ACE_HAS_THREAD_SPECIFIC_STORAGE) || defined (ACE_HAS_TSS_EMULATION))) 00011 00012 template <class TYPE> ACE_INLINE 00013 ACE_TSS<TYPE>::ACE_TSS (TYPE *type) 00014 : type_ (type) 00015 { 00016 } 00017 00018 template <class TYPE> ACE_INLINE int 00019 ACE_TSS<TYPE>::ts_init (void) 00020 { 00021 return 0; 00022 } 00023 00024 template <class TYPE> ACE_INLINE TYPE * 00025 ACE_TSS<TYPE>::ts_object (void) const 00026 { 00027 return this->type_; 00028 } 00029 00030 template <class TYPE> ACE_INLINE TYPE * 00031 ACE_TSS<TYPE>::ts_object (TYPE *type) 00032 { 00033 this->type_ = type; 00034 return this->type_; 00035 } 00036 00037 template <class TYPE> ACE_INLINE TYPE * 00038 ACE_TSS<TYPE>::ts_get (void) const 00039 { 00040 return this->type_; 00041 } 00042 00043 #else 00044 00045 # if defined (ACE_HAS_THR_C_DEST) 00046 template <class TYPE> ACE_INLINE ACE_TSS_Adapter * 00047 ACE_TSS<TYPE>::ts_value (void) const 00048 { 00049 // Get the tss adapter from thread-specific storage 00050 void *temp = 0; 00051 if (ACE_Thread::getspecific (this->key_, &temp) == -1) 00052 { 00053 return 0; // This should not happen! 00054 } 00055 return static_cast <ACE_TSS_Adapter *> (temp); 00056 } 00057 # else 00058 template <class TYPE> ACE_INLINE TYPE * 00059 ACE_TSS<TYPE>::ts_value (void) const 00060 { 00061 void *temp = 0; 00062 if (ACE_Thread::getspecific (this->key_, &temp) == -1) 00063 { 00064 return 0; // This should not happen! 00065 } 00066 return static_cast <TYPE *> (temp); 00067 } 00068 # endif /* ACE_HAS_THR_C_DEST */ 00069 00070 # if defined (ACE_HAS_THR_C_DEST) 00071 template <class TYPE> ACE_INLINE int 00072 ACE_TSS<TYPE>::ts_value (ACE_TSS_Adapter *new_tss_adapter) const 00073 { 00074 if (ACE_Thread::setspecific (this->key_, 00075 (void *) new_tss_adapter) != 0) 00076 { 00077 ACE_ERROR ((LM_ERROR, 00078 ACE_TEXT ("%p\n"), 00079 ACE_TEXT ("ACE_Thread::setspecific() failed!"))); 00080 return -1; 00081 } 00082 00083 return 0; 00084 } 00085 # else 00086 template <class TYPE> ACE_INLINE int 00087 ACE_TSS<TYPE>::ts_value (TYPE *new_ts_obj) const 00088 { 00089 if (ACE_Thread::setspecific (this->key_, (void *) new_ts_obj) != 0) 00090 { 00091 ACE_ERROR ((LM_ERROR, 00092 ACE_TEXT ("%p\n"), 00093 ACE_TEXT ("ACE_Thread::setspecific() failed!"))); 00094 return -1; 00095 } 00096 00097 return 0; 00098 } 00099 # endif /* ACE_HAS_THR_C_DEST */ 00100 00101 #endif /* ! (defined (ACE_HAS_THREADS) && (defined (ACE_HAS_THREAD_SPECIFIC_STORAGE) || defined (ACE_HAS_TSS_EMULATION))) */ 00102 00103 ACE_END_VERSIONED_NAMESPACE_DECL