38 COMPILE_TIME_ASSERT(
sizeof(_ev_hdr__size_check__arr_t) ==
47 EM_CHECK_LEVEL__BAD_VALUE);
54 void print_event_info(
void)
59 "event-hdr size: %zu B\n",
62 EM_DBG(
"\t\toffset\tsize\n"
64 "esv.state_cnt:\t%3zu B\t%2zu B\n"
65 "esv.state:\t%3zu B\t%2zu B\n"
66 "flags:\t\t%3zu B\t%2zu B\n"
67 "align_offset:\t%3zu B\t%2zu B\n"
68 "event_type:\t%3zu B\t%2zu B\n"
69 "event:\t\t%3zu B\t%2zu B\n"
70 "event_size:\t%3zu B\t%2zu B\n"
71 "egrp_gen:\t%3zu B\t%2zu B\n"
72 "egrp:\t\t%3zu B\t%2zu B\n"
73 "tmo:\t\t%3zu B\t%2zu B\n"
74 "user_area info:\t%3zu B\t%2zu B\n"
75 "end_hdr_data:\t%3zu B\t%2zu B\n"
77 "end:\t\t%3zu B\t%2zu B\n",
106 uint32_t offset, uint32_t size,
107 bool clone_uarea,
bool is_clone_part)
109 odp_packet_t clone_pkt;
113 clone_pkt = odp_packet_copy_part(pkt, offset, size, pkt_pool);
114 if (unlikely(clone_pkt == ODP_PACKET_INVALID))
117 const void *src_odp_uarea = odp_packet_user_area(pkt);
118 void *dst_odp_uarea = odp_packet_user_area(clone_pkt);
123 uint32_t src_uarea_size = odp_packet_user_area_size(pkt);
124 uint32_t dst_uarea_size = odp_packet_user_area_size(clone_pkt);
126 if (unlikely(dst_uarea_size < src_uarea_size)) {
127 odp_packet_free(clone_pkt);
131 cpy_size = src_uarea_size;
134 memcpy(dst_odp_uarea, src_odp_uarea, cpy_size);
137 clone_pkt = odp_packet_copy(pkt, pkt_pool);
138 if (unlikely(clone_pkt == ODP_PACKET_INVALID))
144 odp_event_t odp_clone_event = odp_packet_to_event(clone_pkt);
145 event_hdr_t *clone_hdr = odp_packet_user_area(clone_pkt);
146 em_event_t clone_event = event_odp2em(odp_clone_event);
153 clone_event =
evstate_init(clone_event, clone_hdr,
false);
155 clone_hdr->
event = clone_event;
157 clone_hdr->
flags.all = 0;
169 const uint32_t qidx = output_q_elem->output.
idx;
171 if (track->used_queues[qidx] == NULL) {
172 track->used_queues[qidx] = output_q_elem;
173 track->idx[track->idx_cnt++] = qidx;
180 const em_queue_t output_queue = (em_queue_t)(uintptr_t)output_q_elem->
queue;
183 void *
const output_fn_args =
186 const int deq_max = 32;
188 em_event_t output_ev_tbl[deq_max];
190 odp_event_t *
const odp_deq_events = (odp_event_t *)output_ev_tbl;
192 const odp_queue_t odp_queue = output_q_elem->
odp_queue;
193 unsigned int output_num;
197 const bool esv_ena = esv_enabled();
200 deq = odp_queue_deq_multi(odp_queue,
203 if (unlikely(deq <= 0))
206 output_num = (
unsigned int)deq;
212 event_to_hdr_multi(output_ev_tbl, ev_hdrs, output_num);
213 for (
unsigned int i = 0; i < output_num; i++)
214 output_ev_tbl[i] = ev_hdrs[i]->event;
217 ret = output_fn(output_ev_tbl, output_num,
218 output_queue, output_fn_args);
220 if (unlikely((
unsigned int)ret != output_num))
226 output_queue_buffering_drain(
void)
230 for (
unsigned int i = 0; i < track->idx_cnt; i++) {
231 int qidx = track->idx[i];
233 env_spinlock_t *lock = &output_q_elem->output.
lock;
239 if (env_spinlock_trylock(lock)) {
240 output_queue_drain(output_q_elem);
241 env_spinlock_unlock(lock);
245 track->used_queues[qidx] = NULL;
250 uint32_t event_vector_tbl(em_event_t vector_event,
251 em_event_t **event_tbl )
253 odp_event_t odp_event = event_em2odp(vector_event);
254 odp_packet_vector_t pkt_vec = odp_packet_vector_from_event(odp_event);
255 odp_packet_t *pkt_tbl = NULL;
256 const int pkts = odp_packet_vector_tbl(pkt_vec, &pkt_tbl);
258 *event_tbl = (em_event_t *)pkt_tbl;
270 odp_packet_t odp_pkttbl[pkts];
276 events_em2pkt(*event_tbl, odp_pkttbl, pkts);
278 event_init_pkt_multi(odp_pkttbl , *event_tbl ,
279 ev_hdr_tbl , pkts,
false);
281 event_init_pkt_multi(pkt_tbl , *event_tbl ,
282 ev_hdr_tbl , pkts,
false);
288 em_status_t event_vector_max_size(em_event_t vector_event, uint32_t *max_size ,
291 odp_event_t odp_event = event_em2odp(vector_event);
292 odp_packet_vector_t pktvec = odp_packet_vector_from_event(odp_event);
293 odp_pool_t odp_pool = odp_packet_vector_pool(pktvec);
295 em_pool_t pool = (em_pool_t)(uintptr_t)pool_subpool.pool;
296 int subpool = pool_subpool.subpool;
310 if (unlikely(!pool_elem ||
314 "Invalid pool:%" PRI_POOL "", pool);
321 "Subpool not found, pool:%" PRI_POOL "", pool);
325 *max_size = pool_elem->
size[subpool];
#define INTERNAL_ERROR(error, escope, fmt,...)
em_event_t pkt_clone_odp(odp_packet_t pkt, odp_pool_t pkt_pool, uint32_t offset, uint32_t size, bool clone_uarea, bool is_clone_part)
em_event_t evstate_init(const em_event_t event, event_hdr_t *const ev_hdr, bool is_extev)
struct event_hdr event_hdr_t
ENV_LOCAL em_locm_t em_locm
int(* em_output_func_t)(const em_event_t events[], const unsigned int num, const em_queue_t output_queue, void *output_fn_args)
#define EM_EVENT_GROUP_UNDEF
void em_free_multi(em_event_t events[], int num)
output_queue_track_t output_queue_track
em_output_func_t output_fn
union event_hdr::@34 flags
em_output_queue_conf_t output_conf