avoid crashing via GCed racket/gui
instance
This commit is contained in:
parent
927289cd8e
commit
de783c8378
gui-lib/mred/private/wx
|
@ -10,7 +10,8 @@
|
||||||
"../common/queue.rkt"
|
"../common/queue.rkt"
|
||||||
"../common/handlers.rkt"
|
"../common/handlers.rkt"
|
||||||
"../../lock.rkt"
|
"../../lock.rkt"
|
||||||
"../common/freeze.rkt")
|
"../common/freeze.rkt"
|
||||||
|
"../common/keep-forever.rkt")
|
||||||
|
|
||||||
(provide
|
(provide
|
||||||
(protect-out app
|
(protect-out app
|
||||||
|
@ -486,3 +487,4 @@
|
||||||
(post-dummy-event) ; why do we need this? 'nextEventMatchingMask:' seems to hang if we don't use it
|
(post-dummy-event) ; why do we need this? 'nextEventMatchingMask:' seems to hang if we don't use it
|
||||||
(scheme_set_place_sleep (function-ptr sleep-until-event
|
(scheme_set_place_sleep (function-ptr sleep-until-event
|
||||||
(_fun #:atomic? #t _float _gcpointer -> _void))))
|
(_fun #:atomic? #t _float _gcpointer -> _void))))
|
||||||
|
(keep-forever sleep-until-event)
|
||||||
|
|
12
gui-lib/mred/private/wx/common/keep-forever.rkt
Normal file
12
gui-lib/mred/private/wx/common/keep-forever.rkt
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#lang racket/base
|
||||||
|
(require ffi/unsafe)
|
||||||
|
|
||||||
|
(provide (protect-out keep-forever))
|
||||||
|
|
||||||
|
(define forever (box null))
|
||||||
|
|
||||||
|
;; Keeps as long as the place runs, at least:
|
||||||
|
(void (malloc-immobile-cell forever))
|
||||||
|
|
||||||
|
(define (keep-forever v)
|
||||||
|
(set-box! forever (cons v (unbox forever))))
|
|
@ -7,7 +7,8 @@
|
||||||
"rbtree.rkt"
|
"rbtree.rkt"
|
||||||
"../../lock.rkt"
|
"../../lock.rkt"
|
||||||
"handlers.rkt"
|
"handlers.rkt"
|
||||||
"once.rkt")
|
"once.rkt"
|
||||||
|
"keep-forever.rkt")
|
||||||
|
|
||||||
(provide
|
(provide
|
||||||
(protect-out queue-evt
|
(protect-out queue-evt
|
||||||
|
@ -86,6 +87,8 @@
|
||||||
(define (queue-wakeup o fds)
|
(define (queue-wakeup o fds)
|
||||||
(do-queue-wakeup fds))
|
(do-queue-wakeup fds))
|
||||||
(scheme_add_evt event-queue-type check-queue queue-wakeup #f 0)
|
(scheme_add_evt event-queue-type check-queue queue-wakeup #f 0)
|
||||||
|
(keep-forever check-queue)
|
||||||
|
(keep-forever queue-wakeup)
|
||||||
(define queue-evt (let ([p (malloc 16)]
|
(define queue-evt (let ([p (malloc 16)]
|
||||||
[p2 (malloc 'nonatomic _pointer)])
|
[p2 (malloc 'nonatomic _pointer)])
|
||||||
(memset p 0 16)
|
(memset p 0 16)
|
||||||
|
|
|
@ -9,7 +9,8 @@
|
||||||
"clipboard.rkt"
|
"clipboard.rkt"
|
||||||
"const.rkt"
|
"const.rkt"
|
||||||
"w32.rkt"
|
"w32.rkt"
|
||||||
"unique.rkt")
|
"unique.rkt"
|
||||||
|
"../common/keep-forever.rkt")
|
||||||
|
|
||||||
(provide (protect-out gtk-start-event-pump
|
(provide (protect-out gtk-start-event-pump
|
||||||
try-to-sync-refresh
|
try-to-sync-refresh
|
||||||
|
@ -203,6 +204,8 @@
|
||||||
(gdk_event_handler_set event-dispatch
|
(gdk_event_handler_set event-dispatch
|
||||||
#f
|
#f
|
||||||
uninstall)
|
uninstall)
|
||||||
|
(keep-forever event-dispatch)
|
||||||
|
(keep-forever uninstall)
|
||||||
|
|
||||||
(define (dispatch-all-ready)
|
(define (dispatch-all-ready)
|
||||||
(pre-event-sync #f)
|
(pre-event-sync #f)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user