From: Andre Noll Date: Wed, 6 Oct 2010 20:56:23 +0000 (+0200) Subject: udp_send: Add/remove the udp socket fd only once. X-Git-Tag: v0.4.5~2^2~4 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=939ece34a0c1ae2f8c32436d31ed18de6b3c24b5 udp_send: Add/remove the udp socket fd only once. Currently, we remove this fd from the close-on-fork list in udp_close_target() and re-add it in udp_init_session(). This is wrong because we want the fd being closed in the command handlers also if the child process for the command is spawned while the udp sender is inactive. So add/delete the fd when the udp target is added/removed rather than on a per session basis. --- diff --git a/udp_send.c b/udp_send.c index 4957725d..ba7163a8 100644 --- a/udp_send.c +++ b/udp_send.c @@ -57,7 +57,6 @@ static int sender_status; static void udp_close_target(struct sender_client *sc) { if (sc->cq != NULL) { - del_close_on_fork_list(sc->fd); cq_destroy(sc->cq); sc->cq = NULL; } @@ -70,6 +69,7 @@ static void udp_delete_target(struct sender_client *sc, const char *msg) PARA_NOTICE_LOG("deleting %s (%s) from list\n", sc->name, msg); udp_close_target(sc); close(sc->fd); + del_close_on_fork_list(sc->fd); vss_del_fec_client(ut->fc); list_del(&sc->node); free(sc->name); @@ -160,7 +160,6 @@ static void udp_init_session(struct sender_client *sc) { if (sc->cq == NULL) { sc->cq = cq_new(UDP_CQ_BYTES); - add_close_on_fork_list(sc->fd); PARA_NOTICE_LOG("sending to udp %s\n", sc->name); } } @@ -363,6 +362,7 @@ static int udp_com_add(struct sender_command_data *scd) PARA_INFO_LOG("adding to target list (%s)\n", sc->name); ut->fc = vss_add_fec_client(sc, &ut->fcp); para_list_add(&sc->node, &targets); + add_close_on_fork_list(sc->fd); return 1; err: if (sc->fd >= 0)