1 //=============================================================================
5 * Implementation of the server.
7 * @author Alexander Babu Arulanthu <alex@cs.wustl.edu>
8 * @author Michael Kircher <Michael.Kircher@mchp.siemens.de>
10 //=============================================================================
13 #include "tao/ORB_Core.h"
14 #include "tao/PortableServer/PortableServer.h"
15 #include "ace/Reactor.h"
16 #include "ace/Timer_Queue.h"
17 #include "ace/Time_Value.h"
18 #include "ace/OS_NS_sys_time.h"
19 #include "ace/High_Res_Timer.h"
20 #include "ace/Service_Config.h"
23 #if (TAO_HAS_TIME_POLICY == 1)
25 #include "Custom_Time_Policy_Strategy.h"
28 : public ACE_Event_Handler
31 TestHandler (CORBA::ORB_ptr orb
)
32 : orb_ (CORBA::ORB::_duplicate (orb
)),
33 timeout_triggered_ (false)
36 virtual int handle_timeout (const ACE_Time_Value
&tv
,
39 bool trigger_in(const ACE_Time_Value
&delay
);
41 bool timeout_triggered () { return this->timeout_triggered_
; }
45 bool timeout_triggered_
;
48 int TestHandler::handle_timeout (const ACE_Time_Value
&,
51 ACE_DEBUG ((LM_DEBUG
, "TestHandler::handle_timeout - timeout triggered\n"));
52 this->timeout_triggered_
= true;
53 this->orb_
->shutdown (false);
57 bool TestHandler::trigger_in(const ACE_Time_Value
&delay
)
59 return -1 != this->orb_
->orb_core ()->reactor ()->schedule_timer (this, 0, delay
, ACE_Time_Value (0));
63 ACE_TMAIN(int argc
, ACE_TCHAR
*argv
[])
68 if (argc
>1 && argv
[1][0]=='-' && argv
[1][1]=='s')
70 ACE_DEBUG ((LM_DEBUG
, "loading static service\n"));
72 ACE_Service_Config::process_directive (ace_svc_desc_Custom_Time_Policy_Strategy
);
74 for (int i
=2; i
<argc
;++i
)
75 my_argv
.add (argv
[i
]);
77 my_argv
.add (ACE_TEXT ("-ORBSvcConfDirective"));
78 my_argv
.add (ACE_TEXT ("static Time_Policy_Manager \"-ORBTimePolicyStrategy CUSTOM_TIME_POLICY\""), true);
82 for (int i
=0; i
<argc
;++i
)
83 my_argv
.add (argv
[i
]);
86 int my_argc
= my_argv
.argc ();
88 CORBA::ORB_init (my_argc
, my_argv
.argv ());
90 // check if custom policy installed in ORB
91 ACE_Time_Value tv_hr
= ACE_High_Res_Timer::gettimeofday_hr ();
92 ACE_Time_Value tv_orb
= orb
->orb_core ()->reactor ()->timer_queue ()->gettimeofday ();
93 ACE_Time_Value tv_diff
= tv_orb
- tv_hr
;
94 // The custom policy gives an offset of +10s
95 if (tv_diff
.sec () != 10)
97 ACE_ERROR_RETURN ((LM_ERROR
,
98 "Incorrect time offset (%us). Time policy doesn't seem to be loaded\n", tv_diff
.sec ()),
102 CORBA::Object_var poa_object
=
103 orb
->resolve_initial_references("RootPOA");
105 if (CORBA::is_nil (poa_object
.in ()))
106 ACE_ERROR_RETURN ((LM_ERROR
,
107 "Unable to initialize the POA.\n"),
110 PortableServer::POA_var root_poa
=
111 PortableServer::POA::_narrow (poa_object
.in ());
113 PortableServer::POAManager_var poa_manager
=
114 root_poa
->the_POAManager ();
116 poa_manager
->activate ();
118 TestHandler
test_handler (orb
.in ());
120 // trigger in 2 seconds
121 if (!test_handler
.trigger_in (ACE_Time_Value (2, 0)))
122 ACE_ERROR_RETURN ((LM_ERROR
,
123 "Unable to schedule trigger.\n"),
126 // run for max. 4 seconds
127 ACE_Time_Value
timeout (4, 0);
130 root_poa
->destroy (true, // ethernalize objects
131 false); // wait for completion
135 ACE_DEBUG ((LM_DEBUG
, "event loop finished\n"));
137 if (!test_handler
.timeout_triggered ())
139 ACE_DEBUG ((LM_DEBUG
, "timer handler did not trigger\n"));
143 catch (const CORBA::Exception
& ex
)
145 ex
._tao_print_exception ("Caught exception:");
154 ACE_TMAIN(int , ACE_TCHAR
* [])
156 ACE_DEBUG ((LM_INFO
, "TAO built without Time Policy support\n"));
159 #endif /* TAO_HAS_TIME_POLICY != 1 */