//============================================================================= /** * @file TSS_Static_Test.cpp * * This program tests the interaction between TSS and thread keys * created during static construction. VxWorks static construction * is quite broken. This test is designed to test changes to work * around a bug in the VxWorks loader that constructs static objects * multiple times. It sounds hard to believe, but I've seen it! * * @author Chad Elliott */ //============================================================================= #include "test_config.h" #include "ace/ACE.h" #include "ace/Init_ACE.h" #include "ace/Thread.h" #if defined (ACE_HAS_TSS_EMULATION) class Some_Object { public: Some_Object (); ~Some_Object (); }; Some_Object::Some_Object () { ACE::init (); // Cause the ACE_Log_Msg to be constructed during static construction ACE_DEBUG ((LM_DEBUG, "")); // Assign something to TSS during static construction ACE_thread_key_t key; if (ACE_Thread::keycreate (&key, 0) == 0) { ACE_Thread::setspecific (key, this); } } Some_Object::~Some_Object () { ACE::fini (); } static Some_Object sobject; int run_main (int, ACE_TCHAR *[]) { ACE_START_TEST (ACE_TEXT ("TSS_Static_Test")); int status = 0; ACE_thread_key_t key; if (ACE_Thread::keycreate (&key, 0) == 0) { void* specific = 0; if (ACE_Thread::getspecific (key, &specific) == 0) { if (specific == 0) { ACE_DEBUG ((LM_DEBUG, "Got back pointer: %x from key: %d. " "Good!\n", (size_t)specific, key)); } else { ++status; ACE_ERROR ((LM_ERROR, "Something (%x) was found in tss " "slot %d.\n" "Nothing should be stored in our " "TSS slot!\n", (size_t)specific, key)); } } else { ++status; ACE_ERROR ((LM_ERROR, "Unable to get the thread specific " "storage.\n")); } } else { ++status; ACE_ERROR ((LM_ERROR, "Unable to create the thread specific " "storage key.\n")); } ACE_END_TEST; return status; } #else int run_main (int, ACE_TCHAR *[]) { ACE_START_TEST (ACE_TEXT ("TSS_Static_Test")); ACE_DEBUG ((LM_INFO, ACE_TEXT ("This test requires TSS Emulation.\n"))); ACE_END_TEST; return 0; } #endif /* ACE_HAS_TSS_EMULATION */