]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
remember if both ends are in the same thread
authorAlan T. DeKok <aland@freeradius.org>
Tue, 2 Oct 2018 14:24:48 +0000 (10:24 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 3 Oct 2018 15:13:47 +0000 (11:13 -0400)
src/lib/io/channel.c
src/lib/io/channel.h
src/lib/io/worker.c
src/tests/util/channel_test.c

index b57713248e855ddb284310d3ee44ec43986cd64e..3c551baff0e8c375635968e6ebbdc8b9238baab7 100644 (file)
@@ -133,6 +133,7 @@ typedef struct fr_channel_t {
        fr_time_t               processing_time; //!< Time spent by the worker processing requests.
 
        bool                    active;         //!< Whether the channel is active.
+       bool                    same_thread;    //!< are both ends in the same thread?
 
        fr_channel_end_t        end[2];         //!< Two ends of the channel.
 } fr_channel_t;
@@ -151,11 +152,12 @@ const FR_NAME_NUMBER channel_packet_priority[] = {
  * @param[in] ctx      The talloc_ctx to allocate channel data in.
  * @param[in] master   control plane.
  * @param[in] worker   control plane.
+ * @param[in] same     whether or not the channel is for the same thread
  * @return
  *     - NULL on error
  *     - channel on success
  */
-fr_channel_t *fr_channel_create(TALLOC_CTX *ctx, fr_control_t *master, fr_control_t *worker)
+fr_channel_t *fr_channel_create(TALLOC_CTX *ctx, fr_control_t *master, fr_control_t *worker, bool same)
 {
        fr_time_t when;
        fr_channel_t *ch;
@@ -167,6 +169,8 @@ fr_channel_t *fr_channel_create(TALLOC_CTX *ctx, fr_control_t *master, fr_contro
                return NULL;
        }
 
+       ch->same_thread = same;
+
        ch->end[TO_WORKER].aq = fr_atomic_queue_create(ch, ATOMIC_QUEUE_SIZE);
        if (!ch->end[TO_WORKER].aq) {
                talloc_free(ch);
index 1c67ffadc5daa100fe14603f3a0a77661d2a26c9..e2070bb8d101bde99fcdda4542c5b71e858ed3c8 100644 (file)
@@ -123,7 +123,7 @@ typedef struct fr_channel_data_t {
 
 extern const FR_NAME_NUMBER channel_packet_priority[];
 
-fr_channel_t *fr_channel_create(TALLOC_CTX *ctx, fr_control_t *master, fr_control_t *worker) CC_HINT(nonnull);
+fr_channel_t *fr_channel_create(TALLOC_CTX *ctx, fr_control_t *master, fr_control_t *worker, bool same) CC_HINT(nonnull);
 
 int fr_channel_send_request(fr_channel_t *ch, fr_channel_data_t *cm, fr_channel_data_t **p_reply) CC_HINT(nonnull);
 fr_channel_data_t *fr_channel_recv_request(fr_channel_t *ch) CC_HINT(nonnull);
index af911fc93818aa849e86f80bf4cabb1f7a32164c..05851e980f1eacbd86b60af6c90b81e05bd8c657 100644 (file)
@@ -109,6 +109,7 @@ struct fr_worker_t {
        char const              *name;          //!< name of this worker
 
        int                     kq;             //!< my kq
+       pthread_t               id;             //!< my thread ID
 
        fr_log_t const          *log;           //!< log destination
        fr_log_lvl_t            lvl;            //!< log level
@@ -1298,6 +1299,7 @@ nomem:
                goto nomem;
        }
 
+       worker->id = pthread_self();
        worker->el = el;
        worker->log = logger;
        worker->lvl = lvl;
@@ -1548,10 +1550,15 @@ void fr_worker_debug(fr_worker_t *worker, FILE *fp)
 fr_channel_t *fr_worker_channel_create(fr_worker_t *worker, TALLOC_CTX *ctx, fr_control_t *master)
 {
        fr_channel_t *ch;
+       pthread_t id;
+       bool same;
 
        WORKER_VERIFY;
 
-       ch = fr_channel_create(ctx, master, worker->control);
+       id = pthread_self();
+       same = (pthread_equal(id, worker->id) != 0);
+
+       ch = fr_channel_create(ctx, master, worker->control, same);
        if (!ch) return NULL;
 
        /*
index 7a139eee6b2c16151f666ef76404ea740a4ca0c9..40f5b0ffcd3dbad0dff6c908bd938a888e846107 100644 (file)
@@ -557,7 +557,7 @@ int main(int argc, char *argv[])
        control_worker = fr_control_create(autofree, kq_worker, aq_worker, 1025);
        rad_assert(control_worker != NULL);
 
-       channel = fr_channel_create(autofree, control_master, control_worker);
+       channel = fr_channel_create(autofree, control_master, control_worker, false);
        if (!channel) {
                fprintf(stderr, "channel_test: Failed to create channel\n");
                exit(EXIT_FAILURE);