EM-ODP 4.4.0
Event Machine on ODP
Loading...
Searching...
No Matches
event_machine_init.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018-2026, Nokia Solutions and Networks
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * * Neither the name of the copyright holder nor the names of its
15 * contributors may be used to endorse or promote products derived
16 * from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#ifndef EVENT_MACHINE_INIT_H_
32#define EVENT_MACHINE_INIT_H_
33
34#pragma GCC visibility push(default)
35
36/**
37 * @file
38 * @defgroup init Initialization and termination
39 * Event Machine initialization and termination
40 * @{
41 *
42 * The Event Machine must be initialized before use. One thread (or process)
43 * that will be part of EM needs to call em_init(). Additionally, after the user
44 * has set up the participating threads and pinned them to HW-cores, each thread
45 * needs to run em_init_local() to become EM-cores. Only now is an EM-core ready
46 * to use the other EM API functions and can finally enter the dispatch-loop on
47 * each EM-core via one of the em_dispatch...() APIs to start handling events.
48 *
49 * The EM termination sequence runs in the opposite order: each EM-core needs to
50 * call em_term_local() before one last call to em_term().
51 */
52
60
61#ifdef __cplusplus
62extern "C" {
63#endif
64
65/**
66 * Event Machine run-time configuration options given at startup to em_init()
67 *
68 * The 'em_conf_t' struct should be initialized with em_conf_init() before use.
69 * This initialization provides better backwards compatibility since all options
70 * will be set to default values.
71 * The user must further set the needed configuration and call em_init():
72 *
73 * @code
74 * em_conf_t conf;
75 * em_conf_init(&conf); // init with default values
76 * conf.thread_per_core = 1;
77 * ...
78 * conf.core_count = N; // max number of EM cores for this instance
79 * conf.phys_mask = set N bits; // allowed CPUs for this instance
80 * ...
81 * ret = em_init(&conf); // on one core
82 * ...
83 * em_conf_local_t conf_local;
84 * em_conf_local_init(&conf_local); // init with default values
85 * conf_local.core_type = select EM-core type;
86 * ...
87 * ret = em_init_local(&conf_local); // on each core added to EM
88 * ...
89 * @endcode
90 *
91 * Content is copied into EM by em_init().
92 *
93 * @note Several EM options are configured through compile-time defines.
94 * Run-time options allow using the same EM-lib with different configs.
95 * Also see the overridable EM runtime config file values,
96 * default file: config/em-odp.config
97 *
98 * @see em_conf_init(), em_init()
99 */
100typedef struct {
101 /**
102 * EM device id - use different device ids for each EM instance or
103 * remote EM device that need to communicate with each other.
104 * Default value is 0.
105 */
106 uint16_t device_id;
107
108 /**
109 * Event Timer: enable=1, disable=0.
110 * Default value is 0 (disable).
111 */
113
114 /**
115 * RunMode: EM run with one thread per core.
116 * Set 'true' to select thread-per-core mode.
117 * This is the recommended mode, but the user must explicitly set it to
118 * enable. Default value is 0.
119 * @note The user must set either 'thread_per_core' or
120 * 'process_per_core' but not both.
121 */
123
124 /**
125 * RunMode: EM run with one process per core.
126 * Set 'true' to select process-per-core mode. Default value is 0.
127 * @note The user must set either 'thread_per_core' or
128 * 'process_per_core' but not both.
129 */
131
132 /**
133 * Maximum number of concurrently running EM-cores allowed for this
134 * EM instance.
135 *
136 * The max number of EM-cores is concerned with concurrently running
137 * EM-cores of the type EM_CORE_TYPE_CONTROL or EM_CORE_TYPE_WORKER.
138 * Additionally the user may create threads/processes of type
139 * EM_CORE_TYPE_EXTERNAL that are not included in this max count,
140 * see em_core_type_t.
141 *
142 * EM-core ids will be assigned from the range of 0 to 'core_count-1'
143 * during local initialization. Based on the options given to
144 * em_init_local(), EM-cores will either be assigned in startup/init
145 * order regardless of the actual physical CPU ids, or, based on the
146 * user provided 'core_id'.
147 * Note that the range may be discountiguous if the user removes
148 * EM-cores from the middle of the range (by calling em_term_local()) or
149 * if the user requests specific core-ids with gaps in between.
150 *
151 * The largest value that can be used for 'core_count' is the compile-
152 * time constant EM_MAX_CORES.
153 *
154 * Default value is 0 and needs to be changed by the user.
155 */
156 uint32_t core_count;
157
158 /**
159 * Core mask of physical CPUs allowed for EM-cores on this EM instance
160 * (this is a physical mask even though the 'em_core_mask_t' type is used).
161 *
162 * Similarly to '.core_count', the physical CPU mask is concerned with
163 * concurrently running EM-cores of the type EM_CORE_TYPE_CONTROL or
164 * EM_CORE_TYPE_WORKER.
165 * Additionally the user may create threads/processes of type
166 * EM_CORE_TYPE_EXTERNAL that are not included in this mask,
167 * see em_core_type_t.
168 *
169 * Default value is all-0 and needs to be changed by the user.
170 */
172
173 /**
174 * Pool configuration for the EM default pool (EM_POOL_DEFAULT).
175 * Default value is set by em_pool_cfg_init() and needs to be changed
176 * by the user.
177 *
178 * Note that if the default pool configuration is also given in the
179 * config file through option 'startup_pools', it will override this
180 * default pool configuration.
181 */
183
184 /**
185 * EM log functions.
186 * Default values are NULL and causes EM to use internal default
187 * log-functions.
188 */
189 struct {
190 /** EM log function, user overridable, variable number of args*/
192 /** EM log function, user overridable, va_list */
194 } log;
195
196 /**
197 * User provided API callback hooks.
198 * Set only the needed hooks to avoid performance degradation.
199 * Only used if EM_API_HOOKS_ENABLE != 0
200 */
202
203 /**
204 * User provided idle callback hooks.
205 * Set only the needed hooks to avoid performance degradation.
206 * Only used if EM_IDLE_HOOKS_ENABLE != 0
207 */
209
210 /**
211 * Internal check - don't touch!
212 *
213 * EM will verify that em_conf_init() has been called
214 * before calling em_init().
215 */
217} em_conf_t;
218
219/**
220 * Initialize configuration parameters for em_init()
221 *
222 * Initialize em_conf_t to default values for all fields.
223 * After initialization, the user further needs to set the mandatory fields of
224 * 'em_conf_t' before calling em_init().
225 * Always initialize 'conf' first with em_conf_init(&conf) to
226 * ensure backwards compatibility with potentially added new options.
227 *
228 * @param conf Address of the em_conf_t to be initialized
229 *
230 * @see em_init()
231 */
232void em_conf_init(em_conf_t *conf);
233
234/**
235 * Initialize the Event Machine.
236 *
237 * Must be called once at startup. Additionally an EM-core needs to call the
238 * em_init_local() (or the older em_init_core()) function before using any
239 * further EM API functions/resources.
240 *
241 * @param conf EM global config options
242 *
243 * @return EM_OK if successful.
244 *
245 * @see em_init_local() for EM-core specific init after em_init().
246 */
247em_status_t em_init(const em_conf_t *conf);
248
249/**
250 * Retrieve EM configuration options given to em_init()
251 *
252 * This function returns the configuration options that were provided to
253 * em_init() at initialization time. The function can be called only after
254 * a successful call to em_init().
255 *
256 * See the documentation of each option in em_conf_t for more details.
257 *
258 * @param[out] conf_opts Filled with EM configuration options given to
259 * em_init()
260 *
261 * @return EM_OK if the configuration is written to conf_opts successfully
262 */
263em_status_t em_conf_opts(em_conf_t *conf_opts/*out*/);
264
265/** Print EM configuration options given to em_init(). */
266void em_conf_opts_print(void);
267
268/**
269 * Input poll function - poll various input sources for pkts/events and enqueue
270 * into EM.
271 *
272 * User provided function - EM calls this, if not NULL, in the dispatch loop on
273 * each core - set via 'em_conf_local_t::input_poll_fn'
274 *
275 * @return number of pkts/events received from input and enqueued into EM
276 */
277typedef int (*em_input_poll_func_t)(void);
278
279/**
280 * 'Periodical' draining of output from EM, if needed.
281 *
282 * User provided function - EM calls this, if not NULL, in the dispatch loop on
283 * each core - set via 'em_conf_local_t::output_drain_fn'
284 *
285 * Draining of output events/pkts: EM will every once in a while call this
286 * user provided function to ensure that low rate buffered output is eventually
287 * sent out. Not needed if your EM output queues (EM_QUEUE_TYPE_OUTPUT) always
288 * sends all events out. Useful in situations where output is buffered and sent
289 * out in bursts when enough output has been gathered - single events or low
290 * rate flows may, without this function, never be sent out (or too late) if the
291 * buffering threshold has not been reached.
292 *
293 * @return number of events successfully drained and sent for output
294 */
295typedef int (*em_output_drain_func_t)(void);
296
297/**
298 * Event Machine thread-local configuration options for em_init_local()
299 */
300typedef struct {
301 /**
302 * Worker/control EM-core or external thread (mandatory)
303 */
305
306 /**
307 * Requested core-id for this EM-core - or let EM assign.
308 *
309 * Use '-1' to let EM assign the core-id (default & recommended):
310 * - EM-cores will be assigned an id in startup/init order regardless
311 * of the actual physical CPU ids.
312 *
313 * Use '0' to 'core_count - 1' to request a specific core-id:
314 * - An id will be assigned based on the user provided 'core_id'.
315 * - The user must ensure that the requested 'core_id' is not already
316 * in use or EM local initialization will fail!
317 *
318 * The max value is set by em_conf_t::core_count, thus the allowed range
319 * is from 0 to 'core_count - 1' (where 'core_count' <= EM_MAX_CORES).
320 *
321 * Note that the range may be discountiguous if the user removes
322 * EM-cores from the middle of the range (by calling em_term_local()) or
323 * if the user requests specific core-ids with gaps in between.
324 *
325 * Only valid for EM-cores of the type EM_CORE_TYPE_WORKER and
326 * EM_CORE_TYPE_CONTROL.
327 * Ignored for EM external threads/processes: EM_CORE_TYPE_EXTERNAL.
328 */
329 int core_id; /* -1: let EM assign (default)*/
330
331 /**
332 * User provided function, called from within the EM-dispatch
333 * loop, mainly for polling various input sources for events or
334 * pkts and then enqueue them into EM.
335 * Set to 'NULL' if not needed (default).
336 *
337 * Only valid for EM-cores of the type EM_CORE_TYPE_WORKER and
338 * EM_CORE_TYPE_CONTROL. External threads do not dispatch and can thus
339 * not utilize this functionality.
340 */
342
343 /**
344 * User provided function, called from within the EM-dispatch
345 * loop, mainly for 'periodical' draining of buffered output to
346 * make sure events/pkts are eventually sent out even if the
347 * rate is low or stops for a while.
348 * Set to 'NULL' if not needed (default).
349 *
350 * Only valid for EM-cores of the type EM_CORE_TYPE_WORKER and
351 * EM_CORE_TYPE_CONTROL. External threads do not dispatch and can thus
352 * not utilize this functionality.
353 */
355
356 /**
357 * Internal check - don't touch!
358 *
359 * EM will verify that em_conf_local_init() has been called
360 * before calling em_init_local().
361 */
364
365/**
366 * Initialize configuration parameters for em_init_local()
367 *
368 * Initialize em_conf_local_t to default values for all fields.
369 * After initialization, the user further needs to set the mandatory fields of
370 * 'em_conf_local_t' before calling em_init_local().
371 * Always initialize 'conf_local' first with em_conf_local_init(&conf_local) to
372 * ensure backwards compatibility with potentially added new options.
373 *
374 * @param conf_local Address of the em_conf_local_t to be initialized
375 *
376 * @see em_init_local()
377 */
378void em_conf_local_init(em_conf_local_t *conf_local);
379
380/**
381 * Initialize the current thread/process as a worker, control or external EM-core.
382 *
383 * Must be called once by each thread/process that needs access to EM resources
384 * within the instance.
385 *
386 * @note
387 * Pin the thread or process to the desired physical cpu(s)/core(s) before
388 * calling this function.
389 * The pinning depends on the EM-core type set in 'em_conf_local_t::core_type':
390 * - EM_CORE_TYPE_WORKER: pin to a unique physical cpu/core allowed by
391 * 'em_conf_t::phys_mask' as given to em_init().
392 * - EM_CORE_TYPE_CONTROL: pin to a set of cpus/cores allowed by
393 * 'em_conf_t::phys_mask' as given to em_init().
394 * - EM_CORE_TYPE_EXTERNAL: no restrictions on pinning.
395 *
396 * @note
397 * em_conf_local_init(&conf_local) must be called before setting the mandatory
398 * fields of 'em_conf_local_t' and calling em_init_local().
399 *
400 * @param conf_local
401 *
402 * @return EM_OK if successful.
403 *
404 * @see em_core_type_t for a description of the core types.
405 */
406em_status_t em_init_local(const em_conf_local_t *conf_local);
407
408/**
409 * Retrieve EM core-local configuration options given to em_init_local()
410 * or used by em_init_core().
411 *
412 * This function returns the configurations of the calling EM-core and can
413 * be called only after a successful call to em_init_local()/em_init_core().
414 *
415 * @note Retrieving configurations for cores other than the calling core is
416 * not supported.
417 *
418 * @param[out] conf_local_opts Filled with EM core-local configuration
419 * options given to em_init_local() or used
420 * by em_init_core().
421 *
422 * @return EM_OK if the configuration is written to conf_local_opts successfully
423 */
424em_status_t em_conf_local_opts(em_conf_local_t *conf_local_opts/*out*/);
425
426/**
427 * Print EM core-local configuration options given to em_init_local() or used
428 * by em_init_core().
429 *
430 * @note This function prints configurations of the calling EM-core and can
431 * be called only after a successful call to em_init_local() or
432 * em_init_core(). Printing configurations for cores other than the
433 * calling core is not supported.
434 */
435void em_conf_local_opts_print(void);
436
437/**
438 * Initialize the current thread/process as a worker EM-core.
439 *
440 * EM resources can be created after a successful call to this function and the
441 * worker EM-core can start dispatching events.
442 *
443 * @note
444 * The thread or process must be pinned to a unique physical core before
445 * running em_init_core().
446 *
447 * @note
448 * Prefer using the newer em_init_local()/em_term_local() sequence over the
449 * older em_init_core()/em_term_core().
450 *
451 * Using this function is similar to
452 * em_init_local(em_conf_local_t::core_type=EM_CORE_TYPE_WORKER)
453 * without the extra options provided by 'em_conf_local_t'.
454 *
455 * @return EM_OK if successful.
456 *
457 * @see em_init()
458 */
460
461/**
462 * Event Machine thread-local termination configuration options for
463 * em_term_local().
464 */
465typedef struct {
466 struct {
467 /**
468 * Select: Use the option 'flush_orphans' below or use the
469 * global default value from the EM config file.
470 * false: Use 'queue_group.term_local_flush_orphans' from the
471 * EM config file (default).
472 * true: Override the EM config file setting for this EM-core's
473 * termination and use the option '.flush_orphans' below.
474 *
475 * Only valid for EM-cores of the type EM_CORE_TYPE_WORKER and
476 * EM_CORE_TYPE_CONTROL. External threads do not dispatch and
477 * can thus not utilize this functionality.
478 */
479 bool in_use;
480 /**
481 * Flush events from orphaned queue groups during EM-core local
482 * termination (true/false) - only evaluated if '.in_use=true'.
483 *
484 * During EM-core local termination: flush the scheduler from
485 * events from queues that belong to queue groups that only this
486 * terminating EM-core is handling.
487 * This may be needed to avoid events being stuck in the
488 * scheduler when an EM-core is terminating and orphaned queue
489 * groups exist with queues that still have events in them.
490 * Alternatively, the application may modify the orphan
491 * queue group(s) to have another EM-core handle the events,
492 * or create a new EM-core after EM-core termination on another
493 * cpu - then no flushing is needed (use 'false').
494 *
495 * Overrides the config file value
496 * 'queue_group.term_local_flush_orphans' for the termination
497 * of this EM-core.
498 * false: don't flush orphaned queue groups (default).
499 * true: flush orphaned queue groups.
500 *
501 * Only valid for EM-cores of the type EM_CORE_TYPE_WORKER and
502 * EM_CORE_TYPE_CONTROL. External threads do not dispatch and
503 * can thus not utilize this functionality.
504 */
506 } queue_group_flush;
507
508 /**
509 * Internal check - don't touch!
510 *
511 * EM will verify that em_term_local_init() has been called
512 * before calling em_term_local().
513 */
516
517/**
518 * Initialize configuration parameters for em_term_local()
519 *
520 * Initialize em_term_local_t to default values for all fields.
521 * After initialization, the user further needs to set the mandatory fields of
522 * 'em_term_local_t' before calling em_term_local().
523 * Always initialize 'term_local' first with em_term_local_init(&term_local)
524 * to ensure backwards compatibility with potentially added new options.
525 *
526 * @param term_local Address of the em_term_local_t to be initialized
527 *
528 * @see em_term_local()
529 */
530void em_term_local_init(em_term_local_t *term_local);
531
532/**
533 * Local terminatation of a thread set up to run EM
534 *
535 * Local termination is required by each worker, control and external EM-core
536 * before one call to em_term().
537 *
538 * The EM worker and control cores will leave all queue groups before returning.
539 *
540 * @note
541 * em_term_local_init(&term_local) must be called before setting the
542 * fields of 'em_term_local_t' and calling em_term_local().
543 *
544 * @return EM_OK if successful
545 */
546em_status_t em_term_local(const em_term_local_t *term_local);
547
548/**
549 * Local terminatation of a worker EM-core.
550 *
551 * Local termination on a worker EM-core initialized by em_init_core()
552 * (or by em_init_local(em_conf_local_t::core_type=EM_CORE_TYPE_WORKER)).
553 * Local termination is required on all EM-cores before one call to em_term().
554 *
555 * @note
556 * Prefer using the newer em_init_local()/em_term_local() sequence over the
557 * older em_init_core()/em_term_core().
558 *
559 * The EM-core will leave all queue groups before returning.
560 *
561 * @return EM_OK if successful.
562 *
563 * @see em_term()
564 */
566
567/**
568 * Terminate the Event Machine.
569 *
570 * Called once at exit. Additionally, before the one final call to em_term(),
571 * each EM-core (and EM external thread) needs to call the em_term_local()
572 * function to free up local resources.
573 *
574 * @return EM_OK if successful.
575 *
576 * @see em_term_core() for EM-core specific termination before em_term().
577 */
578em_status_t em_term(void);
579
580/**
581 * Return the EM device-id for this instance.
582 *
583 * This is a convenience function that returns the EM device-id given by the
584 * user to em_init() via the em_conf_t::device_id field.
585 *
586 * The function should only be called after a successful EM initialization.
587 *
588 * @return the device-id of this EM instance.
589 */
590uint16_t em_device_id(void);
591
592/**
593 * EM startup pool configuration
594 */
595typedef struct {
596 em_pool_t pool;
597 char name[EM_POOL_NAME_LEN];
598 em_pool_cfg_t cfg;
600
601/**
602 * EM config options read from the config file
603 *
604 * See the config/em-odp.conf file for description of the options.
605 */
606typedef struct {
607 struct {
608 int enable;
609 const char *ip_addr;
610 int port;
611 } cli;
612
613 struct {
614 unsigned int poll_ctrl_interval;
615 uint64_t poll_ctrl_interval_ns;
616
617 unsigned int poll_drain_interval;
618 uint64_t poll_drain_interval_ns;
619
620 uint64_t sched_wait_ns;
621 bool sched_pause;
622 } dispatch;
623
624 struct {
625 bool start_local_fn_at_init;
626 bool stop_local_fn_at_term;
627 } eo;
628
629 struct {
630 int enable;
631 int store_state;
632 int store_first_u32;
633 int prealloc_pools;
634 } esv;
635
636 struct {
637 bool order_keep;
638 unsigned int num_order_queues;
639 } event_chaining;
640
641 struct {
642 em_pool_stats_opt_t statistics;
643 unsigned int align_offset; /* bytes */
644 size_t user_area_size; /* bytes */
645 unsigned int pkt_headroom; /* bytes */
646 } pool;
647
648 struct {
649 unsigned int num_static;
650 unsigned int num_dynamic;
651 unsigned int num_aggr;
652 unsigned int min_events_default;
653 struct {
654 int map_mode;
655 int custom_map[EM_QUEUE_PRIO_NUM];
656 } priority;
657 } queue;
658
659 struct {
660 bool create_core_queue_groups;
661 bool term_local_flush_orphans;
662 } queue_group;
663
664 struct {
665 bool shared_tmo_pool_enable;
666 uint32_t shared_tmo_pool_size;
667 uint32_t tmo_pool_cache;
668 struct {
669 uint32_t timer_event_pool_size;
670 uint32_t timer_event_pool_cache;
671 } ring;
672 } timer;
673
674 struct {
675 enum {
676 /* Using ODP packet vectors*/
677 EM_VECTOR_BACKEND_PACKET = 1,
678 /* Using ODP event vectors */
679 EM_VECTOR_BACKEND_EVENT = 2
680 } backend;
681
682 const char *backend_str;
683 } vector;
684
685 struct {
686 uint32_t num;
688 } startup_pools;
690
691/**
692 * Retrieve current EM config file options
693 *
694 * This function populates cfgfile_opts with the configuration options read
695 * from the config file specified by the EM_CONFIG_FILE environment variable.
696 * If an option is not set in the config file, the default value defined in
697 * config/em-odp.conf is used. The function can be called only after a
698 * successful call to em_init().
699 *
700 * See the documentation of each option for more details in config/em-odp.conf.
701 *
702 * @param[out] cfgfile_opts Filled with the combined options from the default
703 * config file and the config file specified by
704 * EM_CONFIG_FILE
705 *
706 * @return EM_OK if the configuration is written to cfgfile_opts successfully
707 */
708em_status_t em_cfgfile_opts(em_cfgfile_opts_t *cfgfile_opts/*out*/);
709
710/** Print EM config options set in the config file. */
711void em_cfgfile_opts_print(void);
712
713/**
714 * @}
715 */
716#ifdef __cplusplus
717}
718#endif
719
720#pragma GCC visibility pop
721#endif /* EVENT_MACHINE_INIT_H_ */
#define EM_CONFIG_POOLS
#define EM_QUEUE_PRIO_NUM
#define EM_POOL_NAME_LEN
em_core_type_t
uint32_t em_status_t
int(* em_log_func_t)(em_log_level_t level, const char *fmt,...) __attribute__((format(printf
int(*) typedef int(* em_vlog_func_t)(em_log_level_t level, const char *fmt, va_list args)
em_status_t em_term(void)
em_status_t em_conf_local_opts(em_conf_local_t *conf_local_opts)
em_status_t em_term_local(const em_term_local_t *term_local)
int(* em_input_poll_func_t)(void)
em_status_t em_conf_opts(em_conf_t *conf_opts)
void em_term_local_init(em_term_local_t *term_local)
void em_cfgfile_opts_print(void)
void em_conf_local_init(em_conf_local_t *conf_local)
em_status_t em_init_local(const em_conf_local_t *conf_local)
em_status_t em_term_core(void)
void em_conf_local_opts_print(void)
void em_conf_init(em_conf_t *conf)
em_status_t em_init(const em_conf_t *conf)
em_status_t em_cfgfile_opts(em_cfgfile_opts_t *cfgfile_opts)
uint16_t em_device_id(void)
void em_conf_opts_print(void)
em_status_t em_init_core(void)
int(* em_output_drain_func_t)(void)
em_input_poll_func_t input_poll_fn
em_output_drain_func_t output_drain_fn
em_core_type_t core_type
em_log_func_t log_fn
uint32_t core_count
em_api_hooks_t api_hooks
em_vlog_func_t vlog_fn
em_pool_cfg_t default_pool_cfg
em_core_mask_t phys_mask
uint32_t __internal_check
em_idle_hooks_t idle_hooks