From dd1322385bc6939ed7aba53f917078081e062855 Mon Sep 17 00:00:00 2001 From: Fred Nicolson Date: Fri, 23 Nov 2018 15:59:53 +0000 Subject: [PATCH] Return opaque data when socket is removed --- include/frnetlib/SocketSelector.h | 3 ++- src/SocketSelector.cpp | 10 ++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/include/frnetlib/SocketSelector.h b/include/frnetlib/SocketSelector.h index b39e012..d548b17 100644 --- a/include/frnetlib/SocketSelector.h +++ b/include/frnetlib/SocketSelector.h @@ -49,8 +49,9 @@ namespace fr * * @throws An std::exception on failure * @param socket The socket to remove. Must not be disconnected. + * @return The opaque data passed to add(). Or nullptr if the socket wasn't found. */ - void remove(const std::shared_ptr &socket); + void *remove(const std::shared_ptr &socket); private: #ifndef _WIN32 diff --git a/src/SocketSelector.cpp b/src/SocketSelector.cpp index 5e6f2c6..4457ca5 100644 --- a/src/SocketSelector.cpp +++ b/src/SocketSelector.cpp @@ -89,7 +89,7 @@ namespace fr return ret; } - void SocketSelector::remove(const std::shared_ptr &socket) + void *SocketSelector::remove(const std::shared_ptr &socket) { auto descriptor = socket->get_socket_descriptor(); if(!socket->connected()) @@ -97,20 +97,22 @@ namespace fr throw std::runtime_error("Can't remove disconnected socket"); } + auto iter = added_sockets.find(descriptor); if(iter == added_sockets.end()) { - return; + return nullptr; } added_sockets.erase(iter); epoll_event event = {0}; if(epoll_ctl(epoll_fd, EPOLL_CTL_DEL, descriptor, &event) < 0) { - throw std::runtime_error( - "Failed to remove socket: " + std::to_string(descriptor) + ". Errno: " + std::to_string(errno)); + throw std::runtime_error("Failed to remove socket: " + std::to_string(descriptor) + ". Errno: " + std::to_string(errno)); } + void *opaque = ((Opaque*)event.data.ptr)->opaque; delete static_cast(event.data.ptr); + return opaque; } #endif