ffi/unsafe/schedler: add unsafe-make-signal-received
This commit is contained in:
parent
f685a27b41
commit
24f539087f
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
;; In the Racket source repo, this version should change only when
|
;; In the Racket source repo, this version should change only when
|
||||||
;; "racket_version.h" changes:
|
;; "racket_version.h" changes:
|
||||||
(define version "8.0.0.3")
|
(define version "8.0.0.4")
|
||||||
|
|
||||||
(define deps `("racket-lib"
|
(define deps `("racket-lib"
|
||||||
["racket" #:version ,version]))
|
["racket" #:version ,version]))
|
||||||
|
|
|
@ -109,3 +109,21 @@ For use with @racket[unsafe-set-sleep-in-thread!] by
|
||||||
@racket[_foreground-sleep] or something that it triggers, causes the
|
@racket[_foreground-sleep] or something that it triggers, causes the
|
||||||
default sleeping function to request @racket[_foreground-sleep] to
|
default sleeping function to request @racket[_foreground-sleep] to
|
||||||
return.}
|
return.}
|
||||||
|
|
||||||
|
@defproc[(unsafe-make-signal-received) (-> void?)]{
|
||||||
|
|
||||||
|
Returns a function that is like @racket[unsafe-signal-received], but
|
||||||
|
it can be called in any @tech[#:doc reference.scrbl]{place} or in any
|
||||||
|
OS thread as supported by @racketmodname[ffi/unsafe/os-thread] to
|
||||||
|
ensure a subsequent round of polling by the thread scheduler in the
|
||||||
|
@tech[#:doc reference.scrbl]{place} where
|
||||||
|
@racket[unsafe-make-signal-received] was called.
|
||||||
|
|
||||||
|
Synchronizaiton between the result of
|
||||||
|
@racket[unsafe-make-signal-received] and the scheduler will ensure the
|
||||||
|
equivalent of @racket[(memory-order-release)] before the call to the
|
||||||
|
function produced by @racket[unsafe-make-signal-received] and the
|
||||||
|
equivalent of @racket[(memory-order-acquire)] before the scheduler's
|
||||||
|
invocation of pollers.
|
||||||
|
|
||||||
|
@history[#:added "8.0.0.4"]}
|
||||||
|
|
|
@ -6,5 +6,6 @@
|
||||||
unsafe-poll-ctx-eventmask-wakeup
|
unsafe-poll-ctx-eventmask-wakeup
|
||||||
unsafe-poll-ctx-milliseconds-wakeup
|
unsafe-poll-ctx-milliseconds-wakeup
|
||||||
unsafe-signal-received
|
unsafe-signal-received
|
||||||
|
unsafe-make-signal-received
|
||||||
unsafe-set-sleep-in-thread!))
|
unsafe-set-sleep-in-thread!))
|
||||||
(provide (all-from-out '#%unsafe))
|
(provide (all-from-out '#%unsafe))
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
#define USE_COMPILED_STARTUP 1
|
#define USE_COMPILED_STARTUP 1
|
||||||
|
|
||||||
#define EXPECTED_PRIM_COUNT 1484
|
#define EXPECTED_PRIM_COUNT 1485
|
||||||
|
|
||||||
#ifdef MZSCHEME_SOMETHING_OMITTED
|
#ifdef MZSCHEME_SOMETHING_OMITTED
|
||||||
# undef USE_COMPILED_STARTUP
|
# undef USE_COMPILED_STARTUP
|
||||||
|
|
|
@ -404,6 +404,7 @@ static Scheme_Object *unsafe_poll_ctx_fd_wakeup(int argc, Scheme_Object **argv);
|
||||||
static Scheme_Object *unsafe_poll_ctx_eventmask_wakeup(int argc, Scheme_Object **argv);
|
static Scheme_Object *unsafe_poll_ctx_eventmask_wakeup(int argc, Scheme_Object **argv);
|
||||||
static Scheme_Object *unsafe_poll_ctx_time_wakeup(int argc, Scheme_Object **argv);
|
static Scheme_Object *unsafe_poll_ctx_time_wakeup(int argc, Scheme_Object **argv);
|
||||||
static Scheme_Object *unsafe_signal_received(int argc, Scheme_Object **argv);
|
static Scheme_Object *unsafe_signal_received(int argc, Scheme_Object **argv);
|
||||||
|
static Scheme_Object *unsafe_make_signal_received(int argc, Scheme_Object **argv);
|
||||||
static Scheme_Object *unsafe_set_sleep_in_thread(int argc, Scheme_Object **argv);
|
static Scheme_Object *unsafe_set_sleep_in_thread(int argc, Scheme_Object **argv);
|
||||||
|
|
||||||
static Scheme_Object *unsafe_make_place_local(int argc, Scheme_Object **argv);
|
static Scheme_Object *unsafe_make_place_local(int argc, Scheme_Object **argv);
|
||||||
|
@ -676,6 +677,7 @@ scheme_init_unsafe_thread (Scheme_Startup_Env *env)
|
||||||
ADD_PRIM_W_ARITY("unsafe-poll-ctx-eventmask-wakeup", unsafe_poll_ctx_eventmask_wakeup, 2, 2, env);
|
ADD_PRIM_W_ARITY("unsafe-poll-ctx-eventmask-wakeup", unsafe_poll_ctx_eventmask_wakeup, 2, 2, env);
|
||||||
ADD_PRIM_W_ARITY("unsafe-poll-ctx-milliseconds-wakeup", unsafe_poll_ctx_time_wakeup, 2, 2, env);
|
ADD_PRIM_W_ARITY("unsafe-poll-ctx-milliseconds-wakeup", unsafe_poll_ctx_time_wakeup, 2, 2, env);
|
||||||
ADD_PRIM_W_ARITY("unsafe-signal-received", unsafe_signal_received, 0, 0, env);
|
ADD_PRIM_W_ARITY("unsafe-signal-received", unsafe_signal_received, 0, 0, env);
|
||||||
|
ADD_PRIM_W_ARITY("unsafe-make-signal-received", unsafe_make_signal_received, 0, 0, env);
|
||||||
ADD_PRIM_W_ARITY("unsafe-set-sleep-in-thread!", unsafe_set_sleep_in_thread, 2, 2, env);
|
ADD_PRIM_W_ARITY("unsafe-set-sleep-in-thread!", unsafe_set_sleep_in_thread, 2, 2, env);
|
||||||
|
|
||||||
ADD_PRIM_W_ARITY("unsafe-os-thread-enabled?", unsafe_os_thread_enabled_p, 0, 0, env);
|
ADD_PRIM_W_ARITY("unsafe-os-thread-enabled?", unsafe_os_thread_enabled_p, 0, 0, env);
|
||||||
|
@ -5548,6 +5550,24 @@ Scheme_Object *unsafe_signal_received(int argc, Scheme_Object **argv)
|
||||||
return scheme_void;
|
return scheme_void;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Scheme_Object *do_signal_received(int argc, Scheme_Object **argv, Scheme_Object *self)
|
||||||
|
{
|
||||||
|
void *h = SCHEME_PRIM_CLOSURE_ELS(self)[0];
|
||||||
|
scheme_signal_received_at(h);
|
||||||
|
return scheme_void;
|
||||||
|
}
|
||||||
|
|
||||||
|
Scheme_Object *unsafe_make_signal_received(int argc, Scheme_Object **argv)
|
||||||
|
{
|
||||||
|
void *h;
|
||||||
|
Scheme_Object *a[1];
|
||||||
|
|
||||||
|
h = scheme_get_signal_handle();
|
||||||
|
a[0] = (Scheme_Object *)h;
|
||||||
|
return scheme_make_prim_closure_w_arity(do_signal_received, 1, a,
|
||||||
|
"unsafe-signal-received", 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void sleep_via_thread(float seconds, void *fds)
|
static void sleep_via_thread(float seconds, void *fds)
|
||||||
{
|
{
|
||||||
#ifdef OS_X
|
#ifdef OS_X
|
||||||
|
|
|
@ -121,6 +121,7 @@
|
||||||
[unsafe-make-place-local (known-procedure/pure 2)]
|
[unsafe-make-place-local (known-procedure/pure 2)]
|
||||||
[unsafe-make-os-semaphore (known-procedure 1)]
|
[unsafe-make-os-semaphore (known-procedure 1)]
|
||||||
[unsafe-make-security-guard-at-root (known-procedure 15)]
|
[unsafe-make-security-guard-at-root (known-procedure 15)]
|
||||||
|
[unsafe-make-signal-received (known-procedure/succeeds 1)]
|
||||||
[unsafe-make-srcloc (known-procedure/pure 32)]
|
[unsafe-make-srcloc (known-procedure/pure 32)]
|
||||||
[unsafe-mcar (known-procedure/succeeds 2)]
|
[unsafe-mcar (known-procedure/succeeds 2)]
|
||||||
[unsafe-mcdr (known-procedure/succeeds 2)]
|
[unsafe-mcdr (known-procedure/succeeds 2)]
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#define MZSCHEME_VERSION_X 8
|
#define MZSCHEME_VERSION_X 8
|
||||||
#define MZSCHEME_VERSION_Y 0
|
#define MZSCHEME_VERSION_Y 0
|
||||||
#define MZSCHEME_VERSION_Z 0
|
#define MZSCHEME_VERSION_Z 0
|
||||||
#define MZSCHEME_VERSION_W 3
|
#define MZSCHEME_VERSION_W 4
|
||||||
|
|
||||||
/* A level of indirection makes `#` work as needed: */
|
/* A level of indirection makes `#` work as needed: */
|
||||||
#define AS_a_STR_HELPER(x) #x
|
#define AS_a_STR_HELPER(x) #x
|
||||||
|
|
Loading…
Reference in New Issue
Block a user