/* Incomplete structure declaration to self handler */
typedef struct _self self_t;
/* Modules states */
enum module_states { IDLE = 0x1, RUNNING = 0x2, PAUSED = 0x4, STOPPED = 0x8 };
/* PubSub message types */
enum msg_type { USER, LOOP_STARTED, LOOP_STOPPED, MODULE_STARTED, MODULE_STOPPED, MODULE_POISONPILL };
typedef struct {
const char *topic;
const void *message;
ssize_t size;
const self_t *sender;
enum msg_type type;
} ps_msg_t;
typedef struct {
int fd;
const void *userptr;
} fd_msg_t;
typedef struct {
bool is_pubsub;
union {
const fd_msg_t *fd_msg;
const ps_msg_t *ps_msg;
};
} msg_t;
/* Callbacks typedefs */
typedef void (*init_cb)(void);
typedef bool (*evaluate_cb)(void);
typedef void (*recv_cb)(const msg_t *const msg, const void *userdata);
typedef void (*destroy_cb)(void);
/* Logger callback */
typedef void (*log_cb)(const self_t *self, const char *fmt, va_list args, const void *userdata);
/* Memory management user-passed functions */
typedef void *(*malloc_fn)(size_t size);
typedef void *(*realloc_fn)(void *ptr, size_t size);
typedef void *(*calloc_fn)(size_t nmemb, size_t size);
typedef void (*free_fn)(void *ptr);
/* Struct that holds user defined callbacks */
typedef struct {
init_cb init; // module's init function (should return a FD)
evaluate_cb evaluate; // module's state changed function
recv_cb recv; // module's recv function
destroy_cb destroy; // module's destroy function
} userhook_t;
/* Struct that holds user defined memory functions */
typedef struct {
malloc_fn _malloc;
realloc_fn _realloc;
calloc_fn _calloc;
free_fn _free;
} memhook_t;