Skip to content

Commit 207db19

Browse files
committed
use ffi/unsafe/schedule instead of scheme_...
1 parent 93c7f13 commit 207db19

File tree

8 files changed

+56
-96
lines changed

8 files changed

+56
-96
lines changed

gui-lib/info.rkt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
(define deps '("srfi-lite-lib"
66
"data-lib"
7-
["base" #:version "6.5.0.2"]
7+
["base" #:version "6.11.0.1"]
88
"syntax-color-lib"
99
["draw-lib" #:version "1.13"]
1010
["snip-lib" #:version "1.2"]

gui-lib/mred/private/wx/cocoa/gc.rkt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@
2020

2121
(define msg-send-proc (get-ffi-obj 'objc_msgSend objc-lib _fpointer))
2222

23-
(define-mz scheme_add_gc_callback (_fun _racket _racket -> _racket))
24-
(define-mz scheme_remove_gc_callback (_fun _racket -> _void))
23+
(define-mz scheme_add_gc_callback (_fun _racket _racket -> _racket)
24+
#:fail (lambda () void))
25+
(define-mz scheme_remove_gc_callback (_fun _racket -> _void)
26+
#:fail (lambda () void))
2527

2628
(define (make-gc-action-desc win sel val)
2729
(vector

gui-lib/mred/private/wx/cocoa/queue.rkt

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
#lang racket/base
22
(require ffi/unsafe/objc
33
ffi/unsafe
4+
ffi/unsafe/global
5+
ffi/unsafe/schedule
6+
ffi/unsafe/custodian
47
racket/class
58
racket/draw/private/dc
69
"pool.rkt"
@@ -10,8 +13,7 @@
1013
"../common/queue.rkt"
1114
"../common/handlers.rkt"
1215
"../../lock.rkt"
13-
"../common/freeze.rkt"
14-
"../common/keep-forever.rkt")
16+
"../common/freeze.rkt")
1517

1618
(provide
1719
(protect-out app
@@ -89,7 +91,7 @@
8991
[-a _void (applicationDidChangeScreenParameters: notification)
9092
;; Screen changes sometimes make the event loop get stuck;
9193
;; hack: schedule a wake-up call in 5 seconds
92-
(let ([priviledged-custodian ((get-ffi-obj 'scheme_make_custodian #f (_fun _pointer -> _scheme)) #f)])
94+
(let ([priviledged-custodian (make-custodian-at-root)])
9395
(parameterize ([current-custodian priviledged-custodian])
9496
(thread (lambda () (sleep 5.0)))))
9597
(unless (version-10.10-or-later?)
@@ -116,7 +118,7 @@
116118
-> _OSStatus))
117119
(define NSApplicationActivationPolicyRegular 0)
118120
(define NSApplicationActivationPolicyAccessory 1)
119-
(unless (scheme_register_process_global "PLT_IS_FOREGROUND_APP" #f)
121+
(unless (register-process-global #"PLT_IS_FOREGROUND_APP" #f)
120122
(cond
121123
[(version-10.6-or-later?)
122124
;; When a frame or root menu bar is created, we promote to
@@ -132,7 +134,7 @@
132134
(tellv app setDelegate: app-delegate)
133135

134136
(define (bring-to-front)
135-
(unless (scheme_register_process_global "Racket-GUI-no-front" #f)
137+
(unless (register-process-global #"Racket-GUI-no-front" #f)
136138
(tellv app activateIgnoringOtherApps: #:type _BOOL #t)
137139
;; It may not be that easy...
138140
(when (version-10.7-or-later?)
@@ -311,13 +313,12 @@
311313
(define-cf CFRunLoopAddObserver (_fun _pointer _pointer _pointer -> _void))
312314
(define-cf CFRunLoopGetMain (_fun -> _pointer))
313315
(define kCFRunLoopExit (arithmetic-shift 1 7))
314-
(define-mz scheme_signal_received (_fun -> _void))
315316
(define already-exited? #f)
316317
(define sleeping? #f)
317318
(define (exiting-run-loop x y z)
318319
(when sleeping?
319320
(if already-exited?
320-
(scheme_signal_received)
321+
(unsafe-signal-received)
321322
(set! already-exited? #t))))
322323
(let ([o (CFRunLoopObserverCreate #f kCFRunLoopExit #t 0 exiting-run-loop #f)])
323324
(CFRunLoopAddObserver (CFRunLoopGetMain) o kCFRunLoopCommonModes))
@@ -468,23 +469,15 @@
468469
;; Install an alternate "sleep" function (in the Racket core)
469470
;; that wakes up if any Cocoa event is ready.
470471

471-
(define-mz scheme_start_sleeper_thread (_fun _fpointer _float _pointer _int -> _void))
472-
(define-mz scheme_end_sleeper_thread (_fun -> _void))
473-
474-
(define-mz scheme_sleep _pointer)
475-
(define-mz scheme_set_place_sleep (_fun _pointer -> _void))
476-
477472
;; Called through an atomic callback:
478-
(define (sleep-until-event secs fds)
473+
(define (sleep-until-event)
479474
(set! sleeping? #t)
480475
(set! already-exited? #f)
481-
(scheme_start_sleeper_thread scheme_sleep secs fds write_sock)
482-
(check-one-event #t #f) ; blocks until an event is ready
483-
(scheme_end_sleeper_thread)
476+
;; blocks until an event is ready, which can include a post from a
477+
;; background `sleep` thread that that triggers `write_sock`:
478+
(check-one-event #t #f)
484479
(set! sleeping? #f))
485480

486481
(define (cocoa-install-event-wakeup)
487482
(post-dummy-event) ; why do we need this? 'nextEventMatchingMask:' seems to hang if we don't use it
488-
(scheme_set_place_sleep (function-ptr sleep-until-event
489-
(_fun #:atomic? #t _float _gcpointer -> _void))))
490-
(keep-forever sleep-until-event)
483+
(unsafe-set-sleep-in-thread! sleep-until-event write_sock))
Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
11
#lang racket/base
2-
(require ffi/unsafe)
3-
4-
(provide (protect-out scheme_register_process_global))
2+
(require ffi/unsafe
3+
ffi/unsafe/global)
54

65
;; This module must be instantiated only once:
7-
8-
(define scheme_register_process_global
9-
(get-ffi-obj 'scheme_register_process_global #f (_fun _string _pointer -> _pointer)))
10-
11-
(let ([v (scheme_register_process_global "GRacket-support-initialized"
12-
(cast 1 _scheme _pointer))])
6+
(let ([v (register-process-global #"GRacket-support-initialized"
7+
(cast 1 _scheme _pointer))])
138
(when v
149
(error "cannot instantiate `racket/gui/base' a second time in the same process")))

gui-lib/mred/private/wx/common/queue.rkt

Lines changed: 19 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22
(require ffi/unsafe
33
racket/draw/private/utils
44
ffi/unsafe/atomic
5+
ffi/unsafe/custodian
6+
ffi/unsafe/schedule
57
racket/class
68
racket/port
79
"rbtree.rkt"
810
"../../lock.rkt"
911
"handlers.rkt"
10-
"once.rkt"
11-
"keep-forever.rkt")
12+
"once.rkt")
1213

1314
(provide
1415
(protect-out queue-evt
@@ -61,40 +62,25 @@
6162

6263
begin-busy-cursor
6364
end-busy-cursor
64-
is-busy?)
65-
66-
scheme_register_process_global)
65+
is-busy?))
6766

6867
;; ------------------------------------------------------------
6968
;; Create a Scheme evt that is ready when a queue is nonempty
7069

71-
(define _Scheme_Type _short)
72-
(define-mz scheme_make_type (_fun _string -> _Scheme_Type))
73-
(define event-queue-type (scheme_make_type "event-queue"))
74-
75-
(define-mz scheme_add_evt (_fun _Scheme_Type
76-
(_fun #:atomic? #t _scheme -> _int)
77-
(_fun #:atomic? #t _scheme _gcpointer -> _void)
78-
_pointer
79-
_int
80-
-> _void))
70+
(struct event-queue-evt ()
71+
#:property prop:evt (unsafe-poller
72+
(lambda (self ctx)
73+
(cond
74+
[(do-check-queue)
75+
(values (list (void)) #f)]
76+
[else
77+
(do-queue-wakeup ctx)
78+
(values #f self)]))))
8179

8280
(define (do-check-queue) #f)
8381
(define (do-queue-wakeup fds) #f)
8482

85-
(define (check-queue o)
86-
(if (do-check-queue) 1 0))
87-
(define (queue-wakeup o fds)
88-
(do-queue-wakeup fds))
89-
(scheme_add_evt event-queue-type check-queue queue-wakeup #f 0)
90-
(keep-forever check-queue)
91-
(keep-forever queue-wakeup)
92-
(define queue-evt (let ([p (malloc 16)]
93-
[p2 (malloc 'nonatomic _pointer)])
94-
(memset p 0 16)
95-
(ptr-set! p _Scheme_Type event-queue-type)
96-
(ptr-set! p2 _pointer p)
97-
(ptr-ref p2 _scheme)))
83+
(define queue-evt (event-queue-evt))
9884

9985
(define (set-check-queue! check)
10086
(set! do-check-queue check))
@@ -191,17 +177,7 @@
191177
;; isn't GCed
192178
(define active-eventspaces (make-hasheq))
193179

194-
(define current-cb-box (make-parameter #f))
195-
196-
(define-mz scheme_add_managed (_fun _racket ; custodian
197-
_racket ; object
198-
(_fun #:atomic? #t #:keep (lambda (v) (set-box! (current-cb-box) v))
199-
_racket _racket -> _void)
200-
_racket ; data
201-
_int ; strong?
202-
-> _gcpointer))
203-
204-
(define (shutdown-eventspace! e ignored)
180+
(define (shutdown-eventspace! e)
205181
;; atomic mode
206182
(unless (eventspace-shutdown? e)
207183
(set-eventspace-shutdown?! e #t)
@@ -366,12 +342,10 @@
366342
(make-hash)
367343
0)]
368344
[cb-box (box #f)])
369-
(parameterize ([current-cb-box cb-box])
370-
(scheme_add_managed (current-custodian)
371-
e
372-
shutdown-eventspace!
373-
cb-box ; retain callback until it's called
374-
0))
345+
(register-custodian-shutdown e
346+
shutdown-eventspace!
347+
(current-custodian)
348+
#:weak? #t)
375349
e)))
376350

377351
(define main-eventspace (make-eventspace* (current-thread)))

gui-lib/mred/private/wx/gtk/queue.rkt

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#lang racket/base
22
(require racket/class
33
ffi/unsafe
4+
ffi/unsafe/global
5+
ffi/unsafe/schedule
46
"utils.rkt"
57
"types.rkt"
68
"../../lock.rkt"
@@ -39,10 +41,10 @@
3941
(define-gdk gdk_set_program_class (_fun _string -> _void))
4042

4143
(define x11-display
42-
(let* ([argc-ptr (scheme_register_process_global "PLT_X11_ARGUMENT_COUNT" #f)]
44+
(let* ([argc-ptr (register-process-global #"PLT_X11_ARGUMENT_COUNT" #f)]
4345
[argc (or (and argc-ptr (cast argc-ptr _pointer _long)) 0)]
4446
[argv (and (positive? argc)
45-
(scheme_register_process_global "PLT_X11_ARGUMENTS" #f))]
47+
(register-process-global #"PLT_X11_ARGUMENTS" #f))]
4648
[display (getenv "DISPLAY")])
4749
;; Convert X11 arguments, if any, to Gtk form:
4850
(let-values ([(args single-instance?)
@@ -86,7 +88,7 @@
8688
(or display ":0"))))
8789
(when single-instance?
8890
(do-single-instance))
89-
(let ([v (scheme_register_process_global "Racket-GUI-wm-class" #f)])
91+
(let ([v (register-process-global #"Racket-GUI-wm-class" #f)])
9092
(when v
9193
(gdk_set_program_class (cast v _pointer _string))))
9294
display))))
@@ -144,12 +146,6 @@
144146
(define POLLERR #x8)
145147
(define POLLHUP #x10)
146148

147-
(define-mz scheme_get_fdset (_fun _pointer _int -> _gcpointer))
148-
(define-mz scheme_fdset (_fun _gcpointer _int -> _void))
149-
(define-mz scheme_set_wakeup_time (_fun _gcpointer _double -> _void))
150-
(define-mz scheme_add_fd_eventmask (_fun _gcpointer _int -> _void)
151-
#:fail #f)
152-
153149
(define (install-wakeup fds)
154150
(let ([n (g_main_context_query (g_main_context_default)
155151
#x7FFFFFFF ; max-int, hopefully
@@ -158,7 +154,7 @@
158154
poll-fd-count)])
159155
(let ([to (ptr-ref timeout _int)])
160156
(when (to . >= . 0)
161-
(scheme_set_wakeup_time fds (+ (current-inexact-milliseconds) to))))
157+
(unsafe-poll-ctx-milliseconds-wakeup fds (+ (current-inexact-milliseconds) to))))
162158
(if (n . > . poll-fd-count)
163159
(begin
164160
(set! poll-fds (malloc _GPollFD n))
@@ -167,18 +163,18 @@
167163
(if (eq? 'windows (system-type))
168164
;; We don't know how to deal with GLib FDs under
169165
;; Windows, but we should wake up on any Windows event
170-
(scheme_add_fd_eventmask fds QS_ALLINPUT)
166+
(unsafe-poll-ctx-eventmask-wakeup fds QS_ALLINPUT)
171167
;; Normal FD handling under Unix variants:
172168
(for ([i (in-range n)])
173169
(let* ([gfd (ptr-ref poll-fds _GPollFD i)]
174170
[fd (GPollFD-fd gfd)]
175171
[events (GPollFD-events gfd)])
176172
(when (not (zero? (bitwise-and events POLLIN)))
177-
(scheme_fdset (scheme_get_fdset fds 0) fd))
173+
(unsafe-poll-ctx-fd-wakeup fds fd 'read))
178174
(when (not (zero? (bitwise-and events POLLOUT)))
179-
(scheme_fdset (scheme_get_fdset fds 1) fd))
175+
(unsafe-poll-ctx-fd-wakeup fds fd 'write))
180176
(when (not (zero? (bitwise-and events (bitwise-ior POLLERR POLLHUP))))
181-
(scheme_fdset (scheme_get_fdset fds 2) fd))))))))
177+
(unsafe-poll-ctx-fd-wakeup fds fd 'error))))))))
182178

183179
(set-check-queue! gtk_events_pending)
184180
(set-queue-wakeup! install-wakeup)

gui-lib/mred/private/wx/win32/queue.rkt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
racket/class
44
ffi/unsafe/alloc
55
ffi/unsafe/try-atomic
6+
ffi/unsafe/schedule
67
"utils.rkt"
78
"types.rkt"
89
"const.rkt"
@@ -36,8 +37,6 @@
3637

3738
(define _enum_proc (_wfun _HWND _LPARAM -> _BOOL))
3839

39-
(define-mz scheme_add_fd_eventmask (_fun _pointer _int -> _void))
40-
4140
(define free-msg
4241
((deallocator)
4342
(lambda (msg)
@@ -54,7 +53,7 @@
5453

5554
(define (install-wakeup fds)
5655
(pre-event-sync #t)
57-
(scheme_add_fd_eventmask fds QS_ALLINPUT))
56+
(unsafe-poll-ctx-eventmask-wakeup fds QS_ALLINPUT))
5857

5958
(set-check-queue! events-ready?)
6059
(set-queue-wakeup! install-wakeup)

gui-lib/mred/private/wx/win32/window.rkt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#lang racket/base
22
(require ffi/unsafe
3+
ffi/unsafe/global
34
racket/class
45
racket/draw
56
racket/draw/unsafe/bstr
@@ -110,10 +111,10 @@
110111
(define-user32 BeginPaint (_wfun _HWND _pointer -> _HDC))
111112
(define-user32 EndPaint (_wfun _HDC _pointer -> _BOOL))
112113

113-
(define WM_IS_GRACKET (cast (scheme_register_process_global "PLT_WM_IS_GRACKET" #f)
114+
(define WM_IS_GRACKET (cast (register-process-global #"PLT_WM_IS_GRACKET" #f)
114115
_pointer
115116
_UINT_PTR))
116-
(define GRACKET_GUID (cast (scheme_register_process_global "PLT_GRACKET_GUID" #f)
117+
(define GRACKET_GUID (cast (register-process-global #"PLT_GRACKET_GUID" #f)
117118
_pointer
118119
_bytes))
119120
(define-cstruct _COPYDATASTRUCT

0 commit comments

Comments
 (0)