the libev timer no longer takes ownership over the event loop
This commit is contained in:
parent
49337d078d
commit
acd6698db3
|
|
@ -151,6 +151,24 @@ private:
|
||||||
// send the heartbeat
|
// send the heartbeat
|
||||||
connection->heartbeat();
|
connection->heartbeat();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop the timer
|
||||||
|
*/
|
||||||
|
void stop()
|
||||||
|
{
|
||||||
|
// do nothing if it was never set
|
||||||
|
if (_timer.data == nullptr) return;
|
||||||
|
|
||||||
|
// restore loop refcount
|
||||||
|
ev_ref(_loop);
|
||||||
|
|
||||||
|
// stop the timer
|
||||||
|
ev_timer_stop(_loop, &_timer);
|
||||||
|
|
||||||
|
// restore data nullptr to indicate that timer is not set
|
||||||
|
_timer.data = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
|
|
@ -159,6 +177,9 @@ private:
|
||||||
*/
|
*/
|
||||||
Timer(struct ev_loop *loop) : _loop(loop)
|
Timer(struct ev_loop *loop) : _loop(loop)
|
||||||
{
|
{
|
||||||
|
// there is no data yet
|
||||||
|
_timer.data = nullptr;
|
||||||
|
|
||||||
// initialize the libev structure
|
// initialize the libev structure
|
||||||
ev_timer_init(&_timer, callback, 60.0, 60.0);
|
ev_timer_init(&_timer, callback, 60.0, 60.0);
|
||||||
}
|
}
|
||||||
|
|
@ -177,7 +198,7 @@ private:
|
||||||
virtual ~Timer()
|
virtual ~Timer()
|
||||||
{
|
{
|
||||||
// stop the timer
|
// stop the timer
|
||||||
ev_timer_stop(_loop, &_timer);
|
stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -187,6 +208,9 @@ private:
|
||||||
*/
|
*/
|
||||||
void set(TcpConnection *connection, uint16_t timeout)
|
void set(TcpConnection *connection, uint16_t timeout)
|
||||||
{
|
{
|
||||||
|
// stop timer in case it was already set
|
||||||
|
stop();
|
||||||
|
|
||||||
// store the connection in the data "void*"
|
// store the connection in the data "void*"
|
||||||
_timer.data = connection;
|
_timer.data = connection;
|
||||||
|
|
||||||
|
|
@ -195,6 +219,9 @@ private:
|
||||||
|
|
||||||
// and start it
|
// and start it
|
||||||
ev_timer_start(_loop, &_timer);
|
ev_timer_start(_loop, &_timer);
|
||||||
|
|
||||||
|
// the timer should not keep the event loop active
|
||||||
|
ev_unref(_loop);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue