libevl function index
Thread services
| Function name | EVL Switch1 | non-EVL2 |
|---|---|---|
| evl_attach_thread() | N/A | ✅ |
| evl_attach_self() | N/A | ✅ |
| evl_detach_thread() | ▽ | ✕ |
| evl_detach_self() | ▽ | ✕ |
| evl_demote_thread() | ⚊ | ✅ |
| evl_get_self() | ⚊ | ✕ |
| evl_get_state() | ⚊ | ✅ |
| evl_is_inband() | ⚊ | ✅ |
| evl_set_thread_mode() | ⚊ | ✅ |
| evl_subscribe() | ▽ | ✕ |
| evl_switch_inband() | ▽ | ✕ |
| evl_switch_oob() | △ | ✕ |
| evl_unblock_thread() | ⚊ | ✅ |
| evl_unsubscribe() | ▽ | ✕ |
Scheduler services
| Function name | EVL Switch1 | non-EVL2 |
|---|---|---|
| evl_get_schedattr() | ⚊ | ✅ |
| evl_set_schedattr() | ⚊ | ✅ |
| evl_control_sched() | ⚊ | ✅ |
| evl_get_cpustate() | ⚊ | ✅ |
| evl_yield() | △ | ✕ |
Clock services
| Function name | EVL Switch1 | non-EVL2 |
|---|---|---|
| evl_read_clock() | ⚊ | ✅ |
| evl_set_clock() | ⚊ | ✅ |
| evl_get_clock_resolution() | ⚊ | ✅ |
| evl_sleep_until() | △ | ✕ |
| evl_usleep() | △ | ✕ |
Timer services
| Function name | EVL Switch1 | non-EVL2 |
|---|---|---|
| evl_new_timer() | ▽ | ✅ |
| evl_set_timer() | ⚊ | ✅ |
| evl_get_timer() | ⚊ | ✅ |
Mutex services
| Function name | EVL Switch1 | non-EVL2 |
|---|---|---|
| evl_create_mutex() | ▽ | ✅ |
| evl_new_mutex() | ▽ | ✅ |
| evl_open_mutex() | ▽ | ✅ |
| evl_lock_mutex() | △4 | ✕ |
| evl_trylock_mutex() | △4 | ✕ |
| evl_timedlock_mutex() | △4 | ✕ |
| evl_unlock_mutex() | ⚊3 | ✕ |
| evl_get_mutex_ceiling() | ⚊ | ✅ |
| evl_set_mutex_ceiling() | ⚊ | ✅ |
| evl_close_mutex() | ▽ | ✅ |
Read/write locking services
| Function name | EVL Switch1 | non-EVL2 |
|---|---|---|
| evl_create_rwlock() | ▽ | ✅ |
| evl_new_rwlock() | ▽ | ✅ |
| evl_lock_read() | △4 | ✕ |
| evl_trylock_read() | △4 | ✅ |
| evl_unlock_read() | ⚊ | ✅ |
| evl_lock_write() | △4 | ✕ |
| evl_trylock_write() | △4 | ✅ |
| evl_unlock_write() | ⚊ | ✅ |
Event services
| Function name | EVL Switch1 | non-EVL2 |
|---|---|---|
| evl_create_event() | ▽ | ✅ |
| evl_new_event() | ▽ | ✅ |
| evl_open_event() | ▽ | ✅ |
| evl_wait_event() | ⚊4 | ✕ |
| evl_timedwait_event() | ⚊4 | ✕ |
| evl_signal_event() | ⚊4 | ✕ |
| evl_signal_thread() | ⚊4 | ✕ |
| evl_broadcast_event() | ⚊4 | ✕ |
| evl_close_event() | ▽ | ✅ |
Flags services
| Function name | EVL Switch1 | non-EVL2 |
|---|---|---|
| evl_create_flags() | ▽ | ✅ |
| evl_new_flags() | ▽ | ✅ |
| evl_open_flags() | ▽ | ✅ |
| evl_wait_flags() | △4 | ✕ |
| evl_wait_some_flags() | △4 | ✕ |
| evl_wait_exact_flags() | △4 | ✕ |
| evl_timedwait_flags() | △4 | ✕ |
| evl_timedwait_some_flags() | △4 | ✕ |
| evl_timedwait_exact_flags() | △4 | ✕ |
| evl_trywait_flags() | ⚊4 | ✅ |
| evl_trywait_some_flags() | ⚊4 | ✅ |
| evl_trywait_exact_flags() | ⚊4 | ✅ |
| evl_peek_flags() | ⚊ | ✅ |
| evl_post_flags() | ⚊4 | ✅ |
| evl_broadcast_flags() | ⚊4 | ✅ |
| evl_close_flags() | ▽ | ✅ |
Semaphore services
| Function name | EVL Switch1 | non-EVL2 |
|---|---|---|
| evl_create_sem() | ▽ | ✅ |
| evl_new_sem() | ▽ | ✅ |
| evl_open_sem() | ▽ | ✅ |
| evl_get_sem() | △4 | ✕ |
| evl_timedget_sem() | △4 | ✕ |
| evl_tryget_sem() | ⚊4 | ✅ |
| evl_peek_sem() | ⚊ | ✅ |
| evl_put_sem() | ⚊4 | ✅ |
| evl_close_sem() | ▽ | ✅ |
Observable services
| Function name | EVL Switch1 | non-EVL2 |
|---|---|---|
| evl_create_observable() | ▽ | ✅ |
| evl_new_observable() | ▽ | ✅ |
| evl_read_observable() | △5 | ✅ |
| evl_update_observable() | △5 | ✅ |
Polling services
| Function name | EVL Switch1 | non-EVL2 |
|---|---|---|
| evl_new_poll() | ▽ | ✅ |
| evl_add_pollfd() | △ | ✕ |
| evl_mod_pollfd() | △ | ✕ |
| evl_del_pollfd() | △ | ✕ |
| evl_poll_sem() | △ | ✕ |
| evl_timedpoll_sem() | △ | ✕ |
Memory heap services
| Function name | EVL Switch1 | non-EVL2 |
|---|---|---|
| evl_init_heap() | ▽ | ✅ |
| evl_init_heap_unlocked() | ⚊ | ✅ |
| evl_extend_heap() | ⚊ | ✕ |
| evl_extend_heap_unlocked() | ⚊ | ✅ |
| evl_alloc_block() | △3 | ✕ |
| evl_alloc_block_unlocked() | ⚊ | ✅ |
| evl_free_block() | △3 | ✕ |
| evl_free_block_unlocked() | ⚊ | ✅ |
| evl_check_block() | △3 | ✕ |
| evl_check_block_unlocked() | ⚊ | ✅ |
| evl_destroy_heap() | ▽ | ✅ |
| evl_destroy_heap_unlocked() | ⚊ | ✅ |
| evl_heap_raw_size() | ⚊ | ✅ |
| evl_heap_size() | ⚊ | ✅ |
| evl_heap_used() | ⚊ | ✅ |
Proxy services
| Function name | EVL Switch1 | non-EVL2 |
|---|---|---|
| evl_create_proxy() | ▽ | ✅ |
| evl_new_proxy() | ▽ | ✅ |
| evl_write_proxy() | ⚊ | ✅ |
| evl_read_proxy() | ⚊ | ✅ |
| evl_vprint_proxy() | ⚊ | ✅ |
| evl_print_proxy() | ⚊ | ✅ |
| evl_printf() | ⚊ | ✅ |
| evl_eprintf() | ⚊ | ✅ |
| evl_stdout() | ⚊ | ✅ |
| evl_stderr() | ⚊ | ✅ |
Cross-buffer services
| Function name | EVL Switch1 | non-EVL2 |
|---|---|---|
| evl_create_xbuf() | ▽ | ✅ |
| evl_new_xbuf() | ▽ | ✅ |
I/O services
| Function name | EVL Switch1 | non-EVL2 |
|---|---|---|
| oob_read() | △ | ✕ |
| oob_write() | △ | ✕ |
| oob_ioctl() | △ | ✕ |
| oob_sendmsg() | △ | ✕ |
| oob_recvmsg() | △ | ✕ |
| oob_setsockopt() | △ | ✕ |
| oob_getsockopt() | △ | ✕ |
Networking services
| Function name | EVL Switch1 | non-EVL2 |
|---|---|---|
| evl_net_enable_port() | ▽ | ✅ |
| evl_net_disable_port() | ▽ | ✅ |
| evl_net_open_port() | ▽ | ✅ |
| evl_net_query_port() | ▽ | ✅ |
| evl_net_set_filter() | ▽ | ✅ |
| evl_net_solicit() | ▽ | ✅ |
Misc routines
| Function name | EVL Switch1 | non-EVL2 |
|---|---|---|
| evl_init() | N/A | ✅ |
| evl_get_version() | ⚊ | ✅ |
| evl_sigdebug_handler() | N/A | ✅ |
1 Defines the stage switching behavior for EVL threads:
-
△ the core may promote the caller to the out-of-band execution stage if running in-band at the time of the call.
-
▽ the core may demote the caller to the in-band execution stage if running out-of-band at the time of the call.
-
⚊ the call does not entail any stage switch.
2 Whether this call is also available to non-EVL threads, i.e. threads not attached to the EVL core.
3 Except if the caller undergoes the SCHED_WEAK policy, in which case it is switched back to in-band mode if it has released the last EVL mutex it holds by the end of the call.
4 As an exception, if this synchronization object was
statically initialized (EVL_*_INITIALIZER()), this routine may
switch the caller to the in-band stage at the first access in order to
finalize the construction before carrying out the requested
operation. This is required only once in the object’s lifetime.
5 If the caller undergoes the SCHED_WEAK policy, or is not attached to the core, this system call is directly handled from the in-band stage. In all other cases, the caller may be switched to the out-of-band execution stage.
