add ui_exec_buffered_mainthread_calls_wait default tip

Mon, 12 Jan 2026 21:25:51 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 12 Jan 2026 21:25:51 +0100
changeset 1048
60bba3640adb
parent 1047
acb5352a2038

add ui_exec_buffered_mainthread_calls_wait

ui/common/threadpool.c file | annotate | diff | comparison | revisions
ui/ui/toolkit.h file | annotate | diff | comparison | revisions
--- a/ui/common/threadpool.c	Mon Jan 12 20:58:41 2026 +0100
+++ b/ui/common/threadpool.c	Mon Jan 12 21:25:51 2026 +0100
@@ -42,6 +42,7 @@
 
 
 static pthread_mutex_t mc_buffer_mutex;
+static pthread_cond_t  mc_buffer_available;
 static CxList *mainthread_call_buffer;
 static volatile int mainthread_call_buffered = 0;
 
@@ -52,6 +53,7 @@
 
 void uic_init_threads(void) {
     pthread_mutex_init(&mc_buffer_mutex, NULL);
+    pthread_cond_init(&mc_buffer_available, NULL);
     mainthread_call_buffer = cxLinkedListCreate(NULL, sizeof(UiMainCall));
 }
 
@@ -65,6 +67,7 @@
     call.func = func;
     call.data = data;
     cxListAdd(mainthread_call_buffer, &call);
+    pthread_cond_signal(&mc_buffer_available);
     pthread_mutex_unlock(&mc_buffer_mutex);
 }
 
@@ -75,8 +78,8 @@
         ui_exec_buffered_mainthread_calls();
     }
 }
-void ui_exec_buffered_mainthread_calls(void) {
-    pthread_mutex_lock(&mc_buffer_mutex);
+
+static void exec_buffered_calls(void) {
     CxIterator i = cxListIterator(mainthread_call_buffer);
     cx_foreach(UiMainCall *, call, i) {
         if(call->func) {
@@ -84,10 +87,34 @@
         }
     }
     cxListClear(mainthread_call_buffer);
+}
+
+void ui_exec_buffered_mainthread_calls(void) {
+    pthread_mutex_lock(&mc_buffer_mutex);
+    exec_buffered_calls();
     pthread_mutex_unlock(&mc_buffer_mutex);
 }
 
-
+UIEXPORT void ui_exec_buffered_mainthread_calls_wait(int timeout) {
+    struct timespec ts;
+    if(timeout > 0) {
+        clock_gettime(CLOCK_REALTIME, &ts);
+        ts.tv_sec += timeout;
+    }
+    
+    pthread_mutex_lock(&mc_buffer_mutex);
+    while(cxListSize(mainthread_call_buffer) == 0) {
+        if(timeout > 0) {
+            if(pthread_cond_timedwait(&mc_buffer_available, &mc_buffer_mutex, &ts)) {
+                break;
+            }
+        } else {
+            pthread_cond_wait(&mc_buffer_available, &mc_buffer_mutex);
+        }
+    }
+    exec_buffered_calls();
+    pthread_mutex_unlock(&mc_buffer_mutex);
+}
 
 UiThreadpool* threadpool_new(int min, int max) {
     UiThreadpool *pool = malloc(sizeof(UiThreadpool));
--- a/ui/ui/toolkit.h	Mon Jan 12 20:58:41 2026 +0100
+++ b/ui/ui/toolkit.h	Mon Jan 12 21:25:51 2026 +0100
@@ -561,6 +561,7 @@
 
 UIEXPORT void ui_buffer_mainthread_calls(UiBool enable_buffering);
 UIEXPORT void ui_exec_buffered_mainthread_calls(void);
+UIEXPORT void ui_exec_buffered_mainthread_calls_wait(int timeout);
 
 UIEXPORT UiThreadpool* ui_threadpool_create(int nthreads);
 UIEXPORT void ui_threadpool_destroy(UiThreadpool* pool);

mercurial