Rudimentary, non-preemptive task system in portable C, based on Tom Duff's switch-based coroutine trick and a stack of environment structs.
More...
|
const char * | pax_op_to_str (int x) |
|
uint32_t | get_my_xcom_id () |
|
| init_xdr_array (pollfd) free_xdr_array(pollfd) set_xdr_array(pollfd) get_xdr_array(pollfd) init_xdr_array(task_env_p) free_xdr_array(task_env_p) set_xdr_array(task_env_p) get_xdr_array(task_env_p) struct iotasks |
|
static task_env * | extract_first_delayed () |
|
static task_env * | task_ref (task_env *t) |
|
static task_env * | task_unref (task_env *t) |
|
static void | wake_all_io () |
|
static void | task_sys_deinit () |
|
static double | ts_to_sec (struct timespec *ts) |
|
static double | get_monotonic_time () |
|
static double | get_real_time () |
|
static double | xcom_monotonic_seconds (xcom_clock *clock) |
|
static void | xcom_init_clock (xcom_clock *clock) |
|
double | seconds () |
|
double | task_now () |
|
unsigned long long int | get_time_since_the_epoch () |
| Return time in microseconds. More...
|
|
static void | task_queue_siftup (task_queue *q, int n) |
|
static void | task_queue_siftdown (task_queue *q, int l, int n) |
|
static task_env * | task_queue_remove (task_queue *q, int i) |
|
static void | task_queue_insert (task_queue *q, task_env *t) |
|
static int | task_queue_empty (task_queue *q) |
|
static task_env * | task_queue_min (task_queue *q) |
|
static task_env * | task_queue_extractmin (task_queue *q) |
|
static void | task_init (task_env *t) |
| Initialize task memory. More...
|
|
void * | task_allocate (task_env *p, unsigned int bytes) |
| Allocate bytes from pool, initialized to zero. More...
|
|
static task_env * | activate (task_env *t) |
|
static task_env * | deactivate (task_env *t) |
|
void | task_delay_until (double time) |
|
void | task_wait (task_env *t, linkage *queue) |
|
void | task_wakeup (linkage *queue) |
|
static void | task_wakeup_first (linkage *queue) |
|
channel * | channel_init (channel *c, unsigned int type) |
|
void | channel_put (channel *c, linkage *data) |
|
void | channel_put_front (channel *c, linkage *data) |
|
task_env * | task_new (task_func func, task_arg arg, const char *name, int debug) |
|
void | reset_state (task_env *p) |
|
void | pushp (task_env *p, void *ptr) |
|
void | popp (task_env *p) |
|
static int | runnable_tasks () |
|
static int | delayed_tasks () |
|
static void | task_delete (task_env *t) |
|
task_env * | task_activate (task_env *t) |
|
task_env * | task_deactivate (task_env *t) |
|
task_env * | task_terminate (task_env *t) |
|
void | task_terminate_all () |
|
static task_env * | first_delayed () |
|
static void | iotasks_init (iotasks *iot_to_init) |
|
static void | iotasks_deinit (iotasks *iot_to_deinit) |
|
static void | poll_wakeup (u_int i) |
|
static int | poll_wait (int ms) |
|
static void | add_fd (task_env *t, int fd, int op) |
|
static void | unpoll (u_int i) |
|
void | remove_and_wakeup (int fd) |
|
task_env * | wait_io (task_env *t, int fd, int op) |
|
result | con_read (connection_descriptor const *rfd, void *buf, int n) |
|
result | con_pipe_read (connection_descriptor const *rfd, void *buf, int n) |
|
int | task_read (connection_descriptor const *con, void *buf, int n, int64_t *ret, connnection_read_method read_function) |
|
result | con_write (connection_descriptor const *wfd, void *buf, int n) |
|
result | con_pipe_write (connection_descriptor const *wfd, void *buf, int n) |
|
int | task_write (connection_descriptor const *con, void *_buf, uint32_t n, int64_t *ret) |
|
int | unblock_fd (int fd) |
|
int | block_fd (int fd) |
|
int | is_only_task () |
|
static task_env * | first_runnable () |
|
static task_env * | next_task (task_env *t) |
|
static int | is_task_head (task_env *t) |
|
static int | msdiff (double time) |
|
void | set_should_exit_getter (should_exit_getter x) |
|
void | task_loop () |
|
static void | init_task_vars () |
|
void | task_sys_init () |
|
void | set_task (task_env **p, task_env *t) |
|
const char * | task_name () |
|
Rudimentary, non-preemptive task system in portable C, based on Tom Duff's switch-based coroutine trick and a stack of environment structs.
(continuations?) Nonblocking IO and event handling need to be rewritten for each new OS. The code is not MT-safe, but could be made safe by moving all global variables into a context struct which could be the first parameter to all the functions.