From: Alan T. DeKok Date: Tue, 2 Oct 2018 14:24:48 +0000 (-0400) Subject: remember if both ends are in the same thread X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4ddae0f168d0d6188d2116a674ffeb927bfc82cd;p=thirdparty%2Ffreeradius-server.git remember if both ends are in the same thread --- diff --git a/src/lib/io/channel.c b/src/lib/io/channel.c index b57713248e8..3c551baff0e 100644 --- a/src/lib/io/channel.c +++ b/src/lib/io/channel.c @@ -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); diff --git a/src/lib/io/channel.h b/src/lib/io/channel.h index 1c67ffadc5d..e2070bb8d10 100644 --- a/src/lib/io/channel.h +++ b/src/lib/io/channel.h @@ -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); diff --git a/src/lib/io/worker.c b/src/lib/io/worker.c index af911fc9381..05851e980f1 100644 --- a/src/lib/io/worker.c +++ b/src/lib/io/worker.c @@ -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; /* diff --git a/src/tests/util/channel_test.c b/src/tests/util/channel_test.c index 7a139eee6b2..40f5b0ffcd3 100644 --- a/src/tests/util/channel_test.c +++ b/src/tests/util/channel_test.c @@ -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);