Sat, 10 Jan 2026 19:44:10 +0100
add function for buffering mainthread calls
| ui/cocoa/toolkit.m | file | annotate | diff | comparison | revisions | |
| ui/common/threadpool.c | file | annotate | diff | comparison | revisions | |
| ui/common/threadpool.h | file | annotate | diff | comparison | revisions | |
| ui/gtk/toolkit.c | file | annotate | diff | comparison | revisions | |
| ui/motif/toolkit.c | file | annotate | diff | comparison | revisions | |
| ui/ui/toolkit.h | file | annotate | diff | comparison | revisions |
--- a/ui/cocoa/toolkit.m Thu Jan 08 18:17:06 2026 +0100 +++ b/ui/cocoa/toolkit.m Sat Jan 10 19:44:10 2026 +0100 @@ -174,6 +174,11 @@ @end void ui_call_mainthread(ui_threadfunc tf, void* td) { + if(uic_mainthread_calls_is_buffered()) { + uic_add_buffered_mainthread_call(tf, td); + return; + } + UiAppCallback *cb = [[UiAppCallback alloc]initWithCallback:tf userdata:td]; [cb callMainThread]; }
--- a/ui/common/threadpool.c Thu Jan 08 18:17:06 2026 +0100 +++ b/ui/common/threadpool.c Sat Jan 10 19:44:10 2026 +0100 @@ -30,6 +30,7 @@ #include "threadpool.h" #include "context.h" +#include <cx/linked_list.h> #include <pthread.h> #include <stdio.h> @@ -38,6 +39,56 @@ static threadpool_job kill_job; + + +static pthread_mutex_t mc_buffer_mutex; +static CxList *mainthread_call_buffer; +static volatile int mainthread_call_buffered = 0; + +typedef struct UiMainCall { + ui_threadfunc func; + void *data; +} UiMainCall; + +void uic_init_threads(void) { + pthread_mutex_init(&mc_buffer_mutex, NULL); + mainthread_call_buffer = cxLinkedListCreate(NULL, sizeof(UiMainCall)); +} + +int uic_mainthread_calls_is_buffered(void) { + return mainthread_call_buffered; +} + +void uic_add_buffered_mainthread_call(ui_threadfunc func, void *data) { + pthread_mutex_lock(&mc_buffer_mutex); + UiMainCall call; + call.func = func; + call.data = data; + cxListAdd(mainthread_call_buffer, &call); + pthread_mutex_unlock(&mc_buffer_mutex); +} + + +void ui_buffer_mainthread_calls(UiBool enable_buffering) { + mainthread_call_buffered = enable_buffering; + if(!enable_buffering) { + ui_exec_buffered_mainthread_calls(); + } +} +void ui_exec_buffered_mainthread_calls(void) { + pthread_mutex_lock(&mc_buffer_mutex); + CxIterator i = cxListIterator(mainthread_call_buffer); + cx_foreach(UiMainCall *, call, i) { + if(call->func) { + call->func(call->data); + } + } + cxListClear(mainthread_call_buffer); + pthread_mutex_unlock(&mc_buffer_mutex); +} + + + UiThreadpool* threadpool_new(int min, int max) { UiThreadpool *pool = malloc(sizeof(UiThreadpool)); pool->queue = ui_queue_create();
--- a/ui/common/threadpool.h Thu Jan 08 18:17:06 2026 +0100 +++ b/ui/common/threadpool.h Sat Jan 10 19:44:10 2026 +0100 @@ -39,6 +39,10 @@ extern "C" { #endif +void uic_init_threads(void); +int uic_mainthread_calls_is_buffered(void); +void uic_add_buffered_mainthread_call(ui_threadfunc func, void *data); + typedef struct UiQueueElm UiQueueElm; typedef struct UiQueue UiQueue;
--- a/ui/gtk/toolkit.c Thu Jan 08 18:17:06 2026 +0100 +++ b/ui/gtk/toolkit.c Sat Jan 10 19:44:10 2026 +0100 @@ -76,6 +76,7 @@ uic_toolbar_init(); ui_image_init(); uic_load_app_properties(); + uic_init_threads(); #if GTK_MAJOR_VERSION >= 4 scale_factor = 1; // TODO @@ -203,6 +204,11 @@ } void ui_call_mainthread(ui_threadfunc tf, void* td) { + if(uic_mainthread_calls_is_buffered()) { + uic_add_buffered_mainthread_call(tf, td); + return; + } + UiJob *job = malloc(sizeof(UiJob)); job->job_func = tf; job->job_data = td;
--- a/ui/motif/toolkit.c Thu Jan 08 18:17:06 2026 +0100 +++ b/ui/motif/toolkit.c Sat Jan 10 19:44:10 2026 +0100 @@ -221,6 +221,11 @@ } void ui_call_mainthread(ui_threadfunc tf, void* td) { + if(uic_mainthread_calls_is_buffered()) { + uic_add_buffered_mainthread_call(tf, td); + return; + } + UiJob *job = malloc(sizeof(UiJob)); memset(job, 0, sizeof(UiJob)); job->job_func = tf;
--- a/ui/ui/toolkit.h Thu Jan 08 18:17:06 2026 +0100 +++ b/ui/ui/toolkit.h Sat Jan 10 19:44:10 2026 +0100 @@ -556,6 +556,10 @@ UIEXPORT void ui_job(UiObject *obj, ui_threadfunc tf, void *td, ui_callback f, void *fd); UIEXPORT void ui_call_mainthread(ui_threadfunc tf, void* td); + +UIEXPORT void ui_buffer_mainthread_calls(UiBool enable_buffering); +UIEXPORT void ui_exec_buffered_mainthread_calls(void); + UIEXPORT UiThreadpool* ui_threadpool_create(int nthreads); UIEXPORT void ui_threadpool_destroy(UiThreadpool* pool); UIEXPORT void ui_threadpool_job(UiThreadpool* pool, UiObject* obj, ui_threadfunc tf, void* td, ui_callback f, void* fd);