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;
* @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;
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);
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);
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
goto nomem;
}
+ worker->id = pthread_self();
worker->el = el;
worker->log = logger;
worker->lvl = lvl;
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;
/*
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);