Revert "Minor modernization of DynamicAny code"
[ACE_TAO.git] / TAO / tests / Bug_3542_Regression / DllOrb.cpp
blob0747038f24c787a0e5b821e489a1f0aee385f221
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"
7 DllOrb::DllOrb ()
9 ma_barrier_(),
10 mv_orb_ (),
11 mv_rootPOA_ ()
15 DllOrb::~DllOrb ()
19 int
20 DllOrb::init (int argc, ACE_TCHAR *argv[])
22 int threadCnt = 1;
24 try
26 ACE_Arg_Shifter as (argc, argv);
27 const ACE_TCHAR *currentArg = 0;
28 while (as.is_anything_left ())
30 if (0 != (currentArg = as.get_the_parameter (ACE_TEXT ("-NumThreads"))))
32 int num = ACE_OS::atoi (currentArg);
33 if (num >= 1)
34 threadCnt = num;
35 as.consume_arg ();
37 else
38 as.ignore_arg ();
41 // Initialize the ORB
42 mv_orb_ = CORBA::ORB_init (argc, argv);
43 if (CORBA::is_nil (mv_orb_.in ()))
45 ACE_DEBUG ((LM_ERROR, ACE_TEXT ("nil ORB\n")));
46 return -1;
49 CORBA::Object_var v_poa =
50 mv_orb_->resolve_initial_references ("RootPOA");
52 mv_rootPOA_ = PortableServer::POA::_narrow (v_poa.in ());
53 if (CORBA::is_nil (mv_rootPOA_.in ()))
55 ACE_DEBUG ((LM_ERROR, ACE_TEXT ("nil RootPOA\n")));
56 return -1;
59 mv_poaManager_ = mv_rootPOA_->the_POAManager ();
60 if (CORBA::is_nil (mv_poaManager_.in ()))
62 ACE_DEBUG ((LM_ERROR, ACE_TEXT ("nil POAManager\n")));
63 return -1;
66 mv_poaManager_->activate ();
68 catch (...)
70 ACE_DEBUG ((LM_ERROR, ACE_TEXT ("ERROR: exception\n")));
71 return -1;
74 ma_barrier_.reset (new ACE_Thread_Barrier (threadCnt + 1));
76 this->activate(
77 THR_NEW_LWP|THR_JOINABLE|THR_INHERIT_SCHED,
78 threadCnt);
79 ACE_DEBUG ((LM_INFO, ACE_TEXT ("init mp_barrier->wait() ...\n")));
80 ma_barrier_->wait();
81 ACE_DEBUG ((LM_INFO, ACE_TEXT ("init mp_barrier->wait() done\n")));
83 return 0;
87 int
88 DllOrb::fini ()
90 try
92 mv_poaManager_->deactivate (1, 1);
93 mv_poaManager_ = PortableServer::POAManager::_nil ();
95 // attempt to protect against sporadic BAD_INV_ORDER exceptions
96 ACE_OS::sleep (ACE_Time_Value (0, 500));
98 mv_orb_->shutdown (true);
100 ACE_DEBUG ((LM_ERROR, ACE_TEXT ("wait() ...\n")));
101 // wait for our threads to finish
102 wait();
103 ACE_DEBUG ((LM_ERROR, ACE_TEXT ("wait() done\n")));
105 ma_barrier_.reset ();
107 catch (...)
109 ACE_DEBUG ((LM_ERROR, ACE_TEXT ("ERROR: exception\n")));
110 return -1;
115 mv_orb_->destroy ();
116 mv_orb_ = CORBA::ORB::_nil ();
118 catch (const CORBA::Exception& ex)
120 ex._tao_print_exception ("Exception caught:");
121 return -1;
124 return 0;
128 int DllOrb::svc ()
130 ACE_DEBUG ((LM_INFO, ACE_TEXT ("svc mp_barrier->wait() ...\n")));
131 ma_barrier_->wait();
132 ACE_DEBUG ((LM_INFO, ACE_TEXT ("svc mp_barrier->wait() done\n")));
136 ACE_DEBUG ((LM_INFO, ACE_TEXT ("mv_orb->run ...\n")));
139 mv_orb_->run();
140 ACE_DEBUG ((LM_INFO, ACE_TEXT ("mv_orb->run returned\n")));
142 catch(CORBA::BAD_INV_ORDER const & rc_ex)
144 const CORBA::ULong VMCID = rc_ex.minor() & 0xFFFFF000U;
145 const CORBA::ULong minorCode = rc_ex.minor() & 0xFFFU;
146 if (VMCID == CORBA::OMGVMCID && minorCode == 4)
148 ACE_DEBUG ((LM_INFO, ACE_TEXT ("ignored 'CORBA::BAD_INV_ORDER: ORB has shutdown.'\n")));
150 else
152 throw;
155 ACE_DEBUG ((LM_INFO, ACE_TEXT ("mv_orb->run done\n")));
157 catch(...)
159 ACE_DEBUG ((LM_INFO, ACE_TEXT ("Exception\n")));
160 return -1;
163 return 0;
167 ACE_FACTORY_DEFINE (bug_3542, DllOrb)