1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
// $Id$
#include "Pulser.h"
#include "CIAO_common.h"
#include "ace/Timer_Queue.h"
#include "ace/Reactor.h"
//=================================================================
PTImpl::Pulser::Pulser (PTImpl::Pulse_Handler *cb)
: active_ (0),
done_ (0),
tid_ (0),
pulser_callback_ (cb)
{
// Nothing
this->reactor (new ACE_Reactor);
}
PTImpl::Pulser::~Pulser ()
{
delete this->reactor ();
this->reactor (0);
}
int
PTImpl::Pulser::open ()
{
return this->activate ();
}
int
PTImpl::Pulser::close ()
{
this->done_ = 1;
this->reactor ()->notify ();
if (CIAO::debug_level () > 0)
ACE_DEBUG ((LM_DEBUG, "Waiting\n"));
return this->wait ();
}
int
PTImpl::Pulser::start (CORBA::Long hertz)
{
if (hertz == 0 || this->active_ != 0) // Not valid
return -1;
long usec = 1000000 / hertz;
this->tid_ = this->reactor ()->schedule_timer (this,
0,
ACE_Time_Value (0, usec),
ACE_Time_Value (0, usec));
this->active_ = 1;
return 0;
}
int
PTImpl::Pulser::stop (void)
{
if (this->active_ == 0) // Not valid.
return -1;
this->reactor ()->cancel_timer (this);
this->active_ = 0;
return 0;
}
int
PTImpl::Pulser::active (void)
{
return this->active_;
}
int
PTImpl::Pulser::handle_close (ACE_HANDLE handle,
ACE_Reactor_Mask close_mask)
{
if (CIAO::debug_level () > 0)
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("[%x] handle = %d, close_mask = %d\n"),
this,
handle,
close_mask));
return 0;
}
int
PTImpl::Pulser::handle_timeout (const ACE_Time_Value &,
const void *)
{
this->pulser_callback_->pulse ();
// ACE_DEBUG ((LM_DEBUG,
// ACE_TEXT ("[%x] with count #%05d timed out at %d.%d!\n"),
// this,
// tv.sec (),
// tv.usec ()));
return 0;
}
int
PTImpl::Pulser::svc (void)
{
this->reactor ()->owner (ACE_OS::thr_self ());
while (!this->done_)
this->reactor ()->handle_events ();
return 0;
}
//=================================================================
|