fixed TcpServer to close pipes properly upon termination
This commit is contained in:
parent
b2f9abef77
commit
19df0af32a
@ -45,15 +45,6 @@ public:
|
|||||||
TcpServer () QSE_CPP_NOEXCEPT;
|
TcpServer () QSE_CPP_NOEXCEPT;
|
||||||
virtual ~TcpServer () QSE_CPP_NOEXCEPT;
|
virtual ~TcpServer () QSE_CPP_NOEXCEPT;
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
ERR_NONE = 0,
|
|
||||||
ERR_OPEN = 1,
|
|
||||||
ERR_BIND = 2,
|
|
||||||
ERR_LISTEN = 3,
|
|
||||||
ERR_EXCEPTION = 4
|
|
||||||
};
|
|
||||||
|
|
||||||
virtual int start (const qse_char_t* addrs) QSE_CPP_NOEXCEPT;
|
virtual int start (const qse_char_t* addrs) QSE_CPP_NOEXCEPT;
|
||||||
virtual int stop () QSE_CPP_NOEXCEPT;
|
virtual int stop () QSE_CPP_NOEXCEPT;
|
||||||
|
|
||||||
|
@ -106,8 +106,6 @@ void TcpServer::free_all_listeners () QSE_CPP_NOEXCEPT
|
|||||||
Listener* lp;
|
Listener* lp;
|
||||||
struct epoll_event dummy_ev;
|
struct epoll_event dummy_ev;
|
||||||
|
|
||||||
::epoll_ctl (this->listener.ep_fd, EPOLL_CTL_DEL, this->listener.mux_pipe[0], &dummy_ev);
|
|
||||||
|
|
||||||
while (this->listener.head)
|
while (this->listener.head)
|
||||||
{
|
{
|
||||||
lp = this->listener.head;
|
lp = this->listener.head;
|
||||||
@ -119,7 +117,19 @@ void TcpServer::free_all_listeners () QSE_CPP_NOEXCEPT
|
|||||||
delete lp;
|
delete lp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this->listener.mux_pipe[0] >= 0)
|
||||||
|
{
|
||||||
|
::epoll_ctl (this->listener.ep_fd, EPOLL_CTL_DEL, this->listener.mux_pipe[0], &dummy_ev);
|
||||||
|
close (this->listener.mux_pipe[0]);
|
||||||
|
this->listener.mux_pipe[0] = -1;
|
||||||
|
}
|
||||||
|
if (this->listener.mux_pipe[1] >= 0)
|
||||||
|
{
|
||||||
|
close (this->listener.mux_pipe[1]);
|
||||||
|
this->listener.mux_pipe[1] = -1;
|
||||||
|
}
|
||||||
QSE_ASSERT (this->listener.ep_fd >= 0);
|
QSE_ASSERT (this->listener.ep_fd >= 0);
|
||||||
|
|
||||||
::close (this->listener.ep_fd);
|
::close (this->listener.ep_fd);
|
||||||
this->listener.ep_fd = -1;
|
this->listener.ep_fd = -1;
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
static int g_stopreq = 0;
|
|
||||||
|
|
||||||
|
|
||||||
class ClientHandler
|
class ClientHandler
|
||||||
@ -20,16 +20,20 @@ class ClientHandler
|
|||||||
public:
|
public:
|
||||||
int operator() (QSE::Socket* sck, QSE::SocketAddress* addr)
|
int operator() (QSE::Socket* sck, QSE::SocketAddress* addr)
|
||||||
{
|
{
|
||||||
qse_printf (QSE_T("XXXXXXXXXXXXXXXXXXXXXXXXXX\n"));p
|
qse_printf (QSE_T("XXXXXXXXXXXXXXXXXXXXXXXXXX\n"));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static QSE::TcpServerF<ClientHandler>* g_server;
|
||||||
|
|
||||||
static int test1 (void)
|
static int test1 (void)
|
||||||
{
|
{
|
||||||
QSE::TcpServerF<ClientHandler> server;
|
QSE::TcpServerF<ClientHandler> server;
|
||||||
server.setThreadStackSize (256000);
|
server.setThreadStackSize (256000);
|
||||||
|
g_server = &server;
|
||||||
server.start (QSE_T("0.0.0.0:9998"));
|
server.start (QSE_T("0.0.0.0:9998"));
|
||||||
|
g_server = QSE_NULL;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,7 +60,7 @@ static int test2 (void)
|
|||||||
|
|
||||||
static void handle_sigint (int sig, siginfo_t* siginfo, void* ctx)
|
static void handle_sigint (int sig, siginfo_t* siginfo, void* ctx)
|
||||||
{
|
{
|
||||||
g_stopreq = 1;
|
if (g_server) g_server->stop ();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_signal (int sig, void(*handler)(int, siginfo_t*, void*))
|
static void set_signal (int sig, void(*handler)(int, siginfo_t*, void*))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user