summaryrefslogtreecommitdiff
path: root/ACE/tests/Log_Thread_Inheritance_Test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/tests/Log_Thread_Inheritance_Test.cpp')
-rw-r--r--ACE/tests/Log_Thread_Inheritance_Test.cpp127
1 files changed, 127 insertions, 0 deletions
diff --git a/ACE/tests/Log_Thread_Inheritance_Test.cpp b/ACE/tests/Log_Thread_Inheritance_Test.cpp
new file mode 100644
index 00000000000..ae630c319c0
--- /dev/null
+++ b/ACE/tests/Log_Thread_Inheritance_Test.cpp
@@ -0,0 +1,127 @@
+// $Id$
+
+#include "test_config.h"
+#include "ace/Log_Msg.h"
+#include "ace/Task.h"
+#include <fstream>
+
+#ifdef ACE_HAS_PTHREADS
+# include <pthread.h>
+#endif /* ACE_HAS_PTHREADS */
+
+#if !defined (ACE_HAS_THREADS) || defined (ACE_LACKS_IOSTREAM_TOTALLY)
+int run_main (int, ACE_TCHAR *[])
+{
+ return 0;
+}
+#else
+
+#ifdef ACE_HAS_PTHREADS
+struct Inheritor : ACE_Task_Base
+{
+ int svc ()
+ {
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) - this test might crash ACE if it does not "
+ "have the fix for the second bug in #3480.\n"));
+ return 0;
+ }
+};
+
+extern "C"
+void* spawn_ace_task (void*)
+{
+ Inheritor inheritor;
+
+ inheritor.activate ();
+ inheritor.wait ();
+
+ return 0;
+}
+
+bool test_inherited_attributes ()
+{
+ // This test verifies ACE_OS_Log_Msg_Attributes correctly initializes
+ // when an ACE thread is created from a non-ACE thread (i.e. pthreads)
+ // and is then used for logging.
+ //
+ // This test will cause occasional SEGVs on failure.
+ // stallions 2009/02/05
+ pthread_t parent;
+
+ if (pthread_create (&parent, 0, spawn_ace_task, 0) != 0)
+ {
+ return false;
+ }
+ pthread_join (parent, 0);
+
+ return true;
+}
+#endif /* ACE_HAS_PTHREADS */
+
+struct MyThread : ACE_Task_Base
+{
+
+ enum { THREAD_DEFAULTS = THR_NEW_LWP|THR_JOINABLE|THR_INHERIT_SCHED };
+
+ explicit MyThread (bool openfile = false)
+ : openfile_ (openfile) {}
+
+ bool openfile_;
+ static MyThread childthread_;
+
+ int svc ()
+ {
+ if (openfile_)
+ {
+ ACE_LOG_MSG->msg_ostream (
+ new std::ofstream (
+ ACE_TEXT_ALWAYS_CHAR (
+ ACE_LOG_DIRECTORY
+ ACE_TEXT ("Log_Thread_Inheritance_Ostream")
+ ACE_LOG_FILE_EXT_NAME
+ )
+ ), true);
+ ACE_LOG_MSG->set_flags (ACE_Log_Msg::OSTREAM);
+ ACE_LOG_MSG->clr_flags (ACE_Log_Msg::STDERR | ACE_Log_Msg::LOGGER);
+ MyThread ends_first_thread;
+ ends_first_thread.activate (THREAD_DEFAULTS, 10);
+ ends_first_thread.wait ();
+ childthread_.activate (THREAD_DEFAULTS, 10);
+ }
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) - in svc() openfile_ is %C\n",
+ (openfile_ ? "true" : "false")));
+ if (!openfile_)
+ {
+ for (int i = 0; i < 100; ++i)
+ {
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) - loop %d\n", i));
+ if (!(i % 10)) ACE_OS::thr_yield ();
+ }
+ }
+ return 0;
+ }
+};
+
+MyThread MyThread::childthread_;
+
+int run_main (int, ACE_TCHAR *[])
+{
+ ACE_START_TEST (ACE_TEXT ("Log_Thread_Inheritance_Test"));
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) - in run_main()\n"));
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) - this test will crash ACE if it does not "
+ "have the fix for bug #3480.\n"));
+ ACE_OSTREAM_TYPE *initial_stream = ACE_LOG_MSG->msg_ostream ();
+ MyThread mt (true);
+ mt.activate ();
+ mt.wait ();
+ MyThread::childthread_.wait ();
+ ACE_LOG_MSG->msg_ostream (initial_stream, 0);
+#ifdef ACE_HAS_PTHREADS
+ if (!test_inherited_attributes ()) return -1;
+#endif /* ACE_HAS_PTHREADS */
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) - Test passed.\n"));
+ ACE_END_TEST;
+ return 0;
+}
+
+#endif