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