1 #ifndef __SCALABLE_EVENT_H__
2 #define __SCALABLE_EVENT_H__
3 /*----------------------------------------------------------------------------*/
4 #ifdef NEWEV
5 
6 #include <tree.h>
7 #include <key_value_store.h>
8 #include <mos_api.h>
9 /*----------------------------------------------------------------------------*/
10 #ifndef NDEBUG
11 #define FLOOR(x) (((x) > 0) ? (x) : 0)
12 #define gprintf(f, args...) do { \
13 	printf("%-15s:%-4d:%-10.10s: " f, \
14 			&__FILE__[FLOOR(sizeof(__FILE__) - 16)], \
15 			__LINE__, __func__, ##args); \
16 } while (0)
17 #else /* NDEBUG */
18 #define gprintf(args...) ((void) 0)
19 #endif
20 
21 #ifdef ENABLE_DEBUG_EVENT
22 #define RAISE_DEBUG_EVENT(mtcp, stream, format, args...) \
23 do { \
24 	mtcp_set_debug_string(mtcp, "[%s:%d] "format, __func__, __LINE__, ##args); \
25 	struct socket_map *walk;\
26 	SOCKQ_FOREACH_START(walk, &cur_stream->msocks) { \
27 		HandleCallback(mtcp, MOS_NULL, walk, (stream)->side, \
28 				   NULL, MOS_ON_DEBUG_MESSAGE); \
29 	} SOCKQ_FOREACH_END; \
30 	mtcp_set_debug_string(mtcp, NULL); \
31 } while (0)
32 #else
33 #define RAISE_DEBUG_EVENT(args...) do {} while (0)
34 #endif
35 
36 #ifdef NUM_BEV
37 #undef NUM_BEV
38 #endif
39 #define NUM_BEV 12
40 /*----------------------------------------------------------------------------*/
41 typedef TAILQ_HEAD(_fq, _tree_node_t) fevq_t;
42 
43 typedef struct _tree_node_t {
44 	filter_t ft;
45 	callback_t cb;
46 	event_t ev;
47 	struct filter_arg arg;
48 	_key_t key;
49 	uint32_t is_in_raiseq:1;
50 
51 	TREE_NODE(_tree_node_t) link;
52 	TREE_NODE(_tree_node_t) invk;
53 	TAILQ_ENTRY(_tree_node_t) flink;
54 } tree_node_t;
55 
56 typedef struct _stree_t {
57 	int ref_cnt;
58 	uint64_t id;
59 	tree_node_t *root;
60 	tree_node_t *bevs[NUM_BEV];
61 
62 	fevq_t floating_evq;
63 } stree_t;
64 /*----------------------------------------------------------------------------*/
65 extern inline void
66 stree_inc_ref(stree_t *stree);
67 extern inline void
68 stree_dec_ref(kvs_t *store, stree_t *stree);
69 
70 void
71 GlobInitEvent(void);
72 
73 void
74 InitEvent(mtcp_manager_t mtcp);
75 
76 extern inline void
77 HandleCallback(mtcp_manager_t mtcp, uint32_t hook,
78 		socket_map_t socket, int side, struct pkt_ctx *pctx, event_t events);
79 /*----------------------------------------------------------------------------*/
80 #endif
81 #endif /* __SCALABLE_EVENT_H__ */
82