diff --git a/racket-webview-qt.rkt b/racket-webview-qt.rkt index 7d6d2eb..4c43b23 100644 --- a/racket-webview-qt.rkt +++ b/racket-webview-qt.rkt @@ -824,24 +824,28 @@ #t))) +(define finalizer-executed #f) + (define (rkt-webview-finalizer rkt-wv-store close-windows message) - (dbg-webview "rkt-webview-finalizer active") - (when close-windows - (let ((open-windows (hash->list rkt-wv-store))) - (for-each (λ (kv) - (let ((win (car kv)) - (handle (cdr kv))) - (rkt-webview-close handle))) - open-windows))) - (rkt_webview_register_evt_callback #f) - (dbg-webview "Sending guard-stop message to event callback") - (event-callback evt-guard-stop) - (dbg-webview "Cleaning up FFI library") - (rkt_webview_cleanup) - (unless (eq? message #f) (error message)) - (dbg-webview "Stopping event processing thread (kill-thread)") - (stop-event-processing) - (dbg-webview "Finalizer done") + (unless finalizer-executed + (dbg-webview "rkt-webview-finalizer active") + (when close-windows + (let ((open-windows (hash->list rkt-wv-store))) + (for-each (λ (kv) + (let ((win (car kv)) + (handle (cdr kv))) + (rkt-webview-close handle))) + open-windows))) + (dbg-webview "Sending guard-stop message to event callback") + (event-callback evt-guard-stop) + (dbg-webview "Cleaning up FFI library") + (rkt_webview_cleanup) + (unless (eq? message #f) (error message)) + (dbg-webview "Stopping event processing thread (kill-thread)") + (stop-event-processing) + (dbg-webview "Finalizer done") + (set finalizer-executed #t) + ) ) (define (rkt-webview-exit . args) @@ -853,7 +857,8 @@ ) (rkt-webview-finalizer rkt-wv-store cl-w msg) (unregister-custodian-shutdown rkt-wv-store custodian-finalizer) - )) + ) + ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Cleanup on exit