Return opaque data when socket is removed
This commit is contained in:
parent
dc247c556d
commit
dd1322385b
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user