libamxp  1.4.0
Patterns C Implementation
Signal managers
Collaboration diagram for Signal managers:

Data Structures

struct  _amxp_signal_mngr
 Structure containing the signal manager information. More...
 

Typedefs

typedef struct _amxp_signal_mngr amxp_signal_mngr_t
 Structure containing the signal manager information. More...
 

Functions

int amxp_sigmngr_new (amxp_signal_mngr_t **sig_mngr)
 Constructor function, creates a new signal manager instance. More...
 
int amxp_sigmngr_delete (amxp_signal_mngr_t **sig_mngr)
 Destructor function, deletes a signal manager instance. More...
 
int amxp_sigmngr_init (amxp_signal_mngr_t *sig_mngr)
 Initializing function, initializes members of the amxp_signal_mngr_t structure. More...
 
int amxp_sigmngr_clean (amxp_signal_mngr_t *sig_mngr)
 Clean-up functions, cleans-up all members of a amxp_signal_mngr_t structure. More...
 
int amxp_sigmngr_add_signal (amxp_signal_mngr_t *const sig_mngr, const char *name)
 Adds a signal to a signal manager. More...
 
int amxp_sigmngr_remove_signal (amxp_signal_mngr_t *const sig_mngr, const char *name)
 Removes a signal from a signal manager. More...
 
amxp_signal_tamxp_sigmngr_find_signal (const amxp_signal_mngr_t *const sig_mngr, const char *name)
 Get the pointer to the signal. More...
 
void amxp_sigmngr_trigger_signal (amxp_signal_mngr_t *const sig_mngr, const char *name, const amxc_var_t *const data)
 Triggers a signal. More...
 

Detailed Description

A signal manager is a collection of named signals. It can trigger or emit a signal.

Typedef Documentation

◆ amxp_signal_mngr_t

Structure containing the signal manager information.

Function Documentation

◆ amxp_sigmngr_add_signal()

int amxp_sigmngr_add_signal ( amxp_signal_mngr_t *const  sig_mngr,
const char *  name 
)

Adds a signal to a signal manager.

Creates a new signal with the given name and adds it to the signal manager. If sig_mngr is NULL the newly created signal is added to the global signal manager. A isgnal name must be unique. If a signal with the name already exists in the signal manager, this function fails.

Parameters
sig_mngrponter to the sig_mngr pointer. Will be set to NULL
namethe name of the signal
Returns
0 when successful, otherwise an error code

Definition at line 433 of file amxp_signal.c.

434  {
435  int retval = -1;
436  amxp_signal_t* signal = NULL;
437  amxp_signal_mngr_t* mngr = (sig_mngr == NULL) ? &amxp_sigmngr : sig_mngr;
438 
439  when_null(name, exit);
440  when_true(*name == 0, exit)
441 
442  retval = amxp_signal_new(mngr, &signal, name);
443 
444 exit:
445  return retval;
446 }
static amxp_signal_mngr_t amxp_sigmngr
Definition: amxp_signal.c:89
int amxp_signal_new(amxp_signal_mngr_t *sig_mngr, amxp_signal_t **signal, const char *name)
Constructor function, creates a new signal.
Definition: amxp_signal.c:620
Structure containing the signal manager information.
Definition: amxp_signal.h:103
Structure containing the signal information.
Definition: amxp_signal.h:119

◆ amxp_sigmngr_clean()

int amxp_sigmngr_clean ( amxp_signal_mngr_t sig_mngr)

Clean-up functions, cleans-up all members of a amxp_signal_mngr_t structure.

All signals of the signal manager will be removed, all connected slots will be automatically disconnected

Parameters
sig_mngrpointer to a amxp_signal_mngr_t structure
Returns
0 when successful, otherwise an error code

Definition at line 405 of file amxp_signal.c.

405  {
406  int retval = -1;
407  amxc_llist_it_t* it = NULL;
408  char buffer[1];
409 
410  when_null(sig_mngr, exit);
411 
413 
414  amxc_llist_it_take(&sig_mngr->it);
415  it = amxc_lqueue_remove(&sig_mngr->signal_queue);
416  while(it) {
418  when_true_status(read(amxp_sigctrl.sigpipe[0], buffer, 1) == -1, exit, amxp_signal_queue_unlock());
419  it = amxc_lqueue_remove(&sig_mngr->signal_queue);
420  }
421  amxc_llist_clean(&sig_mngr->regexp_slots, amxp_free_slots);
422  amxc_htable_clean(&sig_mngr->signals, amxp_free_signals);
423 
425 
426  retval = 0;
427 
428 exit:
429 
430  return retval;
431 }
static int amxp_signal_queue_unlock(void)
Definition: amxp_signal.c:95
static int amxp_signal_queue_lock(void)
Definition: amxp_signal.c:91
static signal_ctrl_t amxp_sigctrl
Definition: amxp_signal.c:88
static void amxp_free_queued_signals(amxc_lqueue_it_t *it)
Definition: amxp_signal.c:114
void amxp_free_slots(amxc_llist_it_t *it)
Definition: amxp_signal.c:99
static void amxp_free_signals(UNUSED const char *key, amxc_htable_it_t *it)
Definition: amxp_signal.c:107
amxc_llist_it_t it
Definition: amxp_signal.h:107
amxc_htable_t signals
Definition: amxp_signal.h:104
amxc_lqueue_t signal_queue
Definition: amxp_signal.h:105
amxc_llist_t regexp_slots
Definition: amxp_signal.h:106
int sigpipe[2]
Definition: amxp_signal.c:72

◆ amxp_sigmngr_delete()

int amxp_sigmngr_delete ( amxp_signal_mngr_t **  sig_mngr)

Destructor function, deletes a signal manager instance.

All signals of the signal manager will be removed, all connected slots will be automatically disconnected

Parameters
sig_mngrponter to the sig_mngr pointer. Will be set to NULL
Returns
0 when successful, otherwise an error code

Definition at line 349 of file amxp_signal.c.

349  {
350  int retval = -1;
351 
352  when_null(sig_mngr, exit);
353  when_null(*sig_mngr, exit);
354 
355  if((*sig_mngr)->triggered) {
356  (*sig_mngr)->deleted = true;
357  amxc_htable_for_each(hit, &(*sig_mngr)->signals) {
358  amxp_signal_t* sig = amxc_container_of(hit, amxp_signal_t, hit);
359  if(sig != amxp_sigctrl.sigall) {
360  sig->mngr = NULL;
361  }
362  }
363  } else {
364  amxp_sigmngr_clean((*sig_mngr));
365  if(*sig_mngr != &amxp_sigmngr) {
366  free(*sig_mngr);
367  }
368  }
369 
370  *sig_mngr = NULL;
371  retval = 0;
372 
373 exit:
374  return retval;
375 }
int amxp_sigmngr_clean(amxp_signal_mngr_t *sig_mngr)
Clean-up functions, cleans-up all members of a amxp_signal_mngr_t structure.
Definition: amxp_signal.c:405
amxp_signal_mngr_t * mngr
Definition: amxp_signal.h:123
amxp_signal_t * sigall
Definition: amxp_signal.c:73

◆ amxp_sigmngr_find_signal()

amxp_signal_t* amxp_sigmngr_find_signal ( const amxp_signal_mngr_t *const  sig_mngr,
const char *  name 
)

Get the pointer to the signal.

Searches the signal manager for the given signal, if no signal is found with the given name, the functions returns a NULL pointer.

When sig_mngr is NULL, the signal is searched in the global signal manager.

The returned pointer can be used in all amxp signal functions that take a pointer to amxp_signal_t struct

Parameters
sig_mngrponter to the sig_mngr pointer. Will be set to NULL
namethe name of the signal
Returns
A amxp_signal_t pointer or NULL when no signal is found

Definition at line 475 of file amxp_signal.c.

476  {
477  amxp_signal_t* signal = NULL;
478  amxc_htable_it_t* hit = NULL;
479  const amxp_signal_mngr_t* mngr = (sig_mngr == NULL) ? &amxp_sigmngr : sig_mngr;
480 
481  when_null(name, exit);
482  when_true(*name == 0, exit)
483 
484  hit = amxc_htable_get(&mngr->signals, name);
485  when_null(hit, exit);
486  signal = amxc_htable_it_get_data(hit, amxp_signal_t, hit);
487 
488 exit:
489  return signal;
490 }

◆ amxp_sigmngr_init()

int amxp_sigmngr_init ( amxp_signal_mngr_t sig_mngr)

Initializing function, initializes members of the amxp_signal_mngr_t structure.

Use this function when the amxp_signal_mngr_t structure is declared on the stack. It will initialize all members of this structure.

Parameters
sig_mngrpointer to a amxp_signal_mngr_t structure
Returns
0 when successful, otherwise an error code

Definition at line 377 of file amxp_signal.c.

377  {
378  int retval = -1;
379  when_null(sig_mngr, exit);
380 
382 
383  amxc_llist_it_init(&sig_mngr->it);
384  amxc_lqueue_init(&sig_mngr->signal_queue);
385  when_false_status(amxc_htable_init(&sig_mngr->signals, 20) == 0, exit, amxp_signal_queue_unlock());
386  amxc_llist_init(&sig_mngr->regexp_slots);
387  amxc_llist_append(&amxp_sigctrl.sigmngrs, &sig_mngr->it);
388  sig_mngr->enabled = true;
389  sig_mngr->deleted = false;
390  sig_mngr->triggered = false;
391  sig_mngr->suspended = false;
392 
394 
395  retval = 0;
396 
397 exit:
398  if((retval != 0) &&
399  (sig_mngr != NULL)) {
400  amxc_htable_clean(&sig_mngr->signals, NULL);
401  }
402  return retval;
403 }
amxc_llist_t sigmngrs
Definition: amxp_signal.c:74

◆ amxp_sigmngr_new()

int amxp_sigmngr_new ( amxp_signal_mngr_t **  sig_mngr)

Constructor function, creates a new signal manager instance.

This function allocates memory, to free the allocated memory use the destruction function amxp_sigmngr_delete

Parameters
sig_mngrwhere to store the sig_mngr pointer
Returns
0 when successful, otherwise an error code

Definition at line 330 of file amxp_signal.c.

330  {
331  int retval = -1;
332  when_null(sig_mngr, exit);
333 
334  *sig_mngr = (amxp_signal_mngr_t*) calloc(1, sizeof(amxp_signal_mngr_t));
335  when_null(sig_mngr, exit);
336 
337  retval = amxp_sigmngr_init((*sig_mngr));
338 
339 exit:
340  if((retval != 0) &&
341  (sig_mngr != NULL) &&
342  (*sig_mngr != NULL)) {
343  free(*sig_mngr);
344  *sig_mngr = NULL;
345  }
346  return retval;
347 }
int amxp_sigmngr_init(amxp_signal_mngr_t *sig_mngr)
Initializing function, initializes members of the amxp_signal_mngr_t structure.
Definition: amxp_signal.c:377

◆ amxp_sigmngr_remove_signal()

int amxp_sigmngr_remove_signal ( amxp_signal_mngr_t *const  sig_mngr,
const char *  name 
)

Removes a signal from a signal manager.

When sig_mngr is NULL, the signal will be removed from the global signal manager.

If no signal is found in the the signal manager with the given name, this function fails.

Note
This function removes the signal from the signal manager, but does not free the memory allocated for the signal. When this function is called from within a slot callback function, the memory will be freed automatically when the slot callback function returns.
Parameters
sig_mngrponter to the sig_mngr pointer. Will be set to NULL
namethe name of the signal
Returns
0 when successful, otherwise an error code

Definition at line 448 of file amxp_signal.c.

449  {
450  int retval = -1;
451  amxp_signal_t* signal = NULL;
452  amxp_signal_mngr_t* mngr = (sig_mngr == NULL) ? &amxp_sigmngr : sig_mngr;
453  amxc_htable_it_t* hit = NULL;
454 
456 
457  when_null(name, exit);
458  when_true(*name == 0, exit)
459 
460  hit = amxc_htable_get(&mngr->signals, name);
461  when_null(hit, exit);
462 
463  signal = amxc_htable_it_get_data(hit, amxp_signal_t, hit);
464  amxc_htable_it_clean(hit, NULL);
466  signal->mngr = NULL;
467 
468  retval = 0;
469 
470 exit:
472  return retval;
473 }
int amxp_signal_disconnect_all(amxp_signal_t *const signal)
Disconnects all slots from the signal.
Definition: amxp_signal.c:806

◆ amxp_sigmngr_trigger_signal()

void amxp_sigmngr_trigger_signal ( amxp_signal_mngr_t *const  sig_mngr,
const char *  name,
const amxc_var_t *const  data 
)

Triggers a signal.

Searches the signal manager for the given signal and triggers the signal. This function is basically the same as calling amxp_sigmngr_find_signal and amxp_signal_trigger in sequence.

When sig_mngr is NULL, the signal is searched in the global signal manager.

When no signal is found with the given name, nothing is done.

Parameters
sig_mngrponter to the sig_mngr pointer. Will be set to NULL
namethe name of the signal
datathe data that is passed to all the slots.

Definition at line 492 of file amxp_signal.c.

494  {
495  amxp_signal_t* signal = NULL;
496  amxp_signal_mngr_t* mngr = (sig_mngr == NULL) ? &amxp_sigmngr : sig_mngr;
497 
498  when_null(name, exit);
499  when_true(*name == 0, exit);
500  when_true(mngr->suspended, exit);
501 
502  signal = amxp_sigmngr_find_signal(mngr, name);
503  if(signal != NULL) {
504  amxp_signal_trigger(signal, data);
505  } else {
506  amxp_sigmngr_trigger_regexp(mngr, name, data);
508  }
509 
510 exit:
511  return;
512 }
static void amxp_sigmngr_trigger_regexp(amxp_signal_mngr_t *sig_mngr, const char *name, const amxc_var_t *const data)
Definition: amxp_signal.c:243
static void amxp_sigmngr_garbage_collect(amxp_signal_mngr_t *sig_mngr)
Definition: amxp_signal.c:292
amxp_signal_t * amxp_sigmngr_find_signal(const amxp_signal_mngr_t *const sig_mngr, const char *name)
Get the pointer to the signal.
Definition: amxp_signal.c:475
void amxp_signal_trigger(amxp_signal_t *const signal, const amxc_var_t *const data)
Triggers a signal.
Definition: amxp_signal.c:691