typedef struct {
dl_module_inst_t const *inst; //!< Dynamic loader API handle for the module.
void *thread; //!< Thread specific instance data.
+ void *env_data; //!< Per call enviornment data.
void *rctx; //!< Resume ctx that a module previously set.
} module_ctx_t;
* @param[in] _thread instance of the module being called.
* @param[in] _rctx Resume ctx (if any).
*/
-#define MODULE_CTX(_dl_inst, _thread, _rctx) &(module_ctx_t){ .inst = _dl_inst, .thread = _thread, .rctx = _rctx }
+#define MODULE_CTX(_dl_inst, _thread, _env_data, _rctx) &(module_ctx_t){ .inst = _dl_inst, .thread = _thread, .env_data = _env_data, .rctx = _rctx }
/** Wrapper to create a module_ctx_t as a compound literal from a module_inst_ctx_t
*
*
* @param[in] _mctx to copy fields from.
*/
-#define MODULE_CTX_FROM_THREAD_INST(_mctx) &(module_ctx_t){ .inst = (_mctx)->inst, .thread = (_mctx)->thread }
+#define MODULE_CTX_FROM_THREAD_INST(_mctx) &(module_ctx_t){ .inst = (_mctx)->inst, .thread = (_mctx)->thread, .env_data = (_mctx)->env_data }
/** Wrapper to create a module_inst_ctx_t as a compound literal
*
dl_module_inst_t *dl_inst; //!< Module instance to pass to callbacks.
///< Use dl_inst->data to get instance data.
void *thread; //!< Thread specific module instance.
+ void *env_data; //!< Per call environment data.
void const *rctx; //!< rctx data to pass to callbacks.
fr_event_timer_t const *ev; //!< Event in this worker's event heap.
} unlang_module_event_t;
fr_assert(ev->fd == fd);
- ev->fd_read(MODULE_CTX(ev->dl_inst, ev->thread, UNCONST(void *, ev->rctx)), ev->request, fd);
+ ev->fd_read(MODULE_CTX(ev->dl_inst, ev->thread, ev->env_data, UNCONST(void *, ev->rctx)), ev->request, fd);
}
/** Frees an unlang event, removing it from the request's event loop
{
unlang_module_event_t *ev = talloc_get_type_abort(ctx, unlang_module_event_t);
- ev->timeout(MODULE_CTX(ev->dl_inst, ev->thread, UNCONST(void *, ev->rctx)), ev->request, now);
+ ev->timeout(MODULE_CTX(ev->dl_inst, ev->thread, ev->env_data, UNCONST(void *, ev->rctx)), ev->request, now);
talloc_free(ev);
}
.timeout = callback,
.dl_inst = mc->instance->dl_inst,
.thread = state->thread,
+ .env_data = state->env_data,
.rctx = rctx
};
unlang_module_event_t *ev = talloc_get_type_abort(ctx, unlang_module_event_t);
fr_assert(ev->fd == fd);
- ev->fd_write(MODULE_CTX(ev->dl_inst, ev->thread, UNCONST(void *, ev->rctx)), ev->request, fd);
+ ev->fd_write(MODULE_CTX(ev->dl_inst, ev->thread, ev->env_data, UNCONST(void *, ev->rctx)), ev->request, fd);
}
/** Call the callback registered for an I/O error event
fr_assert(ev->fd == fd);
- ev->fd_error(MODULE_CTX(ev->dl_inst, ev->thread, UNCONST(void *, ev->rctx)), ev->request, fd);
+ ev->fd_error(MODULE_CTX(ev->dl_inst, ev->thread, ev->env_data, UNCONST(void *, ev->rctx)), ev->request, fd);
}
ev->fd_error = error;
ev->dl_inst = mc->instance->dl_inst;
ev->thread = state->thread;
+ ev->env_data = state->env_data;
ev->rctx = rctx;
/*
unlang_stack_t *stack = request->stack;
unlang_stack_frame_t *frame = &stack->frame[stack->depth];
unlang_module_t *mc;
+ unlang_frame_state_module_t *state;
fr_assert(frame->instruction->type == UNLANG_TYPE_MODULE);
mc = unlang_generic_to_module(frame->instruction);
* anyway when we return.
*/
stack->result = frame->result = default_rcode;
+ state = talloc_get_type_abort(frame->state, unlang_frame_state_module_t);
return resume(p_result,
- MODULE_CTX(mc->instance->dl_inst, module_thread(mc->instance)->data, rctx),
+ MODULE_CTX(mc->instance->dl_inst, module_thread(mc->instance)->data,
+ state->env_data, rctx),
request);
}
caller = request->module;
request->module = mc->instance->name;
safe_lock(mc->instance);
- state->signal(MODULE_CTX(mc->instance->dl_inst, state->thread->data, state->rctx), request, action);
+ state->signal(MODULE_CTX(mc->instance->dl_inst, state->thread->data, state->env_data, state->rctx), request, action);
safe_unlock(mc->instance);
request->module = caller;
state->resume = NULL;
safe_lock(mc->instance);
- ua = resume(&state->rcode, MODULE_CTX(mc->instance->dl_inst, state->thread->data, state->rctx), request);
+ ua = resume(&state->rcode, MODULE_CTX(mc->instance->dl_inst, state->thread->data,
+ state->env_data, state->rctx), request);
safe_unlock(mc->instance);
if (request->master_state == REQUEST_STOP_PROCESSING) ua = UNLANG_ACTION_STOP_PROCESSING;
request->module = mc->instance->name;
safe_lock(mc->instance); /* Noop unless instance->mutex set */
ua = mc->method(&state->rcode,
- MODULE_CTX(mc->instance->dl_inst, state->thread->data, NULL),
+ MODULE_CTX(mc->instance->dl_inst, state->thread->data, state->env_data, NULL),
request);
safe_unlock(mc->instance);