diff options
author | vzykov <vzykov@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2010-07-19 11:54:35 +0000 |
---|---|---|
committer | vzykov <vzykov@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2010-07-19 11:54:35 +0000 |
commit | a8ca21aba7cf066d08d1b04ff2c35171714ce579 (patch) | |
tree | 7e3d8820419a01b69e7a3a7e04fd30895f6a9587 /ACE/ace/TSS_T.inl | |
parent | 45dd49dd4fe0a3bf6334bc3ffb6f18a1aa54bdcd (diff) | |
download | ATCD-a8ca21aba7cf066d08d1b04ff2c35171714ce579.tar.gz |
Mon Jul 19 11:50:59 UTC 2010 Vladimir Zykov <vladimir.zykov@prismtech.com>
* ace/TSS_T.inl:
* ace/TSS_T.h:
* ace/TSS_T.cpp:
Mostly fixed bug 3539. It doesn't fix a case when main thread
doesn't own ACE_TSS but still uses it. Fixing the later is not
straight forward and will require a lot more efforts.
Also rearranged the code so that it has less duplicates.
* tests/run_test.lst:
Marked the test as fixed.
Diffstat (limited to 'ACE/ace/TSS_T.inl')
-rw-r--r-- | ACE/ace/TSS_T.inl | 67 |
1 files changed, 64 insertions, 3 deletions
diff --git a/ACE/ace/TSS_T.inl b/ACE/ace/TSS_T.inl index 1d74573c658..a6351ec6448 100644 --- a/ACE/ace/TSS_T.inl +++ b/ACE/ace/TSS_T.inl @@ -2,10 +2,13 @@ // // $Id$ -#if !(defined (ACE_HAS_THREADS) && (defined (ACE_HAS_THREAD_SPECIFIC_STORAGE) || defined (ACE_HAS_TSS_EMULATION))) +#include "ace/Thread.h" +#include "ace/Log_Msg.h" ACE_BEGIN_VERSIONED_NAMESPACE_DECL +#if !(defined (ACE_HAS_THREADS) && (defined (ACE_HAS_THREAD_SPECIFIC_STORAGE) || defined (ACE_HAS_TSS_EMULATION))) + template <class TYPE> ACE_INLINE ACE_TSS<TYPE>::ACE_TSS (TYPE *type) : type_ (type) @@ -13,7 +16,7 @@ ACE_TSS<TYPE>::ACE_TSS (TYPE *type) } template <class TYPE> ACE_INLINE int -ACE_TSS<TYPE>::ts_init (void) +ACE_TSS<TYPE>::ts_init (void) { return 0; } @@ -37,6 +40,64 @@ ACE_TSS<TYPE>::ts_get (void) const return this->type_; } -ACE_END_VERSIONED_NAMESPACE_DECL +#else + +# if defined (ACE_HAS_THR_C_DEST) +template <class TYPE> ACE_INLINE ACE_TSS_Adapter * +ACE_TSS<TYPE>::ts_value (void) const +{ + // Get the tss adapter from thread-specific storage + void *temp = 0; + if (ACE_Thread::getspecific (this->key_, &temp) == -1) + { + return 0; // This should not happen! + } + return static_cast <ACE_TSS_Adapter *> (temp); +} +# else +template <class TYPE> ACE_INLINE TYPE * +ACE_TSS<TYPE>::ts_value (void) const +{ + void *temp = 0; + if (ACE_Thread::getspecific (this->key_, &temp) == -1) + { + return 0; // This should not happen! + } + return static_cast <TYPE *> (temp); +} +# endif /* ACE_HAS_THR_C_DEST */ + +# if defined (ACE_HAS_THR_C_DEST) +template <class TYPE> ACE_INLINE int +ACE_TSS<TYPE>::ts_value (ACE_TSS_Adapter *new_tss_adapter) const +{ + if (ACE_Thread::setspecific (this->key_, + (void *) new_tss_adapter) != 0) + { + ACE_ERROR ((LM_ERROR, + ACE_TEXT ("%p\n"), + ACE_TEXT ("ACE_Thread::setspecific() failed!"))); + return -1; + } + + return 0; +} +# else +template <class TYPE> ACE_INLINE int +ACE_TSS<TYPE>::ts_value (TYPE *new_ts_obj) const +{ + if (ACE_Thread::setspecific (this->key_, (void *) new_ts_obj) != 0) + { + ACE_ERROR ((LM_ERROR, + ACE_TEXT ("%p\n"), + ACE_TEXT ("ACE_Thread::setspecific() failed!"))); + return -1; + } + + return 0; +} +# endif /* ACE_HAS_THR_C_DEST */ #endif /* ! (defined (ACE_HAS_THREADS) && (defined (ACE_HAS_THREAD_SPECIFIC_STORAGE) || defined (ACE_HAS_TSS_EMULATION))) */ + +ACE_END_VERSIONED_NAMESPACE_DECL |