summaryrefslogtreecommitdiff
path: root/ACE/ace/TSS_T.inl
diff options
context:
space:
mode:
authorvzykov <vzykov@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2010-07-19 11:54:35 +0000
committervzykov <vzykov@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2010-07-19 11:54:35 +0000
commita8ca21aba7cf066d08d1b04ff2c35171714ce579 (patch)
tree7e3d8820419a01b69e7a3a7e04fd30895f6a9587 /ACE/ace/TSS_T.inl
parent45dd49dd4fe0a3bf6334bc3ffb6f18a1aa54bdcd (diff)
downloadATCD-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.inl67
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