20thread_local int t_worker_id = 0;
44#include "freertos/FreeRTOS.h"
45#include "freertos/queue.h"
46#include "freertos/task.h"
56 std::atomic<bool> run{
false};
68void worker_task(
void *arg)
70 int id = (int)(intptr_t)arg;
72 while (s_worker.run.load(std::memory_order_acquire))
78 s_worker.tasks[id] =
nullptr;
104struct DeferStorageCtx
109DeferStorageCtx s_defer_store;
114 if (s_worker.run.load(std::memory_order_acquire))
116 s_worker.pump = pump;
120 &s_defer_store.dq_struct[i]);
121 s_worker.run.store(
true, std::memory_order_release);
136 DeferCmd cmd = {fn, arg};
137 if (xQueueSend(s_defer.dq[worker_id], &cmd, 0) != pdTRUE)
147 TaskHandle_t t = s_worker.tasks[worker_id];
157 while (xQueueReceive(s_defer.dq[worker_id], &cmd, 0) == pdTRUE)
164 if (!s_worker.run.load(std::memory_order_acquire))
166 s_worker.run.store(
false, std::memory_order_release);
174 return s_worker.run.load(std::memory_order_acquire);
#define DETWS_DEFER_QUEUE_DEPTH
Depth of each worker's deferred-callback queue.
#define DETWS_WORKER_CORE
Core that worker 0 pins to (ESP32). Worker k pins to (DETWS_WORKER_CORE.
#define DETWS_WORKER_TASK_PRIORITY
FreeRTOS priority for each server worker task (ESP32).
#define DETWS_WORKER_COUNT
Number of server worker tasks (slots partitioned i % N). Default 1.
#define DETWS_WORKER_POLL_TICKS
Idle-sweep timeout, in FreeRTOS ticks, that a worker blocks between service iterations when no events...
#define DETWS_WORKER_TASK_STACK
Stack (bytes) for each server worker task (ESP32).
void detws_worker_set_self(int id)
Bind the calling task/thread to worker id id (worker entry / tests).
int detws_worker_count(void)
Number of server worker tasks (DETWS_WORKER_COUNT).
int detws_worker_self(void)
Worker id [0, count) of the calling task; 0 by default / single-worker.
void detws_workers_stop(void)
Signal the worker task(s) to exit and wait briefly for them. No-op on host.
bool detws_workers_running(void)
True while worker task(s) are running (always false on host).
void detws_workers_start(detws_worker_pump_fn pump)
Spawn the worker task(s) and start them running pump. No-op on host.
bool detws_defer(int worker_id, detws_deferred_fn fn, void *arg)
Run fn(arg) on worker worker_id. Returns false if the queue is full.
void detws_worker_wake(int worker_id)
Wake worker worker_id so it services a freshly-queued event now.
void detws_worker_run_deferred(int worker_id)
Drain and run worker worker_id's deferred callbacks (called by the worker).
Layer 5 (Session) - server worker identity.
void(* detws_worker_pump_fn)(int worker_id)
Pump callback run by each worker task with its worker id.
void(* detws_deferred_fn)(void *arg)
Deferred callback signature.