diff --git a/src/generator.c b/src/generator.c index ef4301d6..f324b44d 100644 --- a/src/generator.c +++ b/src/generator.c @@ -1007,6 +1007,15 @@ static void send_stratifier_delproxy(ckpool_t *ckp, const int id, const int subi send_proc(ckp->stratifier, buf); } +/* Close the subproxy socket if it's open and remove it from the epoll list */ +static void close_proxy_socket(proxy_instance_t *proxy, proxy_instance_t *subproxy) +{ + if (subproxy->cs.fd > 0) { + epoll_ctl(proxy->epfd, EPOLL_CTL_DEL, subproxy->cs.fd, NULL); + Close(subproxy->cs.fd); + } +} + /* Remove the subproxy from the proxi list and put it on the dead list. * Further use of the subproxy pointer may point to a new proxy but will not * dereference. This will only disable subproxies so parent proxies need to @@ -1015,10 +1024,7 @@ static void disable_subproxy(gdata_t *gdata, proxy_instance_t *proxi, proxy_inst { subproxy->alive = false; send_stratifier_deadproxy(gdata->ckp, subproxy->id, subproxy->subid); - if (subproxy->cs.fd > 0) { - epoll_ctl(proxi->epfd, EPOLL_CTL_DEL, subproxy->cs.fd, NULL); - Close(subproxy->cs.fd); - } + close_proxy_socket(proxi, subproxy); if (parent_proxy(subproxy)) return; @@ -2505,7 +2511,7 @@ static void delete_proxy(ckpool_t *ckp, gdata_t *gdata, proxy_instance_t *proxy) HASH_DEL(gdata->proxies, proxy); /* Disable all its threads */ pthread_cancel(proxy->pth_precv); - Close(proxy->cs.fd); + close_proxy_socket(proxy, proxy); mutex_unlock(&gdata->lock); /* Recycle all its subproxies */ @@ -2517,6 +2523,7 @@ static void delete_proxy(ckpool_t *ckp, gdata_t *gdata, proxy_instance_t *proxy) mutex_unlock(&proxy->proxy_lock); if (subproxy) { + close_proxy_socket(proxy, subproxy); send_stratifier_delproxy(ckp, subproxy->id, subproxy->subid); if (proxy != subproxy) store_proxy(gdata, subproxy);