66 #include <amxc/amxc.h>
101 amxc_llist_it_take(it);
108 amxc_htable_it_t* it) {
122 const amxc_var_t*
const data) {
125 when_null(item, exit);
126 item->
sig_name = (
char*) calloc(1, strlen(signal->
name) + 1);
131 when_failed(amxc_var_copy(&item->
sig_data, data), exit);
143 if((retval != 0) && (item != NULL)) {
153 const amxc_var_t*
const data,
157 when_null(item, exit);
161 when_failed(amxc_var_copy(&item->
sig_data, data), exit);
174 if((retval != 0) && (item != NULL)) {
184 amxc_lqueue_it_t* sig_it = NULL;
208 when_true(retval != 0, exit);
211 when_true(flags < 0, exit);
232 const amxc_var_t*
const data) {
233 if(slot->
expr != NULL) {
236 slot->
fn(name, data, slot->
priv);
239 slot->
fn(name, data, slot->
priv);
245 const amxc_var_t*
const data) {
258 regcomp(®exp, slot->
regexp, REG_NOSUB | REG_EXTENDED);
259 if(regexec(®exp, name, 0, NULL, 0) == 0) {
275 when_null(signal, exit);
277 if(signal->
mngr == NULL) {
280 amxc_llist_for_each(it, (&signal->
slots)) {
293 when_null(sig_mngr, exit);
299 amxc_htable_for_each(hit, &sig_mngr->
signals) {
320 amxc_llist_t** pending_sigmngrs) {
326 sig_mngr = (sig_mngr == NULL) ? &
amxp_sigmngr : sig_mngr;
332 when_null(sig_mngr, exit);
335 when_null(sig_mngr, exit);
341 (sig_mngr != NULL) &&
342 (*sig_mngr != NULL)) {
352 when_null(sig_mngr, exit);
353 when_null(*sig_mngr, exit);
355 if((*sig_mngr)->triggered) {
356 (*sig_mngr)->deleted =
true;
357 amxc_htable_for_each(hit, &(*sig_mngr)->signals) {
379 when_null(sig_mngr, exit);
383 amxc_llist_it_init(&sig_mngr->
it);
399 (sig_mngr != NULL)) {
400 amxc_htable_clean(&sig_mngr->
signals, NULL);
407 amxc_llist_it_t* it = NULL;
410 when_null(sig_mngr, exit);
414 amxc_llist_it_take(&sig_mngr->
it);
439 when_null(name, exit);
440 when_true(*name == 0, exit)
453 amxc_htable_it_t* hit = NULL;
457 when_null(name, exit);
458 when_true(*name == 0, exit)
460 hit = amxc_htable_get(&mngr->
signals, name);
461 when_null(hit, exit);
464 amxc_htable_it_clean(hit, NULL);
478 amxc_htable_it_t* hit = NULL;
481 when_null(name, exit);
482 when_true(*name == 0, exit)
484 hit = amxc_htable_get(&mngr->
signals, name);
485 when_null(hit, exit);
494 const amxc_var_t*
const data) {
498 when_null(name, exit);
499 when_true(*name == 0, exit);
516 const amxc_var_t*
const data) {
521 amxc_htable_it_t* hit = NULL;
523 when_null(name, exit);
524 when_true(*name == 0, exit)
526 hit = amxc_htable_get(&mngr->
signals, name);
527 when_null(hit, exit);
538 const amxc_var_t*
const data,
541 int write_length = 0;
597 int write_length = 0;
624 amxc_htable_it_t* hit = NULL;
625 when_null(signal, exit);
626 when_not_null(*signal, exit);
627 when_null(name, exit);
628 when_true(*name == 0, exit)
630 sig_mngr = (sig_mngr == NULL) ? &
amxp_sigmngr : sig_mngr;
631 when_null(sig_mngr->
it.llist, exit);
633 hit = amxc_htable_get(&sig_mngr->
signals, name);
634 when_not_null(hit, exit);
637 when_null(*signal, exit);
638 (*signal)->mngr = sig_mngr;
642 amxc_htable_it_init(&(*signal)->hit);
643 amxc_llist_init(&(*signal)->slots);
644 if(amxc_htable_insert(&sig_mngr->
signals, name, &(*signal)->hit) == 0) {
645 const char* n = amxc_htable_it_get_key(&(*signal)->hit);
671 when_null(signal, exit);
672 when_null(*signal, exit);
676 if(!(*signal)->triggered) {
679 (*signal)->mngr = NULL;
692 const amxc_var_t*
const data) {
694 char* sig_name = NULL;
695 static uint32_t recurse = 0;
697 when_null(signal, exit);
698 when_null(signal->
mngr, exit);
699 sig_mngr = signal->
mngr;
700 when_false(sig_mngr->
enabled, exit);
701 when_true(sig_mngr->
deleted, exit);
705 sig_name = strdup(signal->
name);
708 amxc_llist_for_each(it, (&signal->
slots)) {
743 const amxc_var_t*
const data) {
745 int write_length = 0;
747 when_null(signal, exit);
748 when_null(signal->
mngr, exit);
749 sig_mngr = signal->
mngr;
751 when_false(sig_mngr->
enabled, exit);
752 when_true(sig_mngr->
deleted, exit);
774 amxc_htable_it_t* hit = NULL;
789 when_null(signal, exit);
791 }
else if(item->
fn != NULL) {
808 when_null(signal, exit);
818 return signal ? signal->
name : NULL;
824 when_null(signal, exit);
825 retval = !amxc_llist_is_empty(&signal->
slots);
826 when_false(retval, exit);
829 amxc_llist_iterate(it, &signal->
slots) {
static int amxp_signal_queue_unlock(void)
amxp_signal_mngr_t * amxp_get_sigmngr(amxp_signal_mngr_t *sig_mngr)
static void amxp_sigmngr_trigger_regexp(amxp_signal_mngr_t *sig_mngr, const char *name, const amxc_var_t *const data)
struct _signal_queue_item signal_queue_item_t
static int amxp_signal_create_pipe(void)
static void amxp_slot_trigger(const amxp_slot_t *const slot, const char *name, const amxc_var_t *const data)
static void amxp_signal_garbage_collect(amxp_signal_t *signal)
void amxp_get_sigmngrs(amxc_llist_t **sigmngrs, amxc_llist_t **pending_sigmngrs)
static int amxp_signal_queue_lock(void)
static signal_ctrl_t amxp_sigctrl
static signal_queue_item_t * amxp_signal_dequeue(void)
static void amxp_free_queued_signals(amxc_lqueue_it_t *it)
struct _signal_ctrl signal_ctrl_t
void amxp_free_slots(amxc_llist_it_t *it)
static void amxp_sigmngr_garbage_collect(amxp_signal_mngr_t *sig_mngr)
static int amxp_signal_queue(const amxp_signal_t *const signal, const amxc_var_t *const data)
static void amxp_free_signals(UNUSED const char *key, amxc_htable_it_t *it)
static int amxp_deferred_queue(amxp_signal_mngr_t *sigmngr, amxp_deferred_fn_t fn, const amxc_var_t *const data, void *priv)
const amxc_htable_t * amxp_get_signals(const amxp_signal_mngr_t *sig_mngr)
static amxp_signal_mngr_t amxp_sigmngr
bool amxp_expr_eval_var(amxp_expr_t *expr, const amxc_var_t *const data, amxp_expr_status_t *status)
Evaluates an expression against a composite variant.
enum _expr_status amxp_expr_status_t
Expression status/error codes.
void amxp_expr_delete(amxp_expr_t **expr)
Deletes a previously allocated expression structure.
int amxp_sigmngr_add_signal(amxp_signal_mngr_t *const sig_mngr, const char *name)
Adds a signal to a signal manager.
int amxp_sigmngr_init(amxp_signal_mngr_t *sig_mngr)
Initializing function, initializes members of the amxp_signal_mngr_t structure.
int amxp_sigmngr_new(amxp_signal_mngr_t **sig_mngr)
Constructor function, creates a new signal manager instance.
int amxp_sigmngr_clean(amxp_signal_mngr_t *sig_mngr)
Clean-up functions, cleans-up all members of a amxp_signal_mngr_t structure.
void amxp_sigmngr_trigger_signal(amxp_signal_mngr_t *const sig_mngr, const char *name, const amxc_var_t *const data)
Triggers a signal.
int amxp_sigmngr_remove_signal(amxp_signal_mngr_t *const sig_mngr, const char *name)
Removes a signal from a signal manager.
amxp_signal_t * amxp_sigmngr_find_signal(const amxp_signal_mngr_t *const sig_mngr, const char *name)
Get the pointer to the signal.
int amxp_sigmngr_delete(amxp_signal_mngr_t **sig_mngr)
Destructor function, deletes a signal manager instance.
int amxp_sigmngr_suspend(amxp_signal_mngr_t *const sig_mngr)
Suspends the handling of signals for the signal manager.
int amxp_sigmngr_deferred_call(amxp_signal_mngr_t *const sig_mngr, amxp_deferred_fn_t fn, const amxc_var_t *const data, void *priv)
Defers a function call.
bool amxp_signal_has_slots(const amxp_signal_t *const signal)
Checks if the signal has slots conencted.
int amxp_signal_read(void)
Reads from the amxp signal file descriptor.
const char * amxp_signal_name(const amxp_signal_t *const signal)
Gets the name of the signal.
int amxp_sigmngr_enable(amxp_signal_mngr_t *const sig_mngr, bool enable)
Enables or disables the signal manager.
int amxp_signal_new(amxp_signal_mngr_t *sig_mngr, amxp_signal_t **signal, const char *name)
Constructor function, creates a new signal.
void amxp_signal_trigger(amxp_signal_t *const signal, const amxc_var_t *const data)
Triggers a signal.
int amxp_signal_emit(const amxp_signal_t *const signal, const amxc_var_t *const data)
Emits a signal.
int amxp_sigmngr_resume(amxp_signal_mngr_t *const sig_mngr)
Resumes the handling of signals for the signal manager.
int amxp_signal_fd(void)
Gets the amxp signal file descriptor.
int amxp_signal_disconnect_all(amxp_signal_t *const signal)
Disconnects all slots from the signal.
int amxp_signal_delete(amxp_signal_t **const signal)
Destructor function, deletes a signal.
int amxp_sigmngr_emit_signal(const amxp_signal_mngr_t *const sig_mngr, const char *name, const amxc_var_t *const data)
Emits a signal.
void(* amxp_deferred_fn_t)(const amxc_var_t *const data, void *const priv)
Deferred callback function signature.
int amxp_slot_connect(amxp_signal_mngr_t *const sig_mngr, const char *const sig_name, const char *const expression, amxp_slot_fn_t fn, void *const priv)
Connects a slot (function) to a named signal of a signal manager.
Structure containing the signal manager information.
amxc_lqueue_t signal_queue
amxc_llist_t regexp_slots
Structure containing the signal information.
amxp_signal_mngr_t * mngr
amxc_llist_t pending_sigmngrs
amxp_signal_mngr_t * sig_mngr
static amxp_signal_mngr_t * sigmngr