Add htable_iterator_() accessors
[eleutheria.git] / fsm / types.h
blob6836ae65fa55d4ae222ba3b1ee00834aca37ea5b
1 #ifndef TYPES_H
2 #define TYPES_H
4 #include "../genstructs/htable/htable.h"
6 #define MAX_EVT_DESC 64
8 typedef struct event {
9 char evt_desc[MAX_EVT_DESC];
10 void (*evt_actionf)(void *data);
11 struct state *evt_newstate;
12 } event_t;
14 typedef struct state {
15 htable_t *evttable;
16 unsigned int *st_key;
17 unsigned char flag;
18 } state_t;
20 #define STATE_REACHABLE (1 << 0)
21 #define STATE_IS_REACHABLE(pstate) (pstate->flag & STATE_REACHABLE)
22 #define STATE_MARK_AS_REACHABLE(pstate) pstate->flag |= STATE_REACHABLE;
24 typedef enum {
25 ST_OK,
26 ST_EXISTS,
27 ST_NOMEM,
28 ST_NOTFOUND
29 } stret_t;
31 typedef struct pqnode {
32 void *data;
33 unsigned int evtkey;
34 unsigned int prio;
35 STAILQ_ENTRY(pqnode) pq_next;
36 } pqnode_t;
38 typedef struct fsm {
39 htable_t *sttable; /* hash table for states */
40 state_t *cstate; /* current state of fsm */
41 unsigned int nqueues; /* number of priority queues */
42 void *mobj; /* mutual exclusion object */
43 void (*fsm_pq_lock)(const struct fsm *);
44 void (*fsm_pq_unlock)(const struct fsm *);
45 STAILQ_HEAD(pqhead, pqnode) *pqtable;
46 } fsm_t;
48 typedef struct pqhead pqhead_t;
50 typedef enum {
51 FSM_CLEAN,
52 FSM_DIRTY,
53 FSM_EMPTY,
54 FSM_EPRIO,
55 FSM_EEXISTS,
56 FSM_ENOMEM,
57 FSM_ENOTFOUND,
58 FSM_OK
59 } fsmret_t;
61 #endif /* TYPES_H */