improve protection against multiple instantiation

This commit is contained in:
Matthew Flatt 2010-10-21 15:39:42 -07:00
parent 881c182956
commit bcbe42f4ff
4 changed files with 22 additions and 13 deletions

View File

@ -0,0 +1,14 @@
#lang racket/base
(require ffi/unsafe)
(provide scheme_register_process_global)
;; This module must be instantiated only once:
(define scheme_register_process_global
(get-ffi-obj 'scheme_register_process_global #f (_fun _string _pointer -> _pointer)))
(let ([v (scheme_register_process_global "GRacket-support-initialized"
(cast 1 _scheme _pointer))])
(when v
(error "cannot instantiate `racket/gui/base' a second time in the same process")))

View File

@ -5,7 +5,8 @@
racket/class
"rbtree.rkt"
"../../lock.rkt"
"handlers.rkt")
"handlers.rkt"
"once.rkt")
(provide queue-evt
set-check-queue!
@ -54,15 +55,6 @@
scheme_register_process_global)
;; ------------------------------------------------------------
;; This module must be instantiated only once:
(define-mz scheme_register_process_global (_fun _string _pointer -> _pointer))
(let ([v (scheme_register_process_global "GRacket-support-initialized"
(cast 1 _scheme _pointer))])
(when v
(error "cannot start GRacket a second time in the same process")))
;; ------------------------------------------------------------
;; Create a Scheme evt that is ready when a queue is nonempty

View File

@ -1,6 +1,7 @@
#lang racket/base
(require ffi/unsafe
ffi/unsafe/define)
ffi/unsafe/define
"once.rkt")
(provide define-mz)

View File

@ -18,5 +18,7 @@
(define-namespace-anchor anchor)
(define (gui-dynamic-require sym)
(parameterize ([current-namespace (namespace-anchor->empty-namespace anchor)])
(dynamic-require 'mred sym)))
(if (gui-available?)
(parameterize ([current-namespace (namespace-anchor->empty-namespace anchor)])
(dynamic-require 'mred sym))
(error "racket/gui/base is not available")))