More tests update
[ACE_TAO.git] / TAO / tests / Bug_3251_Regression / DllOrb.cpp
blob3b52249e2b15a25be97e9245701089dc3119850a
1 #include "DllOrb.h"
2 #include "ace/Arg_Shifter.h"
3 #include "ace/Argv_Type_Converter.h"
4 #include "ace/OS_NS_unistd.h"
5 #include "tao/TAO_Singleton_Manager.h"
8 DllOrb::DllOrb (void)
10 ma_barrier_(),
11 mv_orb_ (),
12 mv_rootPOA_ ()
17 DllOrb::~DllOrb (void)
22 int
23 DllOrb::init (int argc, ACE_TCHAR *argv[])
25 int threadCnt = 1;
27 try
29 ACE_Arg_Shifter as (argc, argv);
30 const ACE_TCHAR *currentArg = 0;
31 while (as.is_anything_left ())
33 if (0 != (currentArg = as.get_the_parameter (ACE_TEXT ("-NumThreads"))))
35 int num = ACE_OS::atoi (currentArg);
36 if (num >= 1)
37 threadCnt = num;
38 as.consume_arg ();
40 else
41 as.ignore_arg ();
44 // Initialize the ORB
45 mv_orb_ = CORBA::ORB_init (argc, argv);
46 if (CORBA::is_nil (mv_orb_.in ()))
48 ACE_DEBUG ((LM_ERROR, ACE_TEXT ("nil ORB\n")));
49 return -1;
52 CORBA::Object_var v_poa =
53 mv_orb_->resolve_initial_references ("RootPOA");
55 mv_rootPOA_ = PortableServer::POA::_narrow (v_poa.in ());
56 if (CORBA::is_nil (mv_rootPOA_.in ()))
58 ACE_DEBUG ((LM_ERROR, ACE_TEXT ("nil RootPOA\n")));
59 return -1;
62 mv_poaManager_ = mv_rootPOA_->the_POAManager ();
63 if (CORBA::is_nil (mv_poaManager_.in ()))
65 ACE_DEBUG ((LM_ERROR, ACE_TEXT ("nil POAManager\n")));
66 return -1;
69 mv_poaManager_->activate ();
71 catch (...)
73 ACE_DEBUG ((LM_ERROR, ACE_TEXT ("ERROR: exception\n")));
74 return -1;
77 ACE_auto_ptr_reset (ma_barrier_, new ACE_Thread_Barrier (threadCnt + 1));
79 this->activate(
80 THR_NEW_LWP|THR_JOINABLE|THR_INHERIT_SCHED,
81 threadCnt
83 ACE_DEBUG ((LM_INFO, ACE_TEXT ("init mp_barrier->wait() ...\n")));
84 ma_barrier_->wait();
85 ACE_DEBUG ((LM_INFO, ACE_TEXT ("init mp_barrier->wait() done\n")));
87 return 0;
91 int
92 DllOrb::fini (void)
94 try
96 mv_poaManager_->deactivate (1, 1);
97 mv_poaManager_ = PortableServer::POAManager::_nil ();
99 // attempt to protect against sporadic BAD_INV_ORDER exceptions
100 ACE_OS::sleep (ACE_Time_Value (0, 500));
102 mv_orb_->shutdown (1);
104 ACE_DEBUG ((LM_ERROR, ACE_TEXT ("wait() ...\n")));
105 // wait for our threads to finish
106 wait();
107 ACE_DEBUG ((LM_ERROR, ACE_TEXT ("wait() done\n")));
109 ACE_auto_ptr_reset (ma_barrier_, static_cast<ACE_Thread_Barrier *> (0));
111 catch (...)
113 ACE_DEBUG ((LM_ERROR, ACE_TEXT ("ERROR: exception\n")));
114 return -1;
119 mv_orb_->destroy ();
120 mv_orb_ = CORBA::ORB::_nil ();
122 catch (const CORBA::Exception& ex)
124 ex._tao_print_exception ("Exception caught:");
125 return -1;
128 return 0;
132 int DllOrb::svc (void)
134 ACE_DEBUG ((LM_INFO, ACE_TEXT ("svc mp_barrier->wait() ...\n")));
135 ma_barrier_->wait();
136 ACE_DEBUG ((LM_INFO, ACE_TEXT ("svc mp_barrier->wait() done\n")));
140 ACE_DEBUG ((LM_INFO, ACE_TEXT ("mv_orb->run ...\n")));
143 mv_orb_->run();
144 ACE_DEBUG ((LM_INFO, ACE_TEXT ("mv_orb->run returned\n")));
146 catch(CORBA::BAD_INV_ORDER const & rc_ex)
148 const CORBA::ULong VMCID = rc_ex.minor() & 0xFFFFF000U;
149 const CORBA::ULong minorCode = rc_ex.minor() & 0xFFFU;
150 if (VMCID == CORBA::OMGVMCID && minorCode == 4)
152 ACE_DEBUG ((LM_INFO, ACE_TEXT ("ignored 'CORBA::BAD_INV_ORDER: ORB has shutdown.'\n")));
154 else
156 throw;
159 ACE_DEBUG ((LM_INFO, ACE_TEXT ("mv_orb->run done\n")));
161 catch(...)
163 ACE_DEBUG ((LM_INFO, ACE_TEXT ("Exception\n")));
164 return -1;
167 return 0;
168 } /* end of DllOrb::svc ( ) */
171 ACE_FACTORY_DEFINE (bug_3251, DllOrb)