Return opaque data when socket is removed

This commit is contained in:
Fred Nicolson 2018-11-23 15:59:53 +00:00
parent dc247c556d
commit dd1322385b
2 changed files with 8 additions and 5 deletions

View File

@ -49,8 +49,9 @@ namespace fr
* *
* @throws An std::exception on failure * @throws An std::exception on failure
* @param socket The socket to remove. Must not be disconnected. * @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<fr::SocketDescriptor> &socket); void *remove(const std::shared_ptr<fr::SocketDescriptor> &socket);
private: private:
#ifndef _WIN32 #ifndef _WIN32

View File

@ -89,7 +89,7 @@ namespace fr
return ret; return ret;
} }
void SocketSelector::remove(const std::shared_ptr<fr::SocketDescriptor> &socket) void *SocketSelector::remove(const std::shared_ptr<fr::SocketDescriptor> &socket)
{ {
auto descriptor = socket->get_socket_descriptor(); auto descriptor = socket->get_socket_descriptor();
if(!socket->connected()) if(!socket->connected())
@ -97,20 +97,22 @@ namespace fr
throw std::runtime_error("Can't remove disconnected socket"); throw std::runtime_error("Can't remove disconnected socket");
} }
auto iter = added_sockets.find(descriptor); auto iter = added_sockets.find(descriptor);
if(iter == added_sockets.end()) if(iter == added_sockets.end())
{ {
return; return nullptr;
} }
added_sockets.erase(iter); added_sockets.erase(iter);
epoll_event event = {0}; epoll_event event = {0};
if(epoll_ctl(epoll_fd, EPOLL_CTL_DEL, descriptor, &event) < 0) if(epoll_ctl(epoll_fd, EPOLL_CTL_DEL, descriptor, &event) < 0)
{ {
throw std::runtime_error( throw std::runtime_error("Failed to remove socket: " + std::to_string(descriptor) + ". Errno: " + std::to_string(errno));
"Failed to remove socket: " + std::to_string(descriptor) + ". Errno: " + std::to_string(errno));
} }
void *opaque = ((Opaque*)event.data.ptr)->opaque;
delete static_cast<Opaque *>(event.data.ptr); delete static_cast<Opaque *>(event.data.ptr);
return opaque;
} }
#endif #endif