Skip to content

Commit e93ec4e

Browse files
author
hamid
committed
Separate timer_watcher into a class
1 parent ee491ae commit e93ec4e

File tree

5 files changed

+71
-42
lines changed

5 files changed

+71
-42
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ link_directories("/usr/local/lib")
3131

3232

3333
add_library(event_loop
34+
${PROJECT_SOURCE_DIR}/event_loop/timer_watcher.cpp
3435
${PROJECT_SOURCE_DIR}/event_loop/socket_watcher.cpp
3536
${PROJECT_SOURCE_DIR}/event_loop/event_loop_ev.cpp)
3637

includes/libevpp/event_loop/event_loop_ev.h

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,18 @@
11
#pragma once
22

33
#include "../event_loop/socket_watcher.h"
4+
#include "../event_loop/timer_watcher.h"
45
#include <memory>
56

67
namespace libevpp {
78
namespace event_loop
89
{
9-
typedef std::function<bool ()> timer_action;
1010

1111
class event_loop_ev
1212
{
1313
public:
1414
using socket_identifier_t = std::unique_ptr<socket_watcher>;
1515

16-
private:
17-
struct timer_watcher
18-
{
19-
timer_action timeout_cb;
20-
ev_timer timer;
21-
double time_;
22-
struct ev_loop* loop_;
23-
24-
timer_watcher(struct ev_loop* loop, double time, timer_action&& cb)
25-
: timeout_cb(std::move(cb)), time_(time), loop_(loop)
26-
{
27-
ev_timer_init (&timer, &event_loop_ev::timer_handler, time, 0.);
28-
timer.data = this;
29-
}
30-
31-
void start() {
32-
ev_timer_start (loop_, &timer);
33-
}
34-
35-
void repeat() {
36-
timer.repeat = time_;
37-
ev_timer_again(loop_, &timer);
38-
}
39-
40-
~timer_watcher() {
41-
ev_timer_stop(loop_, &timer);
42-
}
43-
};
44-
45-
4616
public:
4717
event_loop_ev();
4818
event_loop_ev(struct ev_loop *);
@@ -56,8 +26,6 @@ namespace libevpp {
5626
bool async_read(socket_identifier_t& id, action&& cb);
5727
void async_timeout(double time, timer_action&& cb );
5828

59-
private:
60-
static void timer_handler(EV_P_ ev_timer* w, int revents);
6129

6230
private:
6331
struct ev_loop* loop_;
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#pragma once
2+
3+
#include <ev.h>
4+
#include <functional>
5+
6+
namespace libevpp {
7+
namespace event_loop {
8+
9+
typedef std::function<bool ()> timer_action;
10+
11+
class timer_watcher
12+
{
13+
public:
14+
timer_watcher(struct ev_loop* loop, double time, timer_action&& cb);
15+
~timer_watcher();
16+
17+
void start();
18+
void repeat();
19+
20+
private:
21+
static void timer_handler(EV_P_ ev_timer* w, int revents);
22+
23+
private:
24+
timer_action timeout_cb;
25+
ev_timer timer;
26+
double time_;
27+
struct ev_loop* loop_;
28+
};
29+
30+
31+
}
32+
}

src/event_loop/event_loop_ev.cpp

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,6 @@ void event_loop_ev::async_timeout(double time, timer_action&& cb )
4242
w->start();
4343
}
4444

45-
void event_loop_ev::timer_handler(EV_P_ ev_timer* w, int revents)
46-
{
47-
timer_watcher *watcher = reinterpret_cast<timer_watcher*>(w->data);
48-
if (!watcher->timeout_cb()) {
49-
delete watcher;
50-
return;
51-
}
52-
watcher->repeat();
53-
}
5445

5546

5647
event_loop_ev::socket_identifier_t event_loop_ev::watch(int fd)

src/event_loop/timer_watcher.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#include <libevpp/event_loop/timer_watcher.h>
2+
3+
namespace libevpp {
4+
namespace event_loop {
5+
6+
timer_watcher::timer_watcher(struct ev_loop* loop, double time, timer_action&& cb)
7+
: timeout_cb(std::move(cb)), time_(time), loop_(loop)
8+
{
9+
ev_timer_init (&timer, &timer_watcher::timer_handler, time, 0.);
10+
timer.data = this;
11+
}
12+
13+
timer_watcher::~timer_watcher() {
14+
ev_timer_stop(loop_, &timer);
15+
}
16+
17+
void timer_watcher::start() {
18+
ev_timer_start (loop_, &timer);
19+
}
20+
21+
void timer_watcher::repeat() {
22+
timer.repeat = time_;
23+
ev_timer_again(loop_, &timer);
24+
}
25+
26+
void timer_watcher::timer_handler(EV_P_ ev_timer* w, int revents)
27+
{
28+
timer_watcher *watcher = reinterpret_cast<timer_watcher*>(w->data);
29+
if (!watcher->timeout_cb()) {
30+
delete watcher;
31+
return;
32+
}
33+
watcher->repeat();
34+
}
35+
36+
}
37+
}

0 commit comments

Comments
 (0)