diff options
Diffstat (limited to 'src/event/SocketMonitor.cxx')
-rw-r--r-- | src/event/SocketMonitor.cxx | 31 |
1 files changed, 22 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() @@ -93,6 +88,24 @@ SocketMonitor::~SocketMonitor() } 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() { assert(IsDefined()); |