37#ifndef EM_EVENT_GROUP_H_
38#define EM_EVENT_GROUP_H_
56#if EM_EVENT_GROUP_SAFE_MODE
58#define EGRP_CNT_ERROR(err, escope, egrp_cnt, fmt, ...) \
59 INTERNAL_ERROR((err), (escope), \
60 fmt "\n pre_cnt:%u post_cnt:%u gen:%u applied:%s\n", \
62 (uint32_t)(egrp_cnt).pre_cnt, (uint32_t)(egrp_cnt).post_cnt, \
63 (uint32_t)(egrp_cnt).gen, (egrp_cnt).applied ? "true" : "false")
66#define EGRP_CNT_ERROR(err, escope, egrp_cnt, fmt, ...) \
67 INTERNAL_ERROR((err), (escope), \
68 fmt "\n post_cnt:%u gen:%u applied:%s\n", \
70 (uint32_t)(egrp_cnt).post_cnt, (uint32_t)(egrp_cnt).gen, \
71 (egrp_cnt).applied ? "true" : "false")
74#define invalid_egrp(event_group) \
75 ((unsigned int)egrp_hdl2idx((event_group)) >= EM_MAX_EVENT_GROUPS)
78 odp_stash_t *
const event_group_pool);
81em_event_group_t event_group_alloc(
void);
82em_status_t event_group_free(em_event_group_t event_group);
91egrp_hdl2idx(
const em_event_group_t event_group)
93 return (
int)((uintptr_t)event_group - 1);
96static inline em_event_group_t
97egrp_idx2hdl(
const int event_group_idx)
99 return (em_event_group_t)(uintptr_t)(event_group_idx + 1);
103event_group_elem_get(
const em_event_group_t event_group)
105 const int egrp_idx = egrp_hdl2idx(event_group);
111 egrp_elem = &
em_shm->event_group_tbl.egrp_elem[egrp_idx];
118 const uint32_t event_egrp_gen)
121 egrp_cnt.
gen != event_egrp_gen)) {
123 "Expired event(s) or inv. decr in event group:%" PRI_EGRP ":\n"
124 " event-egrp-gen:%u, decr:%u",
125 egrp_elem->event_group, event_egrp_gen, decr);
140 uint32_t event_egrp_gen)
150 if (unlikely(!valid_pre_cnt(egrp_elem, egrp_cnt, decr, event_egrp_gen)))
171event_group_set_local(em_event_group_t egrp, uint32_t event_egrp_gen,
unsigned int decr)
180 if (unlikely(!egrp_elem))
184 bool valid_precnt = pre_count_decrement(egrp_elem, decr, event_egrp_gen);
186 if (unlikely(!valid_precnt)) {
198 const unsigned int decr,
const uint32_t egrp_gen)
200 if (unlikely(egrp_cnt.
post_cnt < decr || egrp_cnt.
gen != egrp_gen)) {
204 "Expired event(s) or inv. decr in event group:%" PRI_EGRP ":\n"
205 " current-egrp-gen:%u, decr:%u",
206 egrp_elem->event_group, egrp_gen, decr);
219 const unsigned int decr,
232 succ_mo = __ATOMIC_RELAXED;
241 if (unlikely(!valid_post_cnt(egrp_elem, egrp_cnt, decr, egrp_gen)))
253 for (
int i = 0; i < num_notif; i++) {
264 succ_mo = __ATOMIC_RELEASE;
284event_group_count_decrement(
const unsigned int decr,
event_group_elem_t *
const egrp_elem)
289 const int num_notif = post_count_decrement(egrp_elem, decr, notif_tbl );
295 if (unlikely(ret !=
EM_OK))
297 "send notifs failed");
303 uint32_t *save_egrp_gen )
313 const uint32_t saved_egrp_gen)
321unsigned int event_group_count(
void);
336 em_event_group_t event_group);
#define INTERNAL_ERROR(error, escope, fmt,...)
void event_group_info_print(void)
em_status_t send_ctrl_queue(em_event_t event, em_queue_t queue, em_event_group_t event_group)
#define EGRP_CNT_ERROR(err, escope, egrp_cnt, fmt,...)
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_EVENT_GROUP_UNDEF
event_group_elem_t * egrp_elem
em_locm_current_t current
em_notif_t notif_tbl[EM_EVENT_GROUP_MAX_NOTIF]