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