]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
split channel close into two functions
authorAlan T. DeKok <aland@freeradius.org>
Wed, 7 Dec 2016 19:56:32 +0000 (14:56 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 7 Dec 2016 22:32:27 +0000 (17:32 -0500)
src/tests/util/channel_test.c
src/util/channel.c
src/util/channel.h
src/util/receiver.c
src/util/worker.c

index 0254beef43f11ff8958924d6e89203bfa195b917..d51464f597ad004c2fb1cb1c76236e75ee9acc80 100644 (file)
@@ -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;
                        }
 
index 9c689808ff51aec50a160ad94fb9a2579cca809d..4538d16c23f84aab2199b1e21164179b3c09f748 100644 (file)
@@ -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
index b0e0ef9efc32842e79aff3f57e4d91778ad2107f..2909a53cee18330a5296ea74e1941447d9d65fc2 100644 (file)
@@ -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);
 
index 4de4931e3461baa5e337040c483abdb65bacb6aa..5a88b15889d3b98eef6d0d2b1fe79ccdfdba12b3 100644 (file)
@@ -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);
        }
 
index 32c13f8c9574c4b330a44f18b2fdc71cc4b553ab..8c1ab6d99b4774f254902abf5907d7f2a463d06c 100644 (file)
@@ -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]);
        }
 }