summaryrefslogtreecommitdiff
path: root/TAO/tests/Bug_1361_Regression/Server_Thread_Pool.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tests/Bug_1361_Regression/Server_Thread_Pool.cpp')
-rw-r--r--TAO/tests/Bug_1361_Regression/Server_Thread_Pool.cpp172
1 files changed, 172 insertions, 0 deletions
diff --git a/TAO/tests/Bug_1361_Regression/Server_Thread_Pool.cpp b/TAO/tests/Bug_1361_Regression/Server_Thread_Pool.cpp
new file mode 100644
index 00000000000..7c497e26d5a
--- /dev/null
+++ b/TAO/tests/Bug_1361_Regression/Server_Thread_Pool.cpp
@@ -0,0 +1,172 @@
+// $Id$
+
+#include "Server_Thread_Pool.h"
+#include "TestC.h"
+#include "ace/OS_NS_unistd.h"
+
+time_t last_success;
+
+int
+Thread_Pool::close (u_long)
+{
+ ACE_DEBUG ((LM_DEBUG,
+ "(%t) worker thread closing down\n"));
+ return 0;
+}
+
+Thread_Pool::Thread_Pool (ACE_Thread_Manager *thr_mgr,
+ int n_threads)
+ : ACE_Task<ACE_SYNCH> (thr_mgr),
+ nt_(n_threads)
+{
+ if (this->activate (THR_NEW_LWP,
+ n_threads) == -1)
+ ACE_ERROR ((LM_ERROR,
+ "%p\n",
+ "activate failed \n"));
+}
+
+Thread_Pool::~Thread_Pool (void)
+{
+}
+
+int
+Thread_Pool::shutdown (void)
+{
+ thr_mgr_->cancel_grp (grp_id_);
+
+ for (int i = 0; i < nt_; i++)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "(%t) eof, sending block for thread=%d\n",
+ i + 1));
+ ACE_Message_Block *mb1;
+ ACE_NEW_RETURN (mb1,
+ ACE_Message_Block ((char*)0),
+ -1);
+ mb1->length (0);
+
+ if (this->put (mb1) == -1)
+ ACE_ERROR ((LM_ERROR,
+ "(%t) %p\n",
+ "put"));
+
+ // this sleep helps to shutdown correctly -> was an error!
+ ACE_OS::sleep (1);
+ }
+
+ return 0;
+}
+
+// Simply enqueue the Message_Block into the end of the queue.
+int
+Thread_Pool::put (Test::Echo_ptr echoptr)
+{
+ char * charData = (char *)echoptr;
+
+ ACE_Message_Block *mb;
+ ACE_NEW_RETURN(mb, ACE_Message_Block(charData), -1);
+ return this->put (mb);
+}
+
+int
+Thread_Pool::put (ACE_Message_Block *mb,
+ ACE_Time_Value *tv)
+{
+ return this->putq (mb, tv);
+}
+
+// Iterate <n_iterations> time printing off a message and "waiting"
+// for all other threads to complete this iteration.
+
+int
+Thread_Pool::svc (void)
+{
+ // Note that the <ACE_Task::svc_run> method automatically adds us to
+ // the Thread_Manager when the thread begins.
+
+ int count = 1;
+
+ // Keep looping, reading a message out of the queue, until we get a
+ // message with a length == 0, which signals us to quit.
+
+ for (;; count++)
+ {
+ ACE_Message_Block *mb;
+
+#if 0
+ ACE_DEBUG ((LM_DEBUG,
+ "(%t) in iteration %d before getq ()\n",
+ count));
+#endif
+
+ if (this->getq (mb) == -1)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "(%t) in iteration %d, got result -1, exiting\n",
+ count));
+ break;
+ }
+
+#if 0
+ if (mb->length() == 0)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "(%t) in iteration %d, got NULL message, exiting\n",
+ count));
+ break;
+ }
+#endif
+
+ Test::Echo_var echo = (Test::Echo_ptr)mb->base();
+
+ // Echo_var is responsible for deallocating this.
+ // mb->release ();
+
+ if (CORBA::is_nil(echo.in()))
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "(%t) in iteration %d, got NULL message, exiting\n",
+ count));
+ break;
+ }
+
+ // Keep calling a few times after receiving exceptions
+ for(int exception_count = 50; exception_count; --exception_count)
+ {
+ try
+ {
+ // keep calling until get an exception
+ while (true)
+ {
+#if 0
+ if (0)
+ {
+ Test::Payload pload (10);
+ pload.length (10);
+ ACE_OS::memset (pload.get_buffer(), pload.length(), 0);
+ echo->echo_payload (pload);
+
+ }
+ else
+#endif /*if 0*/
+ {
+ Test::Payload_var pout;
+ echo->echo_payload_out (pout.out());
+
+ // time_t last_success = ACE_OS::time();
+ }
+ }
+ }
+ catch (const CORBA::Exception&)
+ {
+ // Just forget the exception and continue
+ }
+ }
+
+ }
+
+ // Note that the <ACE_Task::svc_run> method automatically removes us
+ // from the <ACE_Thread_Manager> when the thread exits.
+ return 0;
+}