avoid crashing via GCed racket/gui instance

This commit is contained in:
Matthew Flatt 2015-01-06 19:54:21 -07:00
parent 927289cd8e
commit de783c8378
4 changed files with 23 additions and 3 deletions
gui-lib/mred/private/wx

View File

@ -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)

View 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))))

View File

@ -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)

View File

@ -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)