From 95936abdcea48cc98ae5bbef320bfb041ad78160 Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Mon, 20 Apr 2026 18:19:20 +0200 Subject: [PATCH] Finalization and synchronization --- private/utils.rkt | 1 + racket-webview-qt.rkt | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/private/utils.rkt b/private/utils.rkt index 28687e3..f7ef90d 100644 --- a/private/utils.rkt +++ b/private/utils.rkt @@ -39,6 +39,7 @@ info-webview warn-webview fatal-webview + sync-log-webview ) diff --git a/racket-webview-qt.rkt b/racket-webview-qt.rkt index 02f8305..1092cba 100644 --- a/racket-webview-qt.rkt +++ b/racket-webview-qt.rkt @@ -316,7 +316,7 @@ ;RKTWEBVIEW_QT_EXPORT void rkt_webview_register_evt_callback(void (*f)(int)); (define-rktwebview rkt_webview_register_evt_callback (_fun (_fun #:async-apply evt-apply #:atomic? #t - _int -> _void) -> _void)) + _int -> _void) -> _int)) ;RKTWEBVIEW_QT_EXPORT void rkt_webview_init(const char *from); (define-rktwebview rkt_webview_init @@ -526,7 +526,10 @@ (define (event-callback num) (os-async-channel-put events-channel num)) -(rkt_webview_register_evt_callback event-callback) +(void + (while (= (rkt_webview_register_evt_callback event-callback) 0) + (sleep 0.1) + )) ;(set! quiet-call (start-event-processing)) (define evt-cb-hash (make-hash)) @@ -593,7 +596,10 @@ (if polling (begin (sleep 0.01) - (os-async-channel-try-get events-channel)) + (let ((w (os-async-channel-try-get events-channel))) + (if (eq? w #f) + 0 + w))) (sync events-channel)))) ) (letrec @@ -867,9 +873,14 @@ (dbg-webview "Start event polling instead of using an event callback") (dbg-webview "To make sure the library does not get stuck on a dangling callback") (event-callback evt-start-polling) - (rkt_webview_register_evt_callback #f) + + ; Set callback to null, but as an event can be in progress, + ; we need to check if the mutex lock could be aquired. + ; otherwise we wait. + (while (= (rkt_webview_register_evt_callback #f) 0) + (sleep 0.1)) (while (eq? event-processing-kind 'sync) - (sleep 0.01)) + (sleep 0.1)) (sync-log-webview) ; When asked to, close all windows