diff options
Diffstat (limited to 'ACE/tests/Bug_3539_Regression_Test.cpp')
-rw-r--r-- | ACE/tests/Bug_3539_Regression_Test.cpp | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/ACE/tests/Bug_3539_Regression_Test.cpp b/ACE/tests/Bug_3539_Regression_Test.cpp new file mode 100644 index 00000000000..469a5403de3 --- /dev/null +++ b/ACE/tests/Bug_3539_Regression_Test.cpp @@ -0,0 +1,125 @@ + +//============================================================================= +/** + * @file Bug_3539_Regression_Test.cpp + * + * $Id$ + * + * This test is similar to TSS_Test but it's a bit simpler and it uses + * ACE_TSS in a main() thread. It uses TSS_Test_Errno.h. + * + * + * @author Vladimir Zykov <vz@prismtech.com> + */ +//============================================================================= + + +#include "test_config.h" +#include "TSS_Test_Errno.h" +#include "ace/Auto_Ptr.h" +#include "ace/TSS_T.h" +#include "ace/Thread_Manager.h" +#include "ace/Atomic_Op_T.h" + +ACE_Atomic_Op<ACE_SYNCH_MUTEX, int> status; + +#if defined (ACE_HAS_THREADS) + +struct ObjectWithTSS +{ +public: + ACE_TSS_TYPE (Errno) tss_; +}; + +// Static variables. +int Errno::flags_; +int Errno::created_; +int Errno::deleted_; +ACE_Thread_Mutex *Errno::lock_ = 0; + +ACE_THR_FUNC_RETURN +check_tss (ObjectWithTSS *o) +{ + if (0 == o) + { + ACE_ERROR ((LM_ERROR, + "Nil object.")); + status = 1; + } + + Errno *e = o->tss_.ts_object (0); + if (0 != e) + { + ACE_ERROR ((LM_ERROR, + "TSS should not have any value yet.")); + status = 2; + } + + e = ACE_TSS_GET (&o->tss_, Errno); + if (0 == e) + { + ACE_ERROR ((LM_ERROR, + "TSS should now have a value.")); + status = 3; + } + + return 0; +} + +// This worker function is the entry point for each thread. +ACE_THR_FUNC_RETURN +worker (void *c) +{ + return check_tss (reinterpret_cast<ObjectWithTSS *> (c)); +} + +#endif /* ACE_HAS_THREADS */ + +int +run_main (int, ACE_TCHAR *[]) +{ + ACE_START_TEST (ACE_TEXT ("Bug_3539_Regression_Test")); + +#if defined (ACE_HAS_THREADS) + Errno::allocate_lock (); + + const u_int threads = ACE_MAX_THREADS; + + { + ObjectWithTSS *o = 0; + ACE_NEW_RETURN (o, ObjectWithTSS, 1); + ACE_Auto_Ptr<ObjectWithTSS> owner (o); + + if (ACE_Thread_Manager::instance ()->spawn_n + (threads, + ACE_THR_FUNC (worker), + o, + THR_BOUND) == -1) + ACE_ERROR_RETURN ((LM_ERROR, + ACE_TEXT ("%p\n"), ACE_TEXT ("spawn_n")), + 1); + + check_tss (o); + + ACE_Thread_Manager::instance ()->wait (); + } + + Errno::deallocate_lock (); + + if (Errno::created () != Errno::deleted ()) + { + ACE_ERROR_RETURN ((LM_ERROR, + ACE_TEXT ("Number created (%d) ") + ACE_TEXT ("!= number deleted (%d)\n"), + Errno::created (), Errno::deleted ()), + 1); + } + +#else /* ACE_HAS_THREADS */ + ACE_ERROR ((LM_INFO, + ACE_TEXT ("threads are not supported on this platform\n"))); +#endif /* ACE_HAS_THREADS */ + + ACE_END_TEST; + return status.value (); +} |