summaryrefslogtreecommitdiff
path: root/ecp/server/sig.c
diff options
context:
space:
mode:
Diffstat (limited to 'ecp/server/sig.c')
-rw-r--r--ecp/server/sig.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/ecp/server/sig.c b/ecp/server/sig.c
index 09593d3..3b83ade 100644
--- a/ecp/server/sig.c
+++ b/ecp/server/sig.c
@@ -6,20 +6,26 @@
#include <ecp/dir/dir.h>
#include "server.h"
+#include "dir.h"
#include "acl.h"
+
#include "sig.h"
static pthread_t sig_handler_thd;
static sigset_t sig_set;
+static int conn_expired(ECPConnection *conn, ecp_sts_t now) {
+ return _ecp_conn_is_zombie(conn, now, CONN_EXPIRE_TO);
+}
+
static void * _sig_handler(void *arg) {
- sigset_t *set = arg;
+ ECPSocket *sock = arg;
int rv, sig;
while (1) {
- rv = sigwait(set, &sig);
+ rv = sigwait(&sig_set, &sig);
if (rv) {
- LOG(LOG_ERR, "sig_handler: sigwait err:%d\n", rv);
+ LOG(LOG_ERR, "sig_handler: sigwait error\n");
continue;
}
switch (sig) {
@@ -32,16 +38,22 @@ static void * _sig_handler(void *arg) {
LOG(LOG_DEBUG, "sig_handler: acl reloaded\n");
break;
}
+
+ case SIGUSR2: {
+ ecp_sock_expire(sock, conn_expired);
+ LOG(LOG_DEBUG, "sig_handler: gc done - inbound connection count:%u\n", ecp_sock_gct_count(sock));
+ break;
+ }
}
}
return NULL;
}
-int sig_start_handler(void) {
+int sig_start_handler(ECPSocket *sock) {
int rv;
- rv = pthread_create(&sig_handler_thd, NULL, &_sig_handler, (void *)&sig_set);
+ rv = pthread_create(&sig_handler_thd, NULL, &_sig_handler, sock);
if (rv) return ECP_ERR;
return ECP_OK;
@@ -52,6 +64,7 @@ int sig_init(void) {
sigemptyset(&sig_set);
sigaddset(&sig_set, SIGUSR1);
+ sigaddset(&sig_set, SIGUSR2);
rv = pthread_sigmask(SIG_BLOCK, &sig_set, NULL);
if (rv) return ECP_ERR;