From 3ae0304e5f99e6a9c5dfa818c31ef8880ed2642b Mon Sep 17 00:00:00 2001 From: akrivx Date: Thu, 29 Jan 2026 11:28:36 +0000 Subject: [PATCH 1/9] Add missing return in queue destroy Out of scope but small fix anyway. --- src/queue.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/queue.c b/src/queue.c index a453e88..6c8a865 100644 --- a/src/queue.c +++ b/src/queue.c @@ -176,6 +176,8 @@ texec_status_t texec_queue_destroy(texec_queue_t* q) { texec_free(q->alloc, q->buf, q->capacity * sizeof(uintptr_t), _Alignof(uintptr_t)); texec_free(q->alloc, q, sizeof(*q), _Alignof(texec_queue_t)); + + return TEXEC_STATUS_OK; } void texec_queue_close(texec_queue_t* q) { From 9bd8406cd3e37db09de176c25a171bc7e93641e1 Mon Sep 17 00:00:00 2001 From: akrivx Date: Thu, 29 Jan 2026 11:28:57 +0000 Subject: [PATCH 2/9] Rename TP executor create info --- examples/texec_example.c | 2 +- include/texec/executor_create_info.h | 4 ++-- src/executor.c | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/texec_example.c b/examples/texec_example.c index 9ed129d..c91795f 100644 --- a/examples/texec_example.c +++ b/examples/texec_example.c @@ -9,7 +9,7 @@ static int hello_task(void* user) { } int main(void) { - const texec_executor_create_thread_pool_info_t tpci = { + const texec_executor_thread_pool_create_info_t tpci = { .header = {.type = TEXEC_STRUCTURE_TYPE_EXECUTOR_CREATE_THREAD_POOL_INFO, .next = NULL}, .thread_count = 2, .queue_capacity = 32, diff --git a/include/texec/executor_create_info.h b/include/texec/executor_create_info.h index e9da7df..d396644 100644 --- a/include/texec/executor_create_info.h +++ b/include/texec/executor_create_info.h @@ -21,12 +21,12 @@ typedef struct texec_executor_create_info { // --- Create Extensions --- -typedef struct texec_executor_create_thread_pool_info { +typedef struct texec_executor_thread_pool_create_info { texec_structure_header_t header; size_t thread_count; size_t queue_capacity; texec_backpressure_policy_t backpressure; -} texec_executor_create_thread_pool_info_t; +} texec_executor_thread_pool_create_info_t; struct texec_executor_submit_info; typedef void (*texec_executor_on_submit_fn_t)(void* user, const struct texec_executor_submit_info* submit_info); diff --git a/src/executor.c b/src/executor.c index a4cb1a2..309b42c 100644 --- a/src/executor.c +++ b/src/executor.c @@ -8,8 +8,8 @@ static const size_t TP_EXECUTOR_DEFAULT_THREAD_COUNT = 1; static const size_t TP_EXECUTOR_DEFAULT_QUEUE_CAPACITY = 1024; -static inline const texec_executor_create_thread_pool_info_t* -find_executor_thread_pool_info(const texec_executor_create_info_t* info) { +static inline const texec_executor_thread_pool_create_info_t* +find_executor_thread_pool_create_info(const texec_executor_create_info_t* info) { return texec_structure_find(info->header.next, TEXEC_STRUCTURE_TYPE_EXECUTOR_CREATE_THREAD_POOL_INFO); } @@ -22,7 +22,7 @@ static inline texec_status_t executor_create_thread_pool(const texec_allocator_t const texec_executor_diagnostics_t* diag, const texec_executor_create_info_t* info, texec_executor_t** out_ex) { - const texec_executor_create_thread_pool_info_t* tp_info = find_executor_thread_pool_info(info); + const texec_executor_thread_pool_create_info_t* tp_info = find_executor_thread_pool_create_info(info); if (!tp_info) return TEXEC_STATUS_INVALID_ARGUMENT; const texec_thread_pool_executor_config_t cfg = { From 33d2e081808ea7069ca0dbbb81da619bc8b77a45 Mon Sep 17 00:00:00 2001 From: akrivx Date: Thu, 29 Jan 2026 11:32:51 +0000 Subject: [PATCH 3/9] Move executor diagnostics to separate file --- include/texec/diagnostics.h | 23 +++++++++++++++++++++++ include/texec/executor_create_info.h | 14 +------------- 2 files changed, 24 insertions(+), 13 deletions(-) create mode 100644 include/texec/diagnostics.h diff --git a/include/texec/diagnostics.h b/include/texec/diagnostics.h new file mode 100644 index 0000000..6ba7a22 --- /dev/null +++ b/include/texec/diagnostics.h @@ -0,0 +1,23 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +struct texec_executor_submit_info; +struct texec_task; + +typedef void (*texec_executor_on_submit_fn_t)(void* user, const struct texec_executor_submit_info* submit_info); +typedef void (*texec_executor_on_task_begin_fn_t)(void* user, const struct texec_task* task, const void* trace_context); +typedef void (*texec_executor_on_task_end_fn_t)(void* user, const struct texec_task* task, const void* trace_context, int task_result); + +typedef struct texec_executor_diagnostics { + void* user; + texec_executor_on_submit_fn_t on_submit; + texec_executor_on_task_begin_fn_t on_task_begin; + texec_executor_on_task_end_fn_t on_task_end; +} texec_executor_diagnostics_t; + +#ifdef __cplusplus +} +#endif diff --git a/include/texec/executor_create_info.h b/include/texec/executor_create_info.h index d396644..b8af186 100644 --- a/include/texec/executor_create_info.h +++ b/include/texec/executor_create_info.h @@ -3,7 +3,7 @@ #include #include "texec/base.h" -#include "texec/task.h" +#include "texec/diagnostics.h" #ifdef __cplusplus extern "C" { @@ -28,18 +28,6 @@ typedef struct texec_executor_thread_pool_create_info { texec_backpressure_policy_t backpressure; } texec_executor_thread_pool_create_info_t; -struct texec_executor_submit_info; -typedef void (*texec_executor_on_submit_fn_t)(void* user, const struct texec_executor_submit_info* submit_info); -typedef void (*texec_executor_on_task_begin_fn_t)(void* user, const texec_task_t* task, const void* trace_context); -typedef void (*texec_executor_on_task_end_fn_t)(void* user, const texec_task_t* task, const void* trace_context, int task_result); - -typedef struct texec_executor_diagnostics { - void* user; - texec_executor_on_submit_fn_t on_submit; - texec_executor_on_task_begin_fn_t on_task_begin; - texec_executor_on_task_end_fn_t on_task_end; -} texec_executor_diagnostics_t; - typedef struct texec_executor_create_diagnostics_info { texec_structure_header_t header; const texec_executor_diagnostics_t* diag; From ac6fc1456710364944769684443ea0ee27fe4c2b Mon Sep 17 00:00:00 2001 From: akrivx Date: Thu, 29 Jan 2026 11:41:21 +0000 Subject: [PATCH 4/9] Update extension struct convention Use the `texec_executor_create__info_t` convention. --- examples/texec_example.c | 2 +- include/texec/executor_create_info.h | 4 ++-- src/executor.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/texec_example.c b/examples/texec_example.c index c91795f..9ed129d 100644 --- a/examples/texec_example.c +++ b/examples/texec_example.c @@ -9,7 +9,7 @@ static int hello_task(void* user) { } int main(void) { - const texec_executor_thread_pool_create_info_t tpci = { + const texec_executor_create_thread_pool_info_t tpci = { .header = {.type = TEXEC_STRUCTURE_TYPE_EXECUTOR_CREATE_THREAD_POOL_INFO, .next = NULL}, .thread_count = 2, .queue_capacity = 32, diff --git a/include/texec/executor_create_info.h b/include/texec/executor_create_info.h index b8af186..5b6e0f7 100644 --- a/include/texec/executor_create_info.h +++ b/include/texec/executor_create_info.h @@ -21,12 +21,12 @@ typedef struct texec_executor_create_info { // --- Create Extensions --- -typedef struct texec_executor_thread_pool_create_info { +typedef struct texec_executor_create_thread_pool_info { texec_structure_header_t header; size_t thread_count; size_t queue_capacity; texec_backpressure_policy_t backpressure; -} texec_executor_thread_pool_create_info_t; +} texec_executor_create_thread_pool_info_t; typedef struct texec_executor_create_diagnostics_info { texec_structure_header_t header; diff --git a/src/executor.c b/src/executor.c index 309b42c..db8cfdd 100644 --- a/src/executor.c +++ b/src/executor.c @@ -8,7 +8,7 @@ static const size_t TP_EXECUTOR_DEFAULT_THREAD_COUNT = 1; static const size_t TP_EXECUTOR_DEFAULT_QUEUE_CAPACITY = 1024; -static inline const texec_executor_thread_pool_create_info_t* +static inline const texec_executor_create_thread_pool_info_t* find_executor_thread_pool_create_info(const texec_executor_create_info_t* info) { return texec_structure_find(info->header.next, TEXEC_STRUCTURE_TYPE_EXECUTOR_CREATE_THREAD_POOL_INFO); } @@ -22,7 +22,7 @@ static inline texec_status_t executor_create_thread_pool(const texec_allocator_t const texec_executor_diagnostics_t* diag, const texec_executor_create_info_t* info, texec_executor_t** out_ex) { - const texec_executor_thread_pool_create_info_t* tp_info = find_executor_thread_pool_create_info(info); + const texec_executor_create_thread_pool_info_t* tp_info = find_executor_thread_pool_create_info(info); if (!tp_info) return TEXEC_STATUS_INVALID_ARGUMENT; const texec_thread_pool_executor_config_t cfg = { From a4de8695dc4df35ba5f19b7e34ca9c00275f7326 Mon Sep 17 00:00:00 2001 From: akrivx Date: Thu, 29 Jan 2026 11:43:13 +0000 Subject: [PATCH 5/9] Rename executor diagnostics and associated callbacks --- include/texec/diagnostics.h | 16 ++++++++-------- include/texec/executor_create_info.h | 2 +- src/executor.c | 4 ++-- src/internal/executor.h | 10 +++++----- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/include/texec/diagnostics.h b/include/texec/diagnostics.h index 6ba7a22..ed4ba8f 100644 --- a/include/texec/diagnostics.h +++ b/include/texec/diagnostics.h @@ -7,16 +7,16 @@ extern "C" { struct texec_executor_submit_info; struct texec_task; -typedef void (*texec_executor_on_submit_fn_t)(void* user, const struct texec_executor_submit_info* submit_info); -typedef void (*texec_executor_on_task_begin_fn_t)(void* user, const struct texec_task* task, const void* trace_context); -typedef void (*texec_executor_on_task_end_fn_t)(void* user, const struct texec_task* task, const void* trace_context, int task_result); +typedef void (*texec_on_submit_fn_t)(void* user, const struct texec_executor_submit_info* submit_info); +typedef void (*texec_on_task_begin_fn_t)(void* user, const struct texec_task* task, const void* trace_context); +typedef void (*texec_on_task_end_fn_t)(void* user, const struct texec_task* task, const void* trace_context, int task_result); -typedef struct texec_executor_diagnostics { +typedef struct texec_diagnostics { void* user; - texec_executor_on_submit_fn_t on_submit; - texec_executor_on_task_begin_fn_t on_task_begin; - texec_executor_on_task_end_fn_t on_task_end; -} texec_executor_diagnostics_t; + texec_on_submit_fn_t on_submit; + texec_on_task_begin_fn_t on_task_begin; + texec_on_task_end_fn_t on_task_end; +} texec_diagnostics_t; #ifdef __cplusplus } diff --git a/include/texec/executor_create_info.h b/include/texec/executor_create_info.h index 5b6e0f7..9f0e1a8 100644 --- a/include/texec/executor_create_info.h +++ b/include/texec/executor_create_info.h @@ -30,7 +30,7 @@ typedef struct texec_executor_create_thread_pool_info { typedef struct texec_executor_create_diagnostics_info { texec_structure_header_t header; - const texec_executor_diagnostics_t* diag; + const texec_diagnostics_t* diag; } texec_executor_create_diagnostics_info_t; #ifdef __cplusplus diff --git a/src/executor.c b/src/executor.c index db8cfdd..2a96498 100644 --- a/src/executor.c +++ b/src/executor.c @@ -19,7 +19,7 @@ find_executor_diag_info(const texec_executor_create_info_t* info) { } static inline texec_status_t executor_create_thread_pool(const texec_allocator_t* alloc, - const texec_executor_diagnostics_t* diag, + const texec_diagnostics_t* diag, const texec_executor_create_info_t* info, texec_executor_t** out_ex) { const texec_executor_create_thread_pool_info_t* tp_info = find_executor_thread_pool_create_info(info); @@ -58,7 +58,7 @@ texec_status_t texec_executor_create(const texec_executor_create_info_t* info, c } const texec_executor_create_diagnostics_info_t* diag_info = find_executor_diag_info(info); - const texec_executor_diagnostics_t* diag = diag_info ? diag_info->diag : NULL; + const texec_diagnostics_t* diag = diag_info ? diag_info->diag : NULL; if (!alloc) { alloc = texec_get_default_allocator(); diff --git a/src/internal/executor.h b/src/internal/executor.h index 1184ae5..568a416 100644 --- a/src/internal/executor.h +++ b/src/internal/executor.h @@ -33,14 +33,14 @@ typedef struct texec_executor_vtable { struct texec_executor { const texec_executor_vtable_t* vtbl; const texec_allocator_t* alloc; - const texec_executor_diagnostics_t* diag; + const texec_diagnostics_t* diag; texec_executor_kind_t kind; texec_executor_state_t state; }; typedef struct texec_thread_pool_executor_config { const texec_allocator_t* alloc; - const texec_executor_diagnostics_t* diag; + const texec_diagnostics_t* diag; size_t thread_count; size_t queue_capacity; texec_backpressure_policy_t backpressure; @@ -48,15 +48,15 @@ typedef struct texec_thread_pool_executor_config { texec_status_t texec_executor_create_thread_pool(const texec_thread_pool_executor_config_t* cfg, texec_executor_t** out_ex); -static inline void texec_executor_diagnostics_on_submit(const texec_executor_diagnostics_t* diag, const struct texec_executor_submit_info* submit_info) { +static inline void texec_executor_diagnostics_on_submit(const texec_diagnostics_t* diag, const struct texec_executor_submit_info* submit_info) { if (diag) diag->on_submit(diag->user, submit_info); } -static inline void texec_executor_diagnostics_on_task_begin(const texec_executor_diagnostics_t* diag, const texec_task_t* task, const void* trace_context) { +static inline void texec_executor_diagnostics_on_task_begin(const texec_diagnostics_t* diag, const texec_task_t* task, const void* trace_context) { if (diag) diag->on_task_begin(diag->user, task, trace_context); } -static inline void texec_executor_diagnostics_on_task_end(const texec_executor_diagnostics_t* diag, const texec_task_t* task, const void* trace_context, int task_result) { +static inline void texec_executor_diagnostics_on_task_end(const texec_diagnostics_t* diag, const texec_task_t* task, const void* trace_context, int task_result) { if (diag) diag->on_task_end(diag->user, task, trace_context, task_result); } From 7b19f2cdcc399a17edaa19e5d68462f21b39d4ed Mon Sep 17 00:00:00 2001 From: akrivx Date: Thu, 29 Jan 2026 11:48:18 +0000 Subject: [PATCH 6/9] Remove `executor` from submit types and enums --- examples/texec_example.c | 4 ++-- include/texec/base.h | 10 ++++----- include/texec/diagnostics.h | 4 ++-- include/texec/executor.h | 4 ++-- include/texec/executor_submit_info.h | 32 ++++++++++++++-------------- src/executor.c | 4 ++-- src/internal/executor.h | 6 +++--- src/thread_pool_executor.c | 10 ++++----- 8 files changed, 37 insertions(+), 37 deletions(-) diff --git a/examples/texec_example.c b/examples/texec_example.c index 9ed129d..9747845 100644 --- a/examples/texec_example.c +++ b/examples/texec_example.c @@ -29,8 +29,8 @@ int main(void) { return 1; } - const texec_executor_submit_info_t submit = { - .header = {.type = TEXEC_STRUCTURE_TYPE_EXECUTOR_SUBMIT_INFO, .next = NULL}, + const texec_submit_info_t submit = { + .header = {.type = TEXEC_STRUCTURE_TYPE_SUBMIT_INFO, .next = NULL}, .task = { .fn = hello_task, .ctx = "work item", diff --git a/include/texec/base.h b/include/texec/base.h index 0455c15..b2b60d3 100644 --- a/include/texec/base.h +++ b/include/texec/base.h @@ -20,7 +20,7 @@ typedef enum texec_status { typedef enum texec_structure_type { TEXEC_STRUCTURE_TYPE_EXECUTOR_CREATE_INFO = 0x1000, - TEXEC_STRUCTURE_TYPE_EXECUTOR_SUBMIT_INFO = 0x2000, + TEXEC_STRUCTURE_TYPE_SUBMIT_INFO = 0x2000, TEXEC_STRUCTURE_TYPE_TASK_GROUP_CREATE_INFO = 0x3000, TEXEC_STRUCTURE_TYPE_QUEUE_CREATE_INFO = 0x4000, @@ -28,10 +28,10 @@ typedef enum texec_structure_type { TEXEC_STRUCTURE_TYPE_EXECUTOR_CREATE_THREAD_POOL_INFO = 0x1002, TEXEC_STRUCTURE_TYPE_EXECUTOR_CREATE_DIAGNOSTICS_INFO = 0x1003, - TEXEC_STRUCTURE_TYPE_EXECUTOR_SUBMIT_PRIORITY = 0x2001, - TEXEC_STRUCTURE_TYPE_EXECUTOR_SUBMIT_DEADLINE = 0x2002, - TEXEC_STRUCTURE_TYPE_EXECUTOR_SUBMIT_TRACE_CONTEXT = 0x2003, - TEXEC_STRUCTURE_TYPE_EXECUTOR_SUBMIT_BACKPRESSURE = 0x2004, + TEXEC_STRUCTURE_TYPE_SUBMIT_PRIORITY = 0x2001, + TEXEC_STRUCTURE_TYPE_SUBMIT_DEADLINE = 0x2002, + TEXEC_STRUCTURE_TYPE_SUBMIT_TRACE_CONTEXT = 0x2003, + TEXEC_STRUCTURE_TYPE_SUBMIT_BACKPRESSURE = 0x2004, TEXEC_STRUCTURE_TYPE_QUEUE_CREATE_FULL_POLICY_INFO = 0x4001, } texec_structure_type_t; diff --git a/include/texec/diagnostics.h b/include/texec/diagnostics.h index ed4ba8f..da03172 100644 --- a/include/texec/diagnostics.h +++ b/include/texec/diagnostics.h @@ -4,10 +4,10 @@ extern "C" { #endif -struct texec_executor_submit_info; +struct texec_submit_info_t; struct texec_task; -typedef void (*texec_on_submit_fn_t)(void* user, const struct texec_executor_submit_info* submit_info); +typedef void (*texec_on_submit_fn_t)(void* user, const struct texec_submit_info_t* submit_info); typedef void (*texec_on_task_begin_fn_t)(void* user, const struct texec_task* task, const void* trace_context); typedef void (*texec_on_task_end_fn_t)(void* user, const struct texec_task* task, const void* trace_context, int task_result); diff --git a/include/texec/executor.h b/include/texec/executor.h index 38ca92f..e85ce7b 100644 --- a/include/texec/executor.h +++ b/include/texec/executor.h @@ -16,8 +16,8 @@ typedef struct texec_executor texec_executor_t; texec_status_t texec_executor_create(const texec_executor_create_info_t* info, const texec_allocator_t* allocator, texec_executor_t** out_executor); texec_status_t texec_executor_destroy(texec_executor_t* ex); -texec_status_t texec_executor_submit(texec_executor_t* ex, const texec_executor_submit_info_t* info, texec_task_handle_t** out_handle); -texec_status_t texec_executor_submit_many(texec_executor_t* ex, const texec_executor_submit_info_t* infos, size_t count, texec_task_group_t** out_group); +texec_status_t texec_executor_submit(texec_executor_t* ex, const texec_submit_info_t* info, texec_task_handle_t** out_handle); +texec_status_t texec_executor_submit_many(texec_executor_t* ex, const texec_submit_info_t* infos, size_t count, texec_task_group_t** out_group); void texec_executor_close(texec_executor_t* ex); void texec_executor_join(texec_executor_t* ex); diff --git a/include/texec/executor_submit_info.h b/include/texec/executor_submit_info.h index 2faf40a..558ce34 100644 --- a/include/texec/executor_submit_info.h +++ b/include/texec/executor_submit_info.h @@ -9,38 +9,38 @@ extern "C" { #endif -typedef struct texec_executor_submit_info { +typedef struct texec_submit_info { texec_structure_header_t header; texec_task_t task; -} texec_executor_submit_info_t; +} texec_submit_info_t; // --- Submit Extensions --- -typedef enum texec_executor_submit_priority { - TEXEC_EXECUTOR_SUBMIT_PRIORITY_LOW = -1, - TEXEC_EXECUTOR_SUBMIT_PRIORITY_NORMAL = 0, - TEXEC_EXECUTOR_SUBMIT_PRIORITY_HIGH = 1 -} texec_executor_submit_priority_t; +typedef enum texec_submit_priority { + TEXEC_SUBMIT_PRIORITY_LOW = -1, + TEXEC_SUBMIT_PRIORITY_NORMAL = 0, + TEXEC_SUBMIT_PRIORITY_HIGH = 1 +} texec_submit_priority_t; -typedef struct texec_executor_submit_priority_info { +typedef struct texec_submit_priority_info { texec_structure_header_t header; - texec_executor_submit_priority_t priority; -} texec_executor_submit_priority_info_t; + texec_submit_priority_t priority; +} texec_submit_priority_info_t; -typedef struct texec_executor_submit_deadline_info { +typedef struct texec_submit_deadline_info { texec_structure_header_t header; uint64_t deadline_ns; -} texec_executor_submit_deadline_info_t; +} texec_submit_deadline_info_t; -typedef struct texec_executor_submit_trace_context_info { +typedef struct texec_submit_trace_context_info { texec_structure_header_t header; const void* trace_context; -} texec_executor_submit_trace_context_info_t; +} texec_submit_trace_context_info_t; -typedef struct texec_executor_submit_backpressure_info { +typedef struct texec_submit_backpressure_info { texec_structure_header_t header; texec_backpressure_policy_t backpressure; -} texec_executor_submit_backpressure_info_t; +} texec_submit_backpressure_info_t; #ifdef __cplusplus } diff --git a/src/executor.c b/src/executor.c index 2a96498..d5073a3 100644 --- a/src/executor.c +++ b/src/executor.c @@ -90,12 +90,12 @@ texec_status_t texec_executor_destroy(texec_executor_t* ex) { return ex->vtbl->destroy(ex); } -texec_status_t texec_executor_submit(texec_executor_t* ex, const texec_executor_submit_info_t* info, texec_task_handle_t** out_handle) { +texec_status_t texec_executor_submit(texec_executor_t* ex, const texec_submit_info_t* info, texec_task_handle_t** out_handle) { if (!ex || !out_handle) return TEXEC_STATUS_INVALID_ARGUMENT; return ex->vtbl->submit(ex, info, out_handle); } -texec_status_t texec_executor_submit_many(texec_executor_t* ex, const texec_executor_submit_info_t* infos, size_t count, texec_task_group_t** out_group) { +texec_status_t texec_executor_submit_many(texec_executor_t* ex, const texec_submit_info_t* infos, size_t count, texec_task_group_t** out_group) { if (!ex || !out_group) return TEXEC_STATUS_INVALID_ARGUMENT; return ex->vtbl->submit_many(ex, infos, count, out_group); } diff --git a/src/internal/executor.h b/src/internal/executor.h index 568a416..6fcd91d 100644 --- a/src/internal/executor.h +++ b/src/internal/executor.h @@ -14,8 +14,8 @@ typedef enum texec_executor_state { TEXEC_EXECUTOR_STATE_CLOSED, } texec_executor_state_t; -typedef texec_status_t (*texec_executor_submit_fn_t)(texec_executor_t* ex, const texec_executor_submit_info_t* info, texec_task_handle_t** out_handle); -typedef texec_status_t (*texec_executor_submit_many_fn_t)(texec_executor_t* ex, const texec_executor_submit_info_t* infos, size_t count, texec_task_group_t** out_group); +typedef texec_status_t (*texec_executor_submit_fn_t)(texec_executor_t* ex, const texec_submit_info_t* info, texec_task_handle_t** out_handle); +typedef texec_status_t (*texec_executor_submit_many_fn_t)(texec_executor_t* ex, const texec_submit_info_t* infos, size_t count, texec_task_group_t** out_group); typedef void (*texec_executor_close_fn_t)(texec_executor_t* ex); typedef void (*texec_executor_join_fn_t)(texec_executor_t* ex); typedef texec_status_t (*texec_executor_destroy_fn_t)(texec_executor_t* ex); @@ -48,7 +48,7 @@ typedef struct texec_thread_pool_executor_config { texec_status_t texec_executor_create_thread_pool(const texec_thread_pool_executor_config_t* cfg, texec_executor_t** out_ex); -static inline void texec_executor_diagnostics_on_submit(const texec_diagnostics_t* diag, const struct texec_executor_submit_info* submit_info) { +static inline void texec_executor_diagnostics_on_submit(const texec_diagnostics_t* diag, const struct texec_submit_info_t* submit_info) { if (diag) diag->on_submit(diag->user, submit_info); } diff --git a/src/thread_pool_executor.c b/src/thread_pool_executor.c index 2789def..1276f65 100644 --- a/src/thread_pool_executor.c +++ b/src/thread_pool_executor.c @@ -170,23 +170,23 @@ static void tp_join(thread_pool_executor_t* ex) { mtx_unlock(&ex->mtx); } -static texec_status_t tp_vtbl_submit(texec_executor_t* ex, const texec_executor_submit_info_t* info, texec_task_handle_t** out_handle) { +static texec_status_t tp_vtbl_submit(texec_executor_t* ex, const texec_submit_info_t* info, texec_task_handle_t** out_handle) { if (!out_handle) return TEXEC_STATUS_INVALID_ARGUMENT; *out_handle = NULL; thread_pool_executor_t* tp_ex = tp_from_base(ex); if (!tp_ex) return TEXEC_STATUS_INVALID_ARGUMENT; - if (!info || info->header.type != TEXEC_STRUCTURE_TYPE_EXECUTOR_SUBMIT_INFO) { + if (!info || info->header.type != TEXEC_STRUCTURE_TYPE_SUBMIT_INFO) { return TEXEC_STATUS_INVALID_ARGUMENT; } if (!info->task.fn) return TEXEC_STATUS_INVALID_ARGUMENT; - const texec_executor_submit_backpressure_info_t* bpi = texec_structure_find(info->header.next, TEXEC_STRUCTURE_TYPE_EXECUTOR_SUBMIT_BACKPRESSURE); + const texec_submit_backpressure_info_t* bpi = texec_structure_find(info->header.next, TEXEC_STRUCTURE_TYPE_SUBMIT_BACKPRESSURE); const texec_backpressure_policy_t backpressure = (bpi ? bpi->backpressure : tp_ex->backpressure); - const texec_executor_submit_trace_context_info_t* tci = texec_structure_find(info->header.next, TEXEC_STRUCTURE_TYPE_EXECUTOR_SUBMIT_TRACE_CONTEXT); + const texec_submit_trace_context_info_t* tci = texec_structure_find(info->header.next, TEXEC_STRUCTURE_TYPE_SUBMIT_TRACE_CONTEXT); const void* trace_context = tci ? tci->trace_context : NULL; texec_task_handle_t* h = texec_task_handle_create(tp_ex->base.alloc); @@ -207,7 +207,7 @@ static texec_status_t tp_vtbl_submit(texec_executor_t* ex, const texec_executor return st; } -static texec_status_t tp_vtbl_submit_many(texec_executor_t* ex, const texec_executor_submit_info_t* infos, size_t count, texec_task_group_t** out_group) { +static texec_status_t tp_vtbl_submit_many(texec_executor_t* ex, const texec_submit_info_t* infos, size_t count, texec_task_group_t** out_group) { if (!out_group) return TEXEC_STATUS_INVALID_ARGUMENT; *out_group = NULL; From 3dd3af90cd0904f27533629165b16c043dc38566 Mon Sep 17 00:00:00 2001 From: akrivx Date: Thu, 29 Jan 2026 12:06:40 +0000 Subject: [PATCH 7/9] Move diagnostics helpers to internal header --- src/internal/diagnostics.h | 18 ++++++++++++++++++ src/internal/executor.h | 17 +++-------------- 2 files changed, 21 insertions(+), 14 deletions(-) create mode 100644 src/internal/diagnostics.h diff --git a/src/internal/diagnostics.h b/src/internal/diagnostics.h new file mode 100644 index 0000000..614b423 --- /dev/null +++ b/src/internal/diagnostics.h @@ -0,0 +1,18 @@ +#pragma once + +#include "texec/diagnostics.h" + +static inline void texec_diagnostics_on_submit(const texec_diagnostics_t* diag, const struct texec_submit_info_t* submit_info) { + if (!diag) return; + diag->on_submit(diag->user, submit_info); +} + +static inline void texec_diagnostics_on_task_begin(const texec_diagnostics_t* diag, const struct texec_task* task, const void* trace_context) { + if (!diag) return; + diag->on_task_begin(diag->user, task, trace_context); +} + +static inline void texec_diagnostics_on_task_end(const texec_diagnostics_t* diag, const struct texec_task* task, const void* trace_context, int task_result) { + if (!diag) return; + diag->on_task_end(diag->user, task, trace_context, task_result); +} diff --git a/src/internal/executor.h b/src/internal/executor.h index 6fcd91d..e9f58f9 100644 --- a/src/internal/executor.h +++ b/src/internal/executor.h @@ -5,6 +5,7 @@ #include "texec/task_handle.h" #include "internal/allocator.h" +#include "internal/diagnostics.h" #include "internal/task_handle.h" #include "internal/work_item.h" @@ -48,26 +49,14 @@ typedef struct texec_thread_pool_executor_config { texec_status_t texec_executor_create_thread_pool(const texec_thread_pool_executor_config_t* cfg, texec_executor_t** out_ex); -static inline void texec_executor_diagnostics_on_submit(const texec_diagnostics_t* diag, const struct texec_submit_info_t* submit_info) { - if (diag) diag->on_submit(diag->user, submit_info); -} - -static inline void texec_executor_diagnostics_on_task_begin(const texec_diagnostics_t* diag, const texec_task_t* task, const void* trace_context) { - if (diag) diag->on_task_begin(diag->user, task, trace_context); -} - -static inline void texec_executor_diagnostics_on_task_end(const texec_diagnostics_t* diag, const texec_task_t* task, const void* trace_context, int task_result) { - if (diag) diag->on_task_end(diag->user, task, trace_context, task_result); -} - static inline void texec_task_cleanup(const texec_task_t* t) { if (t->cleanup) t->cleanup(t->ctx); } static inline void texec_executor_consume_work_item(const texec_executor_t* ex, texec_work_item_t* wi) { - texec_executor_diagnostics_on_task_begin(ex->diag, &wi->task, wi->trace_context); + texec_diagnostics_on_task_begin(ex->diag, &wi->task, wi->trace_context); const int result = wi->task.fn(wi->task.ctx); - texec_executor_diagnostics_on_task_end(ex->diag, &wi->task, wi->trace_context, result); + texec_diagnostics_on_task_end(ex->diag, &wi->task, wi->trace_context, result); texec_task_cleanup(&wi->task); texec_task_handle_complete(wi->handle, result); texec_work_item_destroy(wi, ex->alloc); From b3d788dd0936283d92454222762b944a8b28c258 Mon Sep 17 00:00:00 2001 From: akrivx Date: Thu, 29 Jan 2026 13:35:36 +0000 Subject: [PATCH 8/9] Replace `structure_type` with `struct_type` --- examples/texec_example.c | 6 +++--- include/texec/base.h | 32 ++++++++++++++++---------------- src/executor.c | 6 +++--- src/queue.c | 2 +- src/task_group.c | 2 +- src/thread_pool_executor.c | 10 +++++----- 6 files changed, 29 insertions(+), 29 deletions(-) diff --git a/examples/texec_example.c b/examples/texec_example.c index 9747845..68b7499 100644 --- a/examples/texec_example.c +++ b/examples/texec_example.c @@ -10,14 +10,14 @@ static int hello_task(void* user) { int main(void) { const texec_executor_create_thread_pool_info_t tpci = { - .header = {.type = TEXEC_STRUCTURE_TYPE_EXECUTOR_CREATE_THREAD_POOL_INFO, .next = NULL}, + .header = {.type = TEXEC_STRUCT_TYPE_EXECUTOR_CREATE_THREAD_POOL_INFO, .next = NULL}, .thread_count = 2, .queue_capacity = 32, .backpressure = TEXEC_BACKPRESSURE_BLOCK, }; const texec_executor_create_info_t eci = { - .header = {.type = TEXEC_STRUCTURE_TYPE_EXECUTOR_CREATE_INFO, .next = &tpci}, + .header = {.type = TEXEC_STRUCT_TYPE_EXECUTOR_CREATE_INFO, .next = &tpci}, .kind = TEXEC_EXECUTOR_KIND_THREAD_POOL, }; @@ -30,7 +30,7 @@ int main(void) { } const texec_submit_info_t submit = { - .header = {.type = TEXEC_STRUCTURE_TYPE_SUBMIT_INFO, .next = NULL}, + .header = {.type = TEXEC_STRUCT_TYPE_SUBMIT_INFO, .next = NULL}, .task = { .fn = hello_task, .ctx = "work item", diff --git a/include/texec/base.h b/include/texec/base.h index b2b60d3..aef4e7d 100644 --- a/include/texec/base.h +++ b/include/texec/base.h @@ -18,23 +18,23 @@ typedef enum texec_status { TEXEC_STATUS_INTERNAL_ERROR } texec_status_t; -typedef enum texec_structure_type { - TEXEC_STRUCTURE_TYPE_EXECUTOR_CREATE_INFO = 0x1000, - TEXEC_STRUCTURE_TYPE_SUBMIT_INFO = 0x2000, - TEXEC_STRUCTURE_TYPE_TASK_GROUP_CREATE_INFO = 0x3000, - TEXEC_STRUCTURE_TYPE_QUEUE_CREATE_INFO = 0x4000, +typedef enum texec_struct_type { + TEXEC_STRUCT_TYPE_EXECUTOR_CREATE_INFO = 0x1000, + TEXEC_STRUCT_TYPE_SUBMIT_INFO = 0x2000, + TEXEC_STRUCT_TYPE_TASK_GROUP_CREATE_INFO = 0x3000, + TEXEC_STRUCT_TYPE_QUEUE_CREATE_INFO = 0x4000, - TEXEC_STRUCTURE_TYPE_EXECUTOR_CREATE_INLINE_INFO = 0x1001, - TEXEC_STRUCTURE_TYPE_EXECUTOR_CREATE_THREAD_POOL_INFO = 0x1002, - TEXEC_STRUCTURE_TYPE_EXECUTOR_CREATE_DIAGNOSTICS_INFO = 0x1003, + TEXEC_STRUCT_TYPE_EXECUTOR_CREATE_INLINE_INFO = 0x1001, + TEXEC_STRUCT_TYPE_EXECUTOR_CREATE_THREAD_POOL_INFO = 0x1002, + TEXEC_STRUCT_TYPE_EXECUTOR_CREATE_DIAGNOSTICS_INFO = 0x1003, - TEXEC_STRUCTURE_TYPE_SUBMIT_PRIORITY = 0x2001, - TEXEC_STRUCTURE_TYPE_SUBMIT_DEADLINE = 0x2002, - TEXEC_STRUCTURE_TYPE_SUBMIT_TRACE_CONTEXT = 0x2003, - TEXEC_STRUCTURE_TYPE_SUBMIT_BACKPRESSURE = 0x2004, + TEXEC_STRUCT_TYPE_SUBMIT_PRIORITY = 0x2001, + TEXEC_STRUCT_TYPE_SUBMIT_DEADLINE = 0x2002, + TEXEC_STRUCT_TYPE_SUBMIT_TRACE_CONTEXT = 0x2003, + TEXEC_STRUCT_TYPE_SUBMIT_BACKPRESSURE = 0x2004, - TEXEC_STRUCTURE_TYPE_QUEUE_CREATE_FULL_POLICY_INFO = 0x4001, -} texec_structure_type_t; + TEXEC_STRUCT_TYPE_QUEUE_CREATE_FULL_POLICY_INFO = 0x4001, +} texec_struct_type_t; typedef enum texec_backpressure_policy { TEXEC_BACKPRESSURE_REJECT = 0, @@ -54,11 +54,11 @@ typedef struct texec_allocator { void texec_set_default_allocator(const texec_allocator_t* allocator); typedef struct texec_structure_header { - texec_structure_type_t type; + texec_struct_type_t type; const void* next; } texec_structure_header_t; -static inline const void* texec_structure_find(const void* first, texec_structure_type_t type) { +static inline const void* texec_structure_find(const void* first, texec_struct_type_t type) { const texec_structure_header_t* it = (const texec_structure_header_t*)first; while (it && it->type != type) { it = (const texec_structure_header_t*)it->next; diff --git a/src/executor.c b/src/executor.c index d5073a3..da5aa9a 100644 --- a/src/executor.c +++ b/src/executor.c @@ -10,12 +10,12 @@ static const size_t TP_EXECUTOR_DEFAULT_QUEUE_CAPACITY = 1024; static inline const texec_executor_create_thread_pool_info_t* find_executor_thread_pool_create_info(const texec_executor_create_info_t* info) { - return texec_structure_find(info->header.next, TEXEC_STRUCTURE_TYPE_EXECUTOR_CREATE_THREAD_POOL_INFO); + return texec_structure_find(info->header.next, TEXEC_STRUCT_TYPE_EXECUTOR_CREATE_THREAD_POOL_INFO); } static inline const texec_executor_create_diagnostics_info_t* find_executor_diag_info(const texec_executor_create_info_t* info) { - return texec_structure_find(info->header.next, TEXEC_STRUCTURE_TYPE_EXECUTOR_CREATE_DIAGNOSTICS_INFO); + return texec_structure_find(info->header.next, TEXEC_STRUCT_TYPE_EXECUTOR_CREATE_DIAGNOSTICS_INFO); } static inline texec_status_t executor_create_thread_pool(const texec_allocator_t* alloc, @@ -53,7 +53,7 @@ texec_status_t texec_executor_create(const texec_executor_create_info_t* info, c if (!out_executor) return TEXEC_STATUS_INVALID_ARGUMENT; *out_executor = NULL; - if (!info || info->header.type != TEXEC_STRUCTURE_TYPE_EXECUTOR_CREATE_INFO) { + if (!info || info->header.type != TEXEC_STRUCT_TYPE_EXECUTOR_CREATE_INFO) { return TEXEC_STATUS_INVALID_ARGUMENT; } diff --git a/src/queue.c b/src/queue.c index 6c8a865..a2b254f 100644 --- a/src/queue.c +++ b/src/queue.c @@ -141,7 +141,7 @@ texec_status_t texec_queue_create(const texec_queue_create_info_t* info, const t *out_q = NULL; - if (!info || info->header.type != TEXEC_STRUCTURE_TYPE_QUEUE_CREATE_INFO || info->capacity == 0) { + if (!info || info->header.type != TEXEC_STRUCT_TYPE_QUEUE_CREATE_INFO || info->capacity == 0) { return TEXEC_STATUS_INVALID_ARGUMENT; } diff --git a/src/task_group.c b/src/task_group.c index 6fb6c75..233a4e9 100644 --- a/src/task_group.c +++ b/src/task_group.c @@ -80,7 +80,7 @@ texec_status_t texec_task_group_create(const texec_task_group_create_info_t* inf if (!out_group) return TEXEC_STATUS_INVALID_ARGUMENT; *out_group = NULL; - if (!info || info->header.type != TEXEC_STRUCTURE_TYPE_TASK_GROUP_CREATE_INFO) { + if (!info || info->header.type != TEXEC_STRUCT_TYPE_TASK_GROUP_CREATE_INFO) { return TEXEC_STATUS_INVALID_ARGUMENT; } diff --git a/src/thread_pool_executor.c b/src/thread_pool_executor.c index 1276f65..bbe6628 100644 --- a/src/thread_pool_executor.c +++ b/src/thread_pool_executor.c @@ -177,16 +177,16 @@ static texec_status_t tp_vtbl_submit(texec_executor_t* ex, const texec_submit_i thread_pool_executor_t* tp_ex = tp_from_base(ex); if (!tp_ex) return TEXEC_STATUS_INVALID_ARGUMENT; - if (!info || info->header.type != TEXEC_STRUCTURE_TYPE_SUBMIT_INFO) { + if (!info || info->header.type != TEXEC_STRUCT_TYPE_SUBMIT_INFO) { return TEXEC_STATUS_INVALID_ARGUMENT; } if (!info->task.fn) return TEXEC_STATUS_INVALID_ARGUMENT; - const texec_submit_backpressure_info_t* bpi = texec_structure_find(info->header.next, TEXEC_STRUCTURE_TYPE_SUBMIT_BACKPRESSURE); + const texec_submit_backpressure_info_t* bpi = texec_structure_find(info->header.next, TEXEC_STRUCT_TYPE_SUBMIT_BACKPRESSURE); const texec_backpressure_policy_t backpressure = (bpi ? bpi->backpressure : tp_ex->backpressure); - const texec_submit_trace_context_info_t* tci = texec_structure_find(info->header.next, TEXEC_STRUCTURE_TYPE_SUBMIT_TRACE_CONTEXT); + const texec_submit_trace_context_info_t* tci = texec_structure_find(info->header.next, TEXEC_STRUCT_TYPE_SUBMIT_TRACE_CONTEXT); const void* trace_context = tci ? tci->trace_context : NULL; texec_task_handle_t* h = texec_task_handle_create(tp_ex->base.alloc); @@ -214,7 +214,7 @@ static texec_status_t tp_vtbl_submit_many(texec_executor_t* ex, const texec_subm if (!tp_is_thread_pool(ex)) return TEXEC_STATUS_INVALID_ARGUMENT; const texec_task_group_create_info_t gi = { - .header = {.type = TEXEC_STRUCTURE_TYPE_TASK_GROUP_CREATE_INFO, .next = NULL}, + .header = {.type = TEXEC_STRUCT_TYPE_TASK_GROUP_CREATE_INFO, .next = NULL}, .capacity = count, }; @@ -330,7 +330,7 @@ texec_status_t texec_executor_create_thread_pool(const texec_thread_pool_executo tp_ex->thread_count = cfg->thread_count; const texec_queue_create_info_t qi = { - .header = {.type = TEXEC_STRUCTURE_TYPE_QUEUE_CREATE_INFO, .next = NULL}, + .header = {.type = TEXEC_STRUCT_TYPE_QUEUE_CREATE_INFO, .next = NULL}, .capacity = cfg->queue_capacity, }; texec_queue_t* q = NULL; From 46e2cfa775d5a5ee0dba9b041b623a0bde8d9d7d Mon Sep 17 00:00:00 2001 From: akrivx Date: Thu, 29 Jan 2026 13:48:36 +0000 Subject: [PATCH 9/9] Rename task callbacks - Rename `fn` -> `run` - Rename `cleanup` -> `on_complete` --- examples/texec_example.c | 2 +- include/texec/task.h | 8 ++++---- src/internal/executor.h | 9 +++++---- src/thread_pool_executor.c | 2 +- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/examples/texec_example.c b/examples/texec_example.c index 68b7499..8fbd8c8 100644 --- a/examples/texec_example.c +++ b/examples/texec_example.c @@ -32,7 +32,7 @@ int main(void) { const texec_submit_info_t submit = { .header = {.type = TEXEC_STRUCT_TYPE_SUBMIT_INFO, .next = NULL}, .task = { - .fn = hello_task, + .run = hello_task, .ctx = "work item", }, }; diff --git a/include/texec/task.h b/include/texec/task.h index 5b3bb83..baf2592 100644 --- a/include/texec/task.h +++ b/include/texec/task.h @@ -4,13 +4,13 @@ extern "C" { #endif -typedef int (*texec_task_fn_t)(void* ctx); -typedef void (*texec_task_cleanup_fn_t)(void* ctx); +typedef int (*texec_task_run_t)(void* ctx); +typedef void (*texec_task_on_complete_fn_t)(void* ctx); typedef struct texec_task { - texec_task_fn_t fn; + texec_task_run_t run; void* ctx; - texec_task_cleanup_fn_t cleanup; // optional; called after fn, on the executing thread + texec_task_on_complete_fn_t on_complete; // optional; called after run, on the executing thread } texec_task_t; #ifdef __cplusplus diff --git a/src/internal/executor.h b/src/internal/executor.h index e9f58f9..5fbad8a 100644 --- a/src/internal/executor.h +++ b/src/internal/executor.h @@ -49,15 +49,16 @@ typedef struct texec_thread_pool_executor_config { texec_status_t texec_executor_create_thread_pool(const texec_thread_pool_executor_config_t* cfg, texec_executor_t** out_ex); -static inline void texec_task_cleanup(const texec_task_t* t) { - if (t->cleanup) t->cleanup(t->ctx); +static inline void texec_task_on_complete(const texec_task_t* t) { + if (!t->on_complete) return; + t->on_complete(t->ctx); } static inline void texec_executor_consume_work_item(const texec_executor_t* ex, texec_work_item_t* wi) { texec_diagnostics_on_task_begin(ex->diag, &wi->task, wi->trace_context); - const int result = wi->task.fn(wi->task.ctx); + const int result = wi->task.run(wi->task.ctx); texec_diagnostics_on_task_end(ex->diag, &wi->task, wi->trace_context, result); - texec_task_cleanup(&wi->task); + texec_task_on_complete(&wi->task); texec_task_handle_complete(wi->handle, result); texec_work_item_destroy(wi, ex->alloc); } diff --git a/src/thread_pool_executor.c b/src/thread_pool_executor.c index bbe6628..7b87992 100644 --- a/src/thread_pool_executor.c +++ b/src/thread_pool_executor.c @@ -181,7 +181,7 @@ static texec_status_t tp_vtbl_submit(texec_executor_t* ex, const texec_submit_i return TEXEC_STATUS_INVALID_ARGUMENT; } - if (!info->task.fn) return TEXEC_STATUS_INVALID_ARGUMENT; + if (!info->task.run) return TEXEC_STATUS_INVALID_ARGUMENT; const texec_submit_backpressure_info_t* bpi = texec_structure_find(info->header.next, TEXEC_STRUCT_TYPE_SUBMIT_BACKPRESSURE); const texec_backpressure_policy_t backpressure = (bpi ? bpi->backpressure : tp_ex->backpressure);