59#include "em_libconfig.h"
77 void (*f_done_callback)(
void *arg_ptr);
92eo_start_done_callback(
void *args);
94eo_start_sync_done_callback(
void *args);
97eo_stop_done_callback(
void *args);
99eo_stop_sync_done_callback(
void *args);
104eo_remove_queue_done_callback(
void *args);
107eo_remove_queue_sync_local(
const eo_elem_t *eo_elem,
110eo_remove_queue_sync_done_callback(
void *args);
113eo_remove_queue_all_local(
const eo_elem_t *eo_elem,
int delete_queues);
115eo_remove_queue_all_done_callback(
void *args);
118eo_remove_queue_all_sync_local(
const eo_elem_t *eo_elem,
int delete_queues);
120eo_remove_queue_all_sync_done_callback(
void *args);
122static int read_config_file(
void)
124 const char *conf_str;
125 bool val_bool =
false;
128 EM_PRINT(
"EM EO config:\n");
133 conf_str =
"eo.start_local_fn_at_init";
134 ret = em_libconfig_lookup_bool(&
em_shm->libconfig, conf_str, &val_bool);
135 if (unlikely(!ret)) {
136 EM_LOG(EM_LOG_ERR,
"Config option '%s' not found\n", conf_str);
140 em_shm->
opt.eo.start_local_fn_at_init = val_bool;
141 EM_PRINT(
" %s: %s(%d)\n", conf_str, val_bool ?
"true" :
"false",
147 conf_str =
"eo.stop_local_fn_at_term";
148 ret = em_libconfig_lookup_bool(&
em_shm->libconfig, conf_str, &val_bool);
149 if (unlikely(!ret)) {
150 EM_LOG(EM_LOG_ERR,
"Config option '%s' not found\n", conf_str);
154 em_shm->
opt.eo.stop_local_fn_at_term = val_bool;
155 EM_PRINT(
" %s: %s(%d)\n", conf_str, val_bool ?
"true" :
"false",
164 return (
eo_elem_t *)((uintptr_t)eo_pool_elem -
174 memset(eo_tbl, 0,
sizeof(
eo_tbl_t));
177 if (read_config_file())
183 eo_elem->
eo = eo_idx2hdl(i);
185 odp_ticketlock_init(&eo_elem->
lock);
187 eo_elem->
stash = ODP_STASH_INVALID;
190 ret = objpool_init(&eo_pool->objpool, objpool_subpools);
195 objpool_add(&eo_pool->objpool, i % objpool_subpools,
198 odp_atomic_init_u32(&
em_shm->eo_count, 0);
210 if (unlikely(eo_pool_elem == NULL))
213 eo_elem = eo_poolelem2eo(eo_pool_elem);
214 odp_atomic_inc_u32(&
em_shm->eo_count);
224 if (unlikely(eo_elem == NULL))
229 objpool_add(&
em_shm->eo_pool.objpool,
231 odp_atomic_dec_u32(&
em_shm->eo_count);
246 err = queue_state_change__check(old_state, new_state, 1);
247 if (unlikely(err !=
EM_OK))
258 q_elem->
eo = (uint16_t)(uintptr_t)eo_elem->
eo;
261 q_elem->
state = new_state;
264 odp_ticketlock_lock(&eo_elem->
lock);
267 odp_ticketlock_unlock(&eo_elem->
lock);
279 err = queue_state_change__check(old_state, new_state, 0);
280 if (unlikely(err !=
EM_OK))
286 q_elem->
state = new_state;
301 odp_ticketlock_lock(&eo_elem->
lock);
302 err = eo_rem_queue_locked(eo_elem, q_elem);
303 odp_ticketlock_unlock(&eo_elem->
lock);
305 if (unlikely(err !=
EM_OK))
316eo_rem_queue_all(
eo_elem_t *
const eo_elem)
322 odp_ticketlock_lock(&eo_elem->
lock);
325 list_for_each(&eo_elem->
queue_list, list_node) {
326 q_elem = eo_queue_node_to_queue_elem(list_node);
328 err = eo_rem_queue_locked(eo_elem, q_elem);
329 if (unlikely(err !=
EM_OK))
333 odp_ticketlock_unlock(&eo_elem->
lock);
343eo_delete_queue_all(
eo_elem_t *
const eo_elem)
348 const char *fail_op =
"eo_rem_queue_locked()";
349 const char *err_str =
"remove queue from EO failed";
351 odp_ticketlock_lock(&eo_elem->
lock);
354 list_for_each(&eo_elem->
queue_list, list_node) {
355 q_elem = eo_queue_node_to_queue_elem(list_node);
357 err = eo_rem_queue_locked(eo_elem, q_elem);
358 if (unlikely(err !=
EM_OK)) {
363 err = queue_delete(q_elem, &err_str);
364 if (unlikely(err !=
EM_OK)) {
365 fail_op =
"queue_delete()";
370 odp_ticketlock_unlock(&eo_elem->
lock);
372 if (unlikely(err !=
EM_OK))
374 "EO:%" PRI_EO " %s(): %s failed: %s (0x%08X(%s))\n",
375 eo_elem->
eo, __func__, fail_op, err_str, err, err_status_str(err));
398 eo_local_func_call_param_init(¶m);
399 param.eo_elem = eo_elem;
402 param.ev_id = EO_START_LOCAL_REQ;
403 param.f_done_callback = eo_start_done_callback;
404 param.num_notif = num_notif;
405 param.notif_tbl = notif_tbl;
406 param.sync_operation =
false;
408 return eo_local_func_call_req(¶m);
416eo_start_done_callback(
void *args)
422 if (unlikely(eo_elem == NULL)) {
424 EM_ESCOPE_EO_START_DONE_CB,
429 if (check_eo_local_status(loc_func_retvals) ==
EM_OK) {
430 ret = queue_enable_all(eo_elem);
439 eo_start_send_buffered_events(eo_elem);
457 eo_local_func_call_param_init(¶m);
458 param.eo_elem = eo_elem;
461 param.ev_id = EO_START_SYNC_LOCAL_REQ;
462 param.f_done_callback = eo_start_sync_done_callback;
464 param.notif_tbl = NULL;
465 param.sync_operation =
true;
467 return eo_local_func_call_req(¶m);
475eo_start_sync_done_callback(
void *args)
482 if (unlikely(eo_elem == NULL)) {
484 EM_ESCOPE_EO_START_SYNC_DONE_CB,
489 if (check_eo_local_status(loc_func_retvals) ==
EM_OK) {
490 ret = queue_enable_all(eo_elem);
515int eo_start_buffer_events(
const em_event_t events[],
int num, em_queue_t queue)
518 const uint16_t qidx = queue_hdl2idx(queue);
522 if (unlikely(eo_elem == NULL))
525 odp_ticketlock_lock(&eo_elem->
lock);
527 for (
int i = 0; i < num; i++) {
530 .evptr = evhdl_tbl[i].evptr};
534 int ret = odp_stash_put_u64(eo_elem->
stash, &entry_tbl[0].u64, num);
536 if (unlikely(ret < 0))
539 odp_ticketlock_unlock(&eo_elem->
lock);
547static void eo_start_send_multi(em_event_t ev_tbl[],
int num,
548 em_queue_t queue, em_event_group_t event_group)
558 if (unlikely(num_sent != num)) {
563 queue, num, num_sent);
575void eo_start_send_buffered_events(
eo_elem_t *
const eo_elem)
578 const unsigned int max_ev = 32;
580 em_event_t ev_tbl[max_ev];
583 odp_ticketlock_lock(&eo_elem->
lock);
595 num = odp_stash_get_u64(eo_elem->
stash, &entry_tbl[0].u64 , max_ev);
597 if (unlikely(num < 0))
599 "odp_stash_get_u64() fails: %d", num);
600 goto buffered_send_exit;
603 for (
int i = 0; i < num; i++)
604 ev_tbl[i] = (em_event_t)(uintptr_t)entry_tbl[i].evptr;
606 event_to_hdr_multi(ev_tbl, ev_hdr_tbl, num);
609 evstate_em2usr_multi(ev_tbl, ev_hdr_tbl, num,
610 EVSTATE__EO_START_SEND_BUFFERED);
619 const int qidx = entry_tbl[tbl_idx].qidx;
620 const em_queue_t queue = queue_idx2hdl(qidx);
621 const em_event_group_t event_group = ev_hdr_tbl[tbl_idx]->
egrp;
624 for (
int i = tbl_idx + 1; i < num &&
625 entry_tbl[i].qidx == qidx &&
626 ev_hdr_tbl[i]->
egrp == event_group; i++) {
631 eo_start_send_multi(&ev_tbl[tbl_idx], batch_cnt, queue, event_group);
633 tbl_idx += batch_cnt;
634 }
while (tbl_idx < num);
638 err = odp_stash_destroy(eo_elem->
stash);
640 eo_elem->
stash = ODP_STASH_INVALID;
641 odp_ticketlock_unlock(&eo_elem->
lock);
645 "odp_stash_destroy() fails: %d", err);
667 eo_local_func_call_param_init(¶m);
668 param.eo_elem = eo_elem;
671 param.ev_id = EO_STOP_LOCAL_REQ;
672 param.f_done_callback = eo_stop_done_callback;
673 param.num_notif = num_notif;
674 param.notif_tbl = notif_tbl;
675 param.sync_operation =
false;
677 return eo_local_func_call_req(¶m);
691 em_eo_t eo = eo_elem->
eo;
692 void *
const eo_ctx = eo_elem->
eo_ctx;
703 memset(&tmp_q_elem, 0,
sizeof(tmp_q_elem));
704 tmp_q_elem.
eo = (uint16_t)(uintptr_t)eo;
723eo_stop_done_callback(
void *args)
728 if (unlikely(eo_elem == NULL)) {
730 EM_ESCOPE_EO_STOP_DONE_CB,
735 em_eo_t eo = eo_elem->
eo;
737 (void)check_eo_local_status(loc_func_retvals);
746 if (unlikely(ret !=
EM_OK))
748 "EO:%" PRI_EO " stop-func failed:%" PRIxSTAT
"", eo, ret);
769 eo_local_func_call_param_init(¶m);
770 param.eo_elem = eo_elem;
773 param.ev_id = EO_STOP_SYNC_LOCAL_REQ;
774 param.f_done_callback = eo_stop_sync_done_callback;
776 param.notif_tbl = NULL;
777 param.sync_operation =
true;
779 return eo_local_func_call_req(¶m);
787eo_stop_sync_done_callback(
void *args)
793 if (unlikely(eo_elem == NULL)) {
795 EM_ESCOPE_EO_STOP_SYNC_DONE_CB,
802 (void)check_eo_local_status(loc_func_retvals);
816 eo_local_func_call_param_init(¶m);
817 param.eo_elem = eo_elem;
818 param.q_elem = q_elem;
820 param.ev_id = EO_REM_QUEUE_LOCAL_REQ;
821 param.f_done_callback = eo_remove_queue_done_callback;
822 param.num_notif = num_notif;
823 param.notif_tbl = notif_tbl;
824 param.sync_operation =
false;
826 return eo_local_func_call_req(¶m);
839eo_remove_queue_done_callback(
void *args)
846 if (unlikely(eo_elem == NULL || q_elem == NULL)) {
848 EM_ESCOPE_EO_REMOVE_QUEUE_DONE_CB,
849 "eo_elem/q_elem is NULL!");
853 (void)check_eo_local_status(loc_func_retvals);
856 ret = eo_rem_queue(eo_elem, q_elem);
858 if (unlikely(ret !=
EM_OK))
867int eo_remove_queue_sync_local_req(
eo_elem_t *
const eo_elem,
872 eo_local_func_call_param_init(¶m);
873 param.eo_elem = eo_elem;
874 param.q_elem = q_elem;
876 param.ev_id = EO_REM_QUEUE_SYNC_LOCAL_REQ;
877 param.f_done_callback = eo_remove_queue_sync_done_callback;
879 param.notif_tbl = NULL;
880 param.sync_operation =
true;
882 return eo_local_func_call_req(¶m);
895eo_remove_queue_sync_done_callback(
void *args)
903 if (unlikely(eo_elem == NULL || q_elem == NULL)) {
905 EM_ESCOPE_EO_REMOVE_QUEUE_SYNC_DONE_CB,
906 "eo_elem/q_elem is NULL!");
912 (void)check_eo_local_status(loc_func_retvals);
915 ret = eo_rem_queue(eo_elem, q_elem);
917 if (unlikely(ret !=
EM_OK))
919 EM_ESCOPE_EO_REMOVE_QUEUE_SYNC_DONE_CB,
930int eo_remove_queue_all_local_req(
eo_elem_t *
const eo_elem,
int delete_queues,
935 eo_local_func_call_param_init(¶m);
936 param.eo_elem = eo_elem;
938 param.delete_queues = delete_queues;
939 param.ev_id = EO_REM_QUEUE_ALL_LOCAL_REQ;
940 param.f_done_callback = eo_remove_queue_all_done_callback;
941 param.num_notif = num_notif;
942 param.notif_tbl = notif_tbl;
943 param.sync_operation =
false;
945 return eo_local_func_call_req(¶m);
949eo_remove_queue_all_local(
const eo_elem_t *eo_elem,
int delete_queues)
958eo_remove_queue_all_done_callback(
void *args)
965 if (unlikely(eo_elem == NULL)) {
967 EM_ESCOPE_EO_REMOVE_QUEUE_ALL_DONE_CB,
972 (void)check_eo_local_status(loc_func_retvals);
976 ret = eo_delete_queue_all(eo_elem);
978 ret = eo_rem_queue_all(eo_elem);
980 if (unlikely(ret !=
EM_OK))
982 "EO:%" PRI_EO " removing all queues failed",
989int eo_remove_queue_all_sync_local_req(
eo_elem_t *
const eo_elem,
int delete_queues)
993 eo_local_func_call_param_init(¶m);
994 param.eo_elem = eo_elem;
996 param.delete_queues = delete_queues;
997 param.ev_id = EO_REM_QUEUE_ALL_SYNC_LOCAL_REQ;
998 param.f_done_callback = eo_remove_queue_all_sync_done_callback;
1000 param.notif_tbl = NULL;
1001 param.sync_operation =
true;
1003 return eo_local_func_call_req(¶m);
1007eo_remove_queue_all_sync_local(
const eo_elem_t *eo_elem,
int delete_queues)
1010 (void)delete_queues;
1016eo_remove_queue_all_sync_done_callback(
void *args)
1024 if (unlikely(eo_elem == NULL)) {
1026 EM_ESCOPE_EO_REMOVE_QUEUE_ALL_SYNC_DONE_CB,
1027 "eo_elem is NULL!");
1033 (void)check_eo_local_status(loc_func_retvals);
1037 ret = eo_delete_queue_all(eo_elem);
1039 ret = eo_rem_queue_all(eo_elem);
1041 if (unlikely(ret !=
EM_OK))
1043 EM_ESCOPE_EO_REMOVE_QUEUE_ALL_SYNC_DONE_CB,
1044 "EO:%" PRI_EO " removing all queues failed",
1058 bool local_fail =
false;
1064 err = loc_func_retvals->
core[idx];
1079 static const char core_err[] =
"coreXX:0x12345678 ";
1081 const size_t err_sz = core_count *
sizeof(core_err);
1082 char errmsg[err_sz];
1088 err = loc_func_retvals->
core[idx];
1090 int n = snprintf(&errmsg[c],
sizeof(core_err),
1091 "core%02d:0x%08X ", idx, err);
1092 if ((
unsigned int)n >=
sizeof(core_err))
1098 errmsg[err_sz - 1] =
'\0';
1101 "\nLocal start function failed on cores:\n"
1109 memset(param, 0,
sizeof(*param));
1132 "Internal event (%u) allocation failed", param->ev_id);
1141 "Internal loc_func_retval_t allocation failed");
1153 odp_rwlock_read_lock(&core_map->
rwlock);
1157 if (core_count == 0) {
1159 odp_rwlock_read_unlock(&core_map->
rwlock);
1165 uint32_t num_reqs = core_count;
1166 uint32_t free_count = num_reqs + 1;
1168 odp_thrmask_t thr_mask;
1174 core_count != (uint32_t)odp_thrmask_count(&thr_mask))) {
1175 odp_rwlock_read_unlock(&core_map->
rwlock);
1179 "Core count mismatch: core_count=%" PRIu32
"\n"
1180 " count:core_mask=%" PRIu32
"\n"
1181 " count:thr_mask=%" PRIu32
"",
1183 odp_thrmask_count(&thr_mask));
1189 i_event->
id = param->ev_id;
1190 i_event->
loc_func.eo_elem = param->eo_elem;
1191 i_event->
loc_func.q_elem = param->q_elem;
1192 i_event->
loc_func.delete_queues = param->delete_queues;
1196 loc_func_retvals->
eo_elem = param->eo_elem;
1197 loc_func_retvals->
q_elem = param->q_elem;
1199 loc_func_retvals->
event = tmp;
1200 odp_atomic_init_u32(&loc_func_retvals->
free_at_zero, free_count);
1202 memset(&loc_func_retvals->
core[0],
EM_OK,
sizeof(loc_func_retvals->
core));
1205 i_event->
loc_func.retvals = loc_func_retvals;
1208 void *f_done_arg_ptr = loc_func_retvals;
1211 param->f_done_callback, f_done_arg_ptr,
1212 param->num_notif, param->notif_tbl,
1213 param->sync_operation);
1215 odp_rwlock_read_unlock(&core_map->
rwlock);
1217 if (unlikely(err)) {
1218 char mask_str[ODP_THRMASK_STR_SIZE];
1219 uint32_t unsent_cnt = err;
1223 cnt = odp_atomic_fetch_sub_u32(&loc_func_retvals->
free_at_zero,
1225 if (cnt == unsent_cnt + 1)
1228 odp_thrmask_to_str(&thr_mask, mask_str, ODP_THRMASK_STR_SIZE);
1230 "send_core_ctrl_events(mask=%s) failed", mask_str);
1247 int delete_queues = i_ev->
loc_func.delete_queues;
1254 case EO_START_SYNC_LOCAL_REQ:
1255 case EO_START_LOCAL_REQ:
1267 memset(&tmp_q_elem, 0,
sizeof(tmp_q_elem));
1268 tmp_q_elem.
eo = (uint16_t)(uintptr_t)eo_elem->
eo;
1279 case EO_STOP_SYNC_LOCAL_REQ:
1280 case EO_STOP_LOCAL_REQ:
1288 memset(&tmp_q_elem, 0,
sizeof(tmp_q_elem));
1289 tmp_q_elem.
eo = (uint16_t)(uintptr_t)eo_elem->
eo;
1301 case EO_REM_QUEUE_LOCAL_REQ:
1302 status = eo_remove_queue_local(eo_elem, q_elem);
1304 case EO_REM_QUEUE_SYNC_LOCAL_REQ:
1305 status = eo_remove_queue_sync_local(eo_elem, q_elem);
1307 case EO_REM_QUEUE_ALL_LOCAL_REQ:
1308 status = eo_remove_queue_all_local(eo_elem, delete_queues);
1310 case EO_REM_QUEUE_ALL_SYNC_LOCAL_REQ:
1311 status = eo_remove_queue_all_sync_local(eo_elem, delete_queues);
1318 if (status !=
EM_OK) {
1323 "EO:%" PRI_EO "-%s:Local func(%" PRIx64
")fail",
1324 eo_elem->
eo, eo_elem->name, f_type);
1334 uint32_t cnt = odp_atomic_fetch_sub_u32(&loc_func_retvals->
free_at_zero, 1);
1336 if (unlikely(cnt == 1)) {
1337 (void)check_eo_local_status(loc_func_retvals);
1342unsigned int eo_count(
void)
1344 return odp_atomic_load_u32(&
em_shm->eo_count);
1347size_t eo_name(
const eo_elem_t *
const eo_elem,
1348 char name[],
const size_t maxlen)
1352 len = strnlen(eo_elem->name,
sizeof(eo_elem->name) - 1);
1353 if (maxlen - 1 < len)
1356 memcpy(name, eo_elem->name, len);
1364 const char *state_str;
1368 state_str =
"UNDEF";
1371 state_str =
"CREATED";
1374 state_str =
"STARTING";
1377 state_str =
"RUNNING";
1380 state_str =
"STOPPING";
1383 state_str =
"ERROR";
1386 state_str =
"UNKNOWN";
1393#define EO_INFO_HDR_FMT \
1394"Number of EOs: %d\n\n" \
1395"ID Name State Start-local Stop-local" \
1396" Multi-rcv Max-events Err-hdl Q-num EO-ctx\n" \
1397"---------------------------------------------------------------------------" \
1398"-----------------------------------------------\n%s\n"
1400#define EO_INFO_LEN 123
1401#define EO_INFO_FMT "%-10" PRI_EO "%-32s%-10s%-13c%-12c%-11c%-12d%-9c%-7d%-6c\n"
1403void eo_info_print_all(
void)
1405 unsigned int num_eo;
1420 const int eo_info_str_len = (num_eo + 10) * EO_INFO_LEN + 1;
1421 char eo_info_str[eo_info_str_len];
1424 eo_elem = eo_elem_get(eo);
1425 if (unlikely(eo_elem == NULL || !eo_allocated(eo_elem))) {
1430 n_print = snprintf(eo_info_str + len,
1431 eo_info_str_len - len,
1432 EO_INFO_FMT, eo, eo_elem->name,
1433 state_to_str(eo_elem->
state),
1440 eo_elem->
eo_ctx ?
'Y' :
'N');
1443 if (n_print >= eo_info_str_len - len)
1452 EM_PRINT(
"No EO has been created!\n");
1460 eo_info_str[len] =
'\0';
1461 EM_PRINT(EO_INFO_HDR_FMT, num_eo, eo_info_str);
1464#define EO_Q_INFO_HDR_FMT \
1465"EO %" PRI_EO "(%s) has %d queue(s):\n\n" \
1466"Handle Name Priority Type State Qgrp" \
1468"---------------------------------------------------------------------------" \
1472#define EO_Q_INFO_LEN 85
1473#define EO_Q_INFO_FMT \
1474"%-10" PRI_QUEUE "%-32s%-10d%-10s%-9s%-10" PRI_QGRP "%-3c\n"
1476void eo_queue_info_print(em_eo_t eo)
1484 const eo_elem_t *eo_elem = eo_elem_get(eo);
1486 if (unlikely(eo_elem == NULL || !eo_allocated(eo_elem))) {
1487 EM_PRINT(
"EO %" PRI_EO " is not created!\n", eo);
1502 const int eo_q_info_str_len = (q_num + 10) * EO_Q_INFO_LEN + 1;
1503 char eo_q_info_str[eo_q_info_str_len];
1506 q_elem = queue_elem_get(q);
1507 if (unlikely(q_elem == NULL || !queue_allocated(q_elem))) {
1514 n_print = snprintf(eo_q_info_str + len,
1515 eo_q_info_str_len - len,
1518 queue_type_str(q_elem->
type),
1519 queue_state_str(q_elem->
state),
1524 if (n_print >= eo_q_info_str_len - len)
1533 EM_PRINT(
"EO %" PRI_EO "(%s) has no queue!\n", eo, eo_elem->name);
1541 eo_q_info_str[len] =
'\0';
1542 EM_PRINT(EO_Q_INFO_HDR_FMT, eo, eo_elem->name, q_num, eo_q_info_str);
1548odp_stash_t eo_start_stash_create(
void)
1550 unsigned int num_obj = 0;
1551 odp_stash_capability_t stash_capa;
1552 odp_stash_param_t stash_param;
1553 odp_stash_t stash = ODP_STASH_INVALID;
1555 int ret = odp_stash_capability(&stash_capa, ODP_STASH_TYPE_FIFO);
1558 return ODP_STASH_INVALID;
1560 odp_stash_param_init(&stash_param);
1562 stash_param.type = ODP_STASH_TYPE_FIFO;
1563 stash_param.put_mode = ODP_STASH_OP_MT;
1564 stash_param.get_mode = ODP_STASH_OP_MT;
1567 num_obj =
em_shm->
opt.queue.min_events_default;
1569 stash_param.num_obj = num_obj;
1572 stash_param.obj_size =
sizeof(uint64_t);
1573 if (stash_param.num_obj > stash_capa.max_num.u64) {
1574 EM_LOG(EM_LOG_PRINT,
1575 "%s(): req stash.num_obj(%" PRIu64
") > capa.max_num.u64(%" PRIu64
").\n"
1576 " ==> using max value:%" PRIu64
"\n", __func__,
1577 stash_param.num_obj, stash_capa.max_num.u64, stash_capa.max_num.u64);
1578 stash_param.num_obj = stash_capa.max_num.u64;
1581 stash_param.cache_size = 0;
1583 stash = odp_stash_create(NULL, &stash_param);
1584 if (unlikely(stash == ODP_STASH_INVALID))
1585 return ODP_STASH_INVALID;
1597void eo_start_local_fn_at_init(
void)
1599 unsigned int num = 0;
1605 DBG_PRINT(
"%s():%d EOs available, EM-core:%02d\n", __func__, num,
em_core_id());
1610 if (likely(eo_elem)) {
1611 odp_ticketlock_lock(&eo_elem->
lock);
1612 bool is_locked =
true;
1613 bool cfg_file_opt =
em_shm->
opt.eo.start_local_fn_at_init;
1622 if (has_local_fn && has_run_mode) {
1624 void *eo_ctx = eo_elem->
eo_ctx;
1626 odp_ticketlock_unlock(&eo_elem->
lock);
1634 odp_ticketlock_unlock(&eo_elem->
lock);
1638 DBG_PRINT(
"%s(): EO local starts done, EM-core:%02d\n", __func__,
em_core_id());
1647void eo_stop_local_fn_at_term(
void)
1649 unsigned int num = 0;
1655 DBG_PRINT(
"%s():%d EOs available, EM-core:%02d\n", __func__, num,
em_core_id());
1660 if (likely(eo_elem)) {
1661 odp_ticketlock_lock(&eo_elem->
lock);
1662 bool is_locked =
true;
1663 bool cfg_file_opt =
em_shm->
opt.eo.stop_local_fn_at_term;
1672 if (has_local_fn && has_run_mode) {
1674 void *eo_ctx = eo_elem->
eo_ctx;
1676 odp_ticketlock_unlock(&eo_elem->
lock);
1684 odp_ticketlock_unlock(&eo_elem->
lock);
1688 DBG_PRINT(
"%s(): EO local stops done, EM-core:%02d\n", __func__,
em_core_id());
#define INTERNAL_ERROR(error, escope, fmt,...)
int send_core_ctrl_events(const odp_thrmask_t *const thr_mask, em_event_t ctrl_event, void(*f_done_callback)(void *arg_ptr), void *f_done_arg_ptr, int num_notif, const em_notif_t notif_tbl[], bool sync_operation)
Sends an internal control event to each thread set in 'mask'.
ENV_LOCAL em_locm_t em_locm
#define EM_QUEUE_NAME_LEN
int em_core_mask_count(const em_core_mask_t *mask)
int em_core_mask_first(const em_core_mask_t *mask)
void em_core_mask_copy(em_core_mask_t *dst, const em_core_mask_t *src)
int em_core_mask_next(const em_core_mask_t *mask, int idx)
#define EM_EVENT_GROUP_UNDEF
em_eo_t em_eo_first(unsigned int *num)
em_status_t(* em_start_local_func_t)(void *eo_ctx, em_eo_t eo)
em_status_t(* em_stop_local_func_t)(void *eo_ctx, em_eo_t eo)
em_queue_t em_eo_queue_next(void)
em_queue_t em_eo_queue_first(unsigned int *num, em_eo_t eo)
@ EM_EO_START_LOCAL_MODE_CONFIG_FILE
@ EM_EO_START_LOCAL_MODE_INIT_RUN
@ EM_EO_STOP_LOCAL_MODE_TERM_RUN
@ EM_EO_STOP_LOCAL_MODE_CONFIG_FILE
int em_send_group_multi(const em_event_t events[], int num, em_queue_t queue, em_event_group_t event_group)
int em_send_multi(const em_event_t events[], int num, em_queue_t queue)
em_event_t em_alloc(uint32_t size, em_event_type_t type, em_pool_t pool)
void em_free_multi(em_event_t events[], int num)
void em_free(em_event_t event)
void * em_event_pointer(em_event_t event)
odp_atomic_u32_t current_core_count
odp_thrmask_t thrmask_emcores
em_core_mask_t logic_mask
em_locm_current_t current
eo_elem_t * start_eo_elem
objpool_elem_t eo_pool_elem
em_error_handler_t error_handler_func
em_eo_stop_local_mode_t stop_local_mode
em_receive_func_t receive_func
em_stop_local_func_t stop_local_func
em_receive_multi_func_t receive_multi_func
odp_atomic_u32_t num_queues
em_eo_start_local_mode_t start_local_mode
em_start_local_func_t start_local_func
eo_elem_t eo_elem[EM_MAX_EOS]
em_status_t core[EM_MAX_CORES]
odp_atomic_u32_t free_at_zero
list_node_t eo_queue_node
em_receive_multi_func_t receive_multi_func
em_queue_group_t queue_group
em_receive_func_t receive_func
struct internal_event_t::@51 loc_func