From: Alan T. DeKok Date: Wed, 7 Dec 2016 19:56:32 +0000 (-0500) Subject: split channel close into two functions X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3d5ba5ce91c818ba838dce16f774a7b35f5e4688;p=thirdparty%2Ffreeradius-server.git split channel close into two functions --- diff --git a/src/tests/util/channel_test.c b/src/tests/util/channel_test.c index 0254beef43f..d51464f597a 100644 --- a/src/tests/util/channel_test.c +++ b/src/tests/util/channel_test.c @@ -155,7 +155,7 @@ static void *channel_master(void *arg) */ check_close: if (!signaled_close && (num_messages >= max_messages) && (num_outstanding == 0)) { - rcode = fr_channel_signal_close(channel, false); + rcode = fr_channel_signal_worker_close(channel); if (rcode < 0) { fprintf(stderr, "Failed signaling close: %s\n", strerror(errno)); exit(1); @@ -323,7 +323,7 @@ static void *channel_worker(void *arg) fr_message_done(&cd->m); } - (void) fr_channel_signal_close(channel, true); + (void) fr_channel_ack_worker_close(channel); continue; } diff --git a/src/util/channel.c b/src/util/channel.c index 9c689808ff5..4538d16c23f 100644 --- a/src/util/channel.c +++ b/src/util/channel.c @@ -648,25 +648,44 @@ bool fr_channel_active(fr_channel_t *ch) return ch->active; } -/** Signal a channel that it is closing. +/** Signal a worker that the channel is closing * * @param[in] ch The channel. - * @param[in] ack Whether we're acking a previous request to close the channel. * @return * - <0 on error * - 0 on success */ -int fr_channel_signal_close(fr_channel_t *ch, bool ack) +int fr_channel_signal_worker_close(fr_channel_t *ch) { fr_channel_control_t cc; ch->active = false; cc.signal = FR_CHANNEL_SIGNAL_CLOSE; - cc.ack = ack; + cc.ack = TO_WORKER; cc.ch = ch; - return fr_channel_kevent_signal(ch->end[ack].kq, &cc); + return fr_channel_kevent_signal(ch->end[TO_WORKER].kq, &cc); +} + +/** Acknowledge that the channel is closing + * + * @param[in] ch The channel. + * @return + * - <0 on error + * - 0 on success + */ +int fr_channel_ack_worker_close(fr_channel_t *ch) +{ + fr_channel_control_t cc; + + ch->active = false; + + cc.signal = FR_CHANNEL_SIGNAL_CLOSE; + cc.ack = FROM_WORKER; + cc.ch = ch; + + return fr_channel_kevent_signal(ch->end[FROM_WORKER].kq, &cc); } /** Send a channel to a KQ diff --git a/src/util/channel.h b/src/util/channel.h index b0e0ef9efc3..2909a53cee1 100644 --- a/src/util/channel.h +++ b/src/util/channel.h @@ -118,7 +118,8 @@ fr_channel_event_t fr_channel_service_kevent(int kq, struct kevent const *kev, f bool fr_channel_active(fr_channel_t *ch) CC_HINT(nonnull); int fr_channel_signal_open(int kq, fr_channel_t *ch) CC_HINT(nonnull); -int fr_channel_signal_close(fr_channel_t *ch, bool ack) CC_HINT(nonnull); +int fr_channel_signal_worker_close(fr_channel_t *ch) CC_HINT(nonnull); +int fr_channel_ack_worker_close(fr_channel_t *ch) CC_HINT(nonnull); void fr_channel_debug(fr_channel_t *ch, FILE *fp); diff --git a/src/util/receiver.c b/src/util/receiver.c index 4de4931e346..5a88b15889d 100644 --- a/src/util/receiver.c +++ b/src/util/receiver.c @@ -230,7 +230,7 @@ int fr_receiver_destroy(fr_receiver_t *rc) * closing/ */ while ((worker = fr_heap_pop(rc->workers)) != NULL) { - fr_channel_signal_close(worker->channel, false); + fr_channel_signal_worker_close(worker->channel); (void) fr_heap_insert(rc->closing, worker); } diff --git a/src/util/worker.c b/src/util/worker.c index 32c13f8c957..8c1ab6d99b4 100644 --- a/src/util/worker.c +++ b/src/util/worker.c @@ -573,7 +573,7 @@ void fr_worker_destroy(fr_worker_t *worker) * automatically freed when our talloc context is freed. */ for (i = 0; i < worker->num_channels; i++) { - fr_channel_signal_close(worker->channel[i], true); + fr_channel_ack_worker_close(worker->channel[i]); } }