From 10512fc50e6184397206a41c157c09d9b02e9e1a Mon Sep 17 00:00:00 2001 From: David Timber Date: Sat, 11 Jan 2020 18:03:47 +1100 Subject: staged resolv_worker * replaced RNG from `rnd` to `mbedtls_ctr_drbg` * use of `uint_fastN_t` where appropriate * heartbeat protocol draft * improved worker scheduling mech --- src/worker.h | 77 ++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 46 insertions(+), 31 deletions(-) (limited to 'src/worker.h') diff --git a/src/worker.h b/src/worker.h index 8927fb0..78661a1 100644 --- a/src/worker.h +++ b/src/worker.h @@ -5,33 +5,46 @@ #include #include +#include "llist.h" -typedef uint8_t prne_worker_sched_flag_t; -typedef struct prne_worker_sched_req prne_worker_sched_req_t; -typedef bool(*prne_worker_sched_req_alloc_func_t)(prne_worker_sched_req_t *, const size_t); -typedef void(*prne_worker_sched_req_free_func_t)(prne_worker_sched_req_t *); -typedef struct prne_worker_sched_req_mem_func prne_worker_sched_req_mem_func_t; -typedef struct prne_worker_sched_info prne_worker_sched_info_t; +struct prne_wkr_timeout_slot; +struct prne_wkr_pollfd_slot; +struct prne_wkr_tick_info; +struct prne_wkr_sched_req; +typedef struct prne_wkr_timeout_slot* prne_wkr_timeout_slot_pt; +typedef struct prne_wkr_pollfd_slot* prne_wkr_pollfd_slot_pt; +typedef struct prne_wkr_sched_req prne_wkr_sched_req_t; +typedef struct prne_wkr_tick_info prne_wkr_tick_info_t; typedef struct prne_worker prne_worker_t; -struct prne_worker_sched_req_mem_func { - prne_worker_sched_req_alloc_func_t alloc; - prne_worker_sched_req_free_func_t free; - void *ctx; +struct prne_wkr_slot_parent { + prne_llist_entry_t *ent; + prne_wkr_sched_req_t *wsr; +}; + +struct prne_wkr_timeout_slot { + struct timespec dur; + struct prne_wkr_slot_parent parent; + bool active; + bool reached; }; -struct prne_worker_sched_req { - size_t pollfd_arr_size; - struct pollfd *pollfd_arr; +struct prne_wkr_pollfd_slot { + struct pollfd pfd; + struct prne_wkr_slot_parent parent; +}; + +struct prne_wkr_sched_req { + struct pollfd *pfd_arr; + size_t pfd_arr_size; struct timespec timeout; - prne_worker_sched_req_mem_func_t mem_func; - prne_worker_sched_flag_t flags; - bool pollfd_ready; + prne_llist_t tos_list; + prne_llist_t pfd_list; + bool timeout_active; }; -struct prne_worker_sched_info { - prne_worker_sched_flag_t tick_flags; +struct prne_wkr_tick_info { struct timespec last_tick; struct timespec this_tick; struct timespec tick_diff; @@ -44,21 +57,23 @@ struct prne_worker { void (*free)(void *ctx); void (*fin)(void *ctx); - void (*work)(void *ctx, const prne_worker_sched_info_t *sched_info, prne_worker_sched_req_t *sched_req); + void (*work)(void *ctx, const prne_wkr_tick_info_t *sched_info); bool (*has_finalised)(void *ctx); }; -/* Do nothing. The worker has more work to do and is yielding cpu time to the -* other workers. -*/ -static const prne_worker_sched_flag_t PRNE_WORKER_SCHED_FLAG_NONE = 0x00; -/* Do `poll()`. The worker has to set `shed_req` properly. -*/ -static const prne_worker_sched_flag_t PRNE_WORKER_SCHED_FLAG_POLL = 0x01; -/* Do `poll()` with timeout or just sleep. The worker has to set -* `prne_worker_sched_req_t::timeout` properly. -*/ -static const prne_worker_sched_flag_t PRNE_WORKER_SCHED_FLAG_TIMEOUT = 0x02; +void prne_init_wkr_sched_req (prne_wkr_sched_req_t *r); +void prne_free_wkr_sched_req (prne_wkr_sched_req_t *r); +bool prne_wkr_sched_req_prep_poll (prne_wkr_sched_req_t *r); +void prne_wkr_sched_req_refl_poll (prne_wkr_sched_req_t *r, const int poll_ret, const struct timespec elapsed); +bool prne_wkr_sched_req_do_poll (prne_wkr_sched_req_t *r, int *poll_ret); + +prne_wkr_timeout_slot_pt prne_alloc_wkr_timeout_slot (prne_wkr_sched_req_t *r); +void prne_free_wkr_timeout_slot (prne_wkr_timeout_slot_pt s); +prne_wkr_pollfd_slot_pt prne_alloc_wkr_pollfd_slot (prne_wkr_sched_req_t *r); +void prne_free_wkr_pollfd_slot (prne_wkr_pollfd_slot_pt s); -bool prne_init_worker_sched_req (prne_worker_sched_req_t *wsr, prne_worker_sched_req_mem_func_t *mem_func); +void prne_init_wkr_tick_info (prne_wkr_tick_info_t *ti); +void prne_free_wkr_tick_info (prne_wkr_tick_info_t *ti); +void prne_wkr_tick_info_set_start (prne_wkr_tick_info_t *ti); +void prne_wkr_tick_info_set_tick (prne_wkr_tick_info_t *ti); \ No newline at end of file -- cgit