38 #ifndef EM_EVENT_GROUP_H_
39 #define EM_EVENT_GROUP_H_
45 #define invalid_egrp(event_group) \
46 ((unsigned int)egrp_hdl2idx((event_group)) >= EM_MAX_EVENT_GROUPS)
49 event_group_init(
event_group_tbl_t *
const event_group_tbl, odp_stash_t *
const event_group_pool);
54 event_group_alloc(
void);
57 event_group_free(em_event_group_t event_group);
66 egrp_hdl2idx(
const em_event_group_t event_group)
68 return (
int)((uintptr_t)event_group - 1);
71 static inline em_event_group_t
72 egrp_idx2hdl(
const int event_group_idx)
74 return (em_event_group_t)(uintptr_t)(event_group_idx + 1);
78 event_group_elem_get(
const em_event_group_t event_group)
80 const int egrp_idx = egrp_hdl2idx(event_group);
86 egrp_elem = &
em_shm->event_group_tbl.egrp_elem[egrp_idx];
91 static inline uint64_t
96 egrp_count.all = EM_ATOMIC_GET(&egrp_elem->post.atomic);
98 return egrp_count.
gen;
106 set_local_safe(
const em_event_group_t egrp,
const int32_t egrp_gen,
107 const unsigned int decr)
110 uint64_t current_count;
115 current_count = EM_ATOMIC_GET(&egrp_elem->pre.atomic);
116 new_count.all = current_count;
117 new_count.
count -= decr;
119 if (unlikely(new_count.
count < 0 ||
120 new_count.
gen != egrp_gen)) {
123 "Expired event group event received!");
127 }
while (!EM_ATOMIC_CMPSET(&egrp_elem->pre.atomic,
128 current_count, new_count.all));
143 event_group_set_local(
const em_event_group_t egrp,
const int32_t egrp_gen,
144 const unsigned int decr)
152 set_local_safe(egrp, egrp_gen, decr);
164 static inline int64_t
166 const unsigned int decr)
168 uint64_t current_count;
172 current_count = EM_ATOMIC_GET(&egrp_elem->post.atomic);
173 new_count.all = current_count;
174 new_count.
count -= decr;
176 if (unlikely(new_count.
count < 0 ||
179 if (!egrp_elem->
ready)
182 "Expired grp event in post cnt!"
186 }
while (!EM_ATOMIC_CMPSET(&egrp_elem->post.atomic, current_count,
188 return new_count.
count;
197 event_group_count_decrement(
const unsigned int decr)
204 count = count_decrement_safe(egrp_elem, decr);
206 count = EM_ATOMIC_SUB_RETURN(&egrp_elem->post.atomic, decr);
208 if (unlikely(count < 0)) {
209 if (egrp_elem->
ready) {
211 egrp_elem->post.
all = 0;
217 "Group count already 0!");
227 egrp_elem->pre.count = 0;
229 const int num_notif = egrp_elem->
num_notif;
235 for (
int i = 0; i < num_notif; i++) {
236 notif_tbl[i].
event = egrp_elem->notif_tbl[i].event;
237 notif_tbl[i].
queue = egrp_elem->notif_tbl[i].queue;
238 notif_tbl[i].
egroup = egrp_elem->notif_tbl[i].egroup;
241 egrp_elem->
ready =
true;
243 if (unlikely(ret !=
EM_OK))
245 "send notifs failed");
250 save_current_evgrp(em_event_group_t *save_egrp ,
252 int32_t *save_egrp_gen )
262 restore_current_evgrp(
const em_event_group_t saved_egrp,
264 const int32_t saved_egrp_gen)
274 event_group_count(
void);
#define INTERNAL_ERROR(error, escope, fmt,...)
void event_group_info_print(void)
em_status_t send_notifs(const int num_notif, const em_notif_t notif_tbl[])
Helper func to send notifications events.
ENV_LOCAL em_locm_t em_locm
#define EM_EVENT_GROUP_SAFE_MODE
#define EM_EVENT_GROUP_MAX_NOTIF
#define EM_MAX_EVENT_GROUPS
#define EM_ESCOPE_EVENT_GROUP_UPDATE
#define EM_EVENT_GROUP_UNDEF
event_group_elem_t * egrp_elem
em_locm_current_t current