forked from song0071000/SimpleReactorImplemention
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreactor.cc
118 lines (93 loc) · 2.84 KB
/
reactor.cc
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
#include <assert.h>
#include "reactor.h"
#include "event_demultiplexer.h"
#define INITSIZE 100
namespace reactor
{
class ReactorImplementation
{
public:
ReactorImplementation();
~ReactorImplementation();
int RegisterHandler(EventHandler * handler, event_t evt);
int RemoveHandler(EventHandler * handler);
void HandleEvents();
int RegisterTimerTask(heap_timer* timerevent);
private:
EventDemultiplexer * m_demultiplexer;
std::map<handle_t, EventHandler *> m_handlers;
time_heap* m_eventtimer;
};
///////////////////////////////////////////////////////////////////////////////
Reactor::Reactor()
{
m_reactor_impl = new ReactorImplementation();
}
Reactor::~Reactor()
{
delete m_reactor_impl;
}
int Reactor::RegisterHandler(EventHandler * handler, event_t evt)
{
return m_reactor_impl->RegisterHandler(handler, evt);
}
int Reactor::RemoveHandler(EventHandler * handler)
{
return m_reactor_impl->RemoveHandler(handler);
}
void Reactor::HandleEvents()
{
m_reactor_impl->HandleEvents();
}
int Reactor::RegisterTimerTask(heap_timer* timerevent)
{
return m_reactor_impl->RegisterTimerTask(timerevent);
}
///////////////////////////////////////////////////////////////////////////////
ReactorImplementation::ReactorImplementation()
{
m_demultiplexer = new EpollDemultiplexer();
m_eventtimer = new time_heap(INITSIZE);
}
ReactorImplementation::~ReactorImplementation()
{
delete m_demultiplexer;
}
int ReactorImplementation::RegisterHandler(EventHandler * handler, event_t evt)
{
handle_t handle = handler->GetHandle();
std::map<handle_t, EventHandler *>::iterator it = m_handlers.find(handle);
if (it == m_handlers.end())
{
m_handlers[handle] = handler;
}
return m_demultiplexer->RequestEvent(handle, evt);
}
int ReactorImplementation::RemoveHandler(EventHandler * handler)
{
handle_t handle = handler->GetHandle();
m_handlers.erase(handle);
return m_demultiplexer->UnrequestEvent(handle);
}
//parm timeout is useless.
void ReactorImplementation::HandleEvents()
{
int timeout = 0;
if (m_eventtimer->top() == NULL)
{
timeout = 0;
}
else
{
timeout = ((m_eventtimer->top())->expire - time(NULL)) * 1000;
}
m_demultiplexer->WaitEvents(&m_handlers, timeout, m_eventtimer);
}
int ReactorImplementation::RegisterTimerTask(heap_timer* timerevent)
{
if (timerevent == NULL)
return -1;
m_eventtimer->add_timer(timerevent);
return 0;
}
} // namespace reactor