From a0ebd444ad52e00d23abca606819257fcb48889b Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 15 Jan 2013 22:48:38 +0100 Subject: [PATCH] event/SocketMonitor: add method Open() Allow creating a closed SocketMonitor instance. --- src/event/SocketMonitor.cxx | 31 ++++++++++++++++++++++--------- src/event/SocketMonitor.hxx | 5 +++++ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/event/SocketMonitor.cxx b/src/event/SocketMonitor.cxx index ec31647f2..b75dc72a4 100644 --- a/src/event/SocketMonitor.cxx +++ b/src/event/SocketMonitor.cxx @@ -74,16 +74,11 @@ static GSourceFuncs socket_monitor_source_funcs = { }; SocketMonitor::SocketMonitor(int _fd, EventLoop &_loop) - :fd(_fd), loop(_loop), - source((Source *)g_source_new(&socket_monitor_source_funcs, - sizeof(*source))), - poll{fd, 0, 0} { - assert(fd >= 0); + :fd(-1), loop(_loop), + source(nullptr) { + assert(_fd >= 0); - source->monitor = this; - - g_source_attach(&source->base, loop.GetContext()); - g_source_add_poll(&source->base, &poll); + Open(_fd); } SocketMonitor::~SocketMonitor() @@ -92,6 +87,24 @@ SocketMonitor::~SocketMonitor() Close(); } +void +SocketMonitor::Open(int _fd) +{ + assert(fd < 0); + assert(source == nullptr); + assert(_fd >= 0); + + fd = _fd; + poll = {fd, 0, 0}; + + source = (Source *)g_source_new(&socket_monitor_source_funcs, + sizeof(*source)); + source->monitor = this; + + g_source_attach(&source->base, loop.GetContext()); + g_source_add_poll(&source->base, &poll); +} + void SocketMonitor::Close() { diff --git a/src/event/SocketMonitor.hxx b/src/event/SocketMonitor.hxx index ca3c5dcc4..236e5fbda 100644 --- a/src/event/SocketMonitor.hxx +++ b/src/event/SocketMonitor.hxx @@ -54,6 +54,9 @@ public: static constexpr unsigned ERROR = G_IO_ERR; static constexpr unsigned HANGUP = G_IO_HUP; + SocketMonitor(EventLoop &_loop) + :fd(-1), loop(_loop), source(nullptr) {} + SocketMonitor(int _fd, EventLoop &_loop); ~SocketMonitor(); @@ -68,6 +71,8 @@ public: return fd; } + void Open(int _fd); + void Close(); void Schedule(unsigned flags) {