rktio: repairs
All tests now pass for MacOS.
This commit is contained in:
parent
463862d793
commit
c4b3b19c1e
|
@ -785,7 +785,15 @@ If @var{read_too} is non-zero, the function produces multiple values
|
||||||
Creates Racket input and output ports for a TCP socket @var{s}. The
|
Creates Racket input and output ports for a TCP socket @var{s}. The
|
||||||
@var{name} argument supplies the name for the ports. If @var{close}
|
@var{name} argument supplies the name for the ports. If @var{close}
|
||||||
is non-zero, then the ports assume responsibility for closing the
|
is non-zero, then the ports assume responsibility for closing the
|
||||||
socket. The resulting ports are written to @var{inp} and @var{outp}.}
|
socket. The resulting ports are written to @var{inp} and @var{outp}.
|
||||||
|
|
||||||
|
Whether @var{close} is zero or not, closing the resulting ports
|
||||||
|
unregisters the file descriptor with @cpp{scheme_fd_to_semaphore}.
|
||||||
|
So, passing zero for @var{close} and also using the file descriptor
|
||||||
|
with other ports or with @cpp{scheme_fd_to_semaphore} will not work right.
|
||||||
|
|
||||||
|
@history["6.9.0.6" @elem{Changed ports to always unregister with @cpp{scheme_fd_to_semaphore},
|
||||||
|
since it's not safe to skip that step.}]}
|
||||||
|
|
||||||
|
|
||||||
@function[(Scheme_Object* scheme_fd_to_semaphore
|
@function[(Scheme_Object* scheme_fd_to_semaphore
|
||||||
|
|
|
@ -4975,8 +4975,12 @@
|
||||||
(set! s? f) ; break the JIT's optimistic assumption
|
(set! s? f) ; break the JIT's optimistic assumption
|
||||||
|
|
||||||
(define (go)
|
(define (go)
|
||||||
|
(define init-size
|
||||||
|
(let ([vec (make-vector 6)])
|
||||||
|
(vector-set-performance-stats! vec (current-thread))
|
||||||
|
(vector-ref vec 3)))
|
||||||
(define size (f 500000)) ; make sure that this still leads to a tail loop
|
(define size (f 500000)) ; make sure that this still leads to a tail loop
|
||||||
(size . < . 80000)))
|
((- size init-size) . < . 20000)))
|
||||||
|
|
||||||
(test #t (dynamic-require ''check-tail-call-by-jit-for-struct-predicate 'go))
|
(test #t (dynamic-require ''check-tail-call-by-jit-for-struct-predicate 'go))
|
||||||
|
|
||||||
|
|
|
@ -728,6 +728,7 @@
|
||||||
(loop))))
|
(loop))))
|
||||||
|
|
||||||
(close-output-port sw)
|
(close-output-port sw)
|
||||||
|
(test cr sync cr)
|
||||||
(test cr sync s t l sr cr)
|
(test cr sync s t l sr cr)
|
||||||
(test cr sync s t l sr cr)
|
(test cr sync s t l sr cr)
|
||||||
|
|
||||||
|
|
|
@ -317,7 +317,7 @@
|
||||||
((b) (make-bytes 8 0)))
|
((b) (make-bytes 8 0)))
|
||||||
(test (void) udp-multicast-set-interface! s2 "localhost")
|
(test (void) udp-multicast-set-interface! s2 "localhost")
|
||||||
(test (void) udp-send-to s2 "233.252.0.0" lp #"hi")
|
(test (void) udp-send-to s2 "233.252.0.0" lp #"hi")
|
||||||
(sleep 0.05)
|
(sleep 0.05) ; (sync (udp-receive-ready-evt s))
|
||||||
(let-values (((packet-length ra1 rp1) (udp-receive!* s b)))
|
(let-values (((packet-length ra1 rp1) (udp-receive!* s b)))
|
||||||
(test 2 values packet-length)
|
(test 2 values packet-length)
|
||||||
(test #"hi\0\0\0\0\0\0" values b))
|
(test #"hi\0\0\0\0\0\0" values b))
|
||||||
|
@ -334,8 +334,7 @@
|
||||||
(test (void) udp-close s)
|
(test (void) udp-close s)
|
||||||
;; It's closed
|
;; It's closed
|
||||||
(err/rt-test (udp-multicast-loopback? s) exn:fail:network?)
|
(err/rt-test (udp-multicast-loopback? s) exn:fail:network?)
|
||||||
(err/rt-test (udp-multicast-set-loopback! s #t) exn:fail:network?)
|
(err/rt-test (udp-multicast-set-loopback! s #t) exn:fail:network?))
|
||||||
)
|
|
||||||
|
|
||||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
|
|
@ -551,7 +551,6 @@ static Scheme_Env *place_instance_init(void *stack_base, int initial_main_os_thr
|
||||||
scheme_init_sema_places();
|
scheme_init_sema_places();
|
||||||
scheme_init_gmp_places();
|
scheme_init_gmp_places();
|
||||||
scheme_init_fd_semaphores();
|
scheme_init_fd_semaphores();
|
||||||
scheme_alloc_global_fdset();
|
|
||||||
#ifndef DONT_USE_FOREIGN
|
#ifndef DONT_USE_FOREIGN
|
||||||
scheme_init_foreign_places();
|
scheme_init_foreign_places();
|
||||||
#endif
|
#endif
|
||||||
|
@ -676,7 +675,6 @@ void scheme_place_instance_destroy(int force)
|
||||||
GC_destruct_child_gc();
|
GC_destruct_child_gc();
|
||||||
#endif
|
#endif
|
||||||
scheme_free_all_code();
|
scheme_free_all_code();
|
||||||
scheme_free_global_fdset();
|
|
||||||
rktio_destroy(scheme_rktio);
|
rktio_destroy(scheme_rktio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
/* >>>> Generated by mkmark.rkt from mzmarksrc.c <<<< */
|
/* >>>> Generated by mkmark.rkt from mzmarksrc.c <<<< */
|
||||||
|
|
||||||
#ifdef USE_TCP
|
|
||||||
static int mark_listener_SIZE(void *p, struct NewGC *gc) {
|
static int mark_listener_SIZE(void *p, struct NewGC *gc) {
|
||||||
#ifndef GC_NO_SIZE_NEEDED_FROM_PROCS
|
#ifndef GC_NO_SIZE_NEEDED_FROM_PROCS
|
||||||
listener_t *l = (listener_t *)p;
|
listener_t *l = (listener_t *)p;
|
||||||
|
@ -91,7 +90,6 @@ static int mark_tcp_FIXUP(void *p, struct NewGC *gc) {
|
||||||
#define mark_tcp_IS_CONST_SIZE 1
|
#define mark_tcp_IS_CONST_SIZE 1
|
||||||
|
|
||||||
|
|
||||||
# ifdef UDP_IS_SUPPORTED
|
|
||||||
static int mark_udp_SIZE(void *p, struct NewGC *gc) {
|
static int mark_udp_SIZE(void *p, struct NewGC *gc) {
|
||||||
#ifndef GC_NO_SIZE_NEEDED_FROM_PROCS
|
#ifndef GC_NO_SIZE_NEEDED_FROM_PROCS
|
||||||
gcBYTES_TO_WORDS(sizeof(Scheme_UDP));
|
gcBYTES_TO_WORDS(sizeof(Scheme_UDP));
|
||||||
|
@ -179,6 +177,4 @@ static int mark_udp_evt_FIXUP(void *p, struct NewGC *gc) {
|
||||||
#define mark_udp_evt_IS_ATOMIC 0
|
#define mark_udp_evt_IS_ATOMIC 0
|
||||||
#define mark_udp_evt_IS_CONST_SIZE 1
|
#define mark_udp_evt_IS_CONST_SIZE 1
|
||||||
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
|
@ -1818,7 +1818,6 @@ END print;
|
||||||
|
|
||||||
START network;
|
START network;
|
||||||
|
|
||||||
#ifdef USE_TCP
|
|
||||||
mark_listener {
|
mark_listener {
|
||||||
listener_t *l = (listener_t *)p;
|
listener_t *l = (listener_t *)p;
|
||||||
|
|
||||||
|
@ -1841,7 +1840,6 @@ mark_tcp {
|
||||||
gcBYTES_TO_WORDS(sizeof(Scheme_Tcp));
|
gcBYTES_TO_WORDS(sizeof(Scheme_Tcp));
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef UDP_IS_SUPPORTED
|
|
||||||
mark_udp {
|
mark_udp {
|
||||||
mark:
|
mark:
|
||||||
Scheme_UDP *udp = (Scheme_UDP *)p;
|
Scheme_UDP *udp = (Scheme_UDP *)p;
|
||||||
|
@ -1863,8 +1861,6 @@ mark_udp_evt {
|
||||||
size:
|
size:
|
||||||
gcBYTES_TO_WORDS(sizeof(Scheme_UDP_Evt));
|
gcBYTES_TO_WORDS(sizeof(Scheme_UDP_Evt));
|
||||||
}
|
}
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
END network;
|
END network;
|
||||||
|
|
||||||
|
|
|
@ -188,6 +188,14 @@ static int check_fd_sema(rktio_fd_t *s, int mode, Scheme_Schedule_Info *sinfo, S
|
||||||
sema = scheme_rktio_fd_to_semaphore(s, mode);
|
sema = scheme_rktio_fd_to_semaphore(s, mode);
|
||||||
|
|
||||||
if (sema) {
|
if (sema) {
|
||||||
|
/* It would make sense to force a poll via
|
||||||
|
scheme_check_fd_semaphores() here, although we'd only want to
|
||||||
|
to that once per scheduler cycle. That would more reliably poll
|
||||||
|
at the OS level, since we otherwise wait on the scheduler to
|
||||||
|
check semaphores. It's not clear that the OS supports more
|
||||||
|
precise reasoning about readiness, though, and Racket has
|
||||||
|
traditonally not done that, so we're still skipping
|
||||||
|
it. */
|
||||||
if (!scheme_wait_sema(sema, 1)) {
|
if (!scheme_wait_sema(sema, 1)) {
|
||||||
if (sinfo && !sinfo->no_redirect)
|
if (sinfo && !sinfo->no_redirect)
|
||||||
scheme_set_sync_target(sinfo, sema, orig, NULL, 0, 0, NULL);
|
scheme_set_sync_target(sinfo, sema, orig, NULL, 0, 0, NULL);
|
||||||
|
@ -424,7 +432,7 @@ static intptr_t tcp_get_string(Scheme_Input_Port *port,
|
||||||
"tcp-read: error reading\n"
|
"tcp-read: error reading\n"
|
||||||
" system error: %R");
|
" system error: %R");
|
||||||
return 0;
|
return 0;
|
||||||
} else if (data->b.bufmax == RKTIO_READ_ERROR) {
|
} else if (data->b.bufmax == RKTIO_READ_EOF) {
|
||||||
data->b.bufmax = 0;
|
data->b.bufmax = 0;
|
||||||
data->b.hiteof = 1;
|
data->b.hiteof = 1;
|
||||||
return EOF;
|
return EOF;
|
||||||
|
@ -809,7 +817,7 @@ static void wait_until_lookup(Connect_Progress_Data *pd)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static rktio_addrinfo_t *do_resolve_address(const char *who, char *address, int id, int family, int show_id_on_error)
|
static rktio_addrinfo_t *do_resolve_address(const char *who, char *address, int id, int family, int passive, int show_id_on_error)
|
||||||
{
|
{
|
||||||
Connect_Progress_Data *pd;
|
Connect_Progress_Data *pd;
|
||||||
rktio_addrinfo_lookup_t *lookup;
|
rktio_addrinfo_lookup_t *lookup;
|
||||||
|
@ -817,7 +825,7 @@ static rktio_addrinfo_t *do_resolve_address(const char *who, char *address, int
|
||||||
|
|
||||||
pd = make_connect_progress_data();
|
pd = make_connect_progress_data();
|
||||||
|
|
||||||
lookup = rktio_start_addrinfo_lookup(scheme_rktio, address, id, family, 0, 0);
|
lookup = rktio_start_addrinfo_lookup(scheme_rktio, address, id, family, passive, 0);
|
||||||
if (!lookup) {
|
if (!lookup) {
|
||||||
addr = NULL;
|
addr = NULL;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1758,7 +1766,7 @@ static Scheme_Object *make_udp(int argc, Scheme_Object *argv[])
|
||||||
if (!id)
|
if (!id)
|
||||||
id = 1025;
|
id = 1025;
|
||||||
|
|
||||||
addr = do_resolve_address("upd-open-socket", address, id, RKTIO_FAMILY_ANY, show_id_on_error);
|
addr = do_resolve_address("upd-open-socket", address, id, RKTIO_FAMILY_ANY, 0, show_id_on_error);
|
||||||
} else
|
} else
|
||||||
addr = NULL;
|
addr = NULL;
|
||||||
|
|
||||||
|
@ -1894,10 +1902,11 @@ static Scheme_Object *udp_bind_or_connect(const char *name, int argc, Scheme_Obj
|
||||||
" system error: %R",
|
" system error: %R",
|
||||||
name);
|
name);
|
||||||
}
|
}
|
||||||
|
udp->connected = 0;
|
||||||
return scheme_void;
|
return scheme_void;
|
||||||
}
|
}
|
||||||
|
|
||||||
addr = do_resolve_address(name, address, port, RKTIO_FAMILY_ANY, 1);
|
addr = do_resolve_address(name, address, port, RKTIO_FAMILY_ANY, do_bind, 1);
|
||||||
|
|
||||||
if (!do_bind) {
|
if (!do_bind) {
|
||||||
/* CONNECT CASE */
|
/* CONNECT CASE */
|
||||||
|
@ -1918,6 +1927,8 @@ static Scheme_Object *udp_bind_or_connect(const char *name, int argc, Scheme_Obj
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
udp->connected = 1;
|
||||||
} else {
|
} else {
|
||||||
/* BIND CASE */
|
/* BIND CASE */
|
||||||
int ok;
|
int ok;
|
||||||
|
@ -1938,6 +1949,8 @@ static Scheme_Object *udp_bind_or_connect(const char *name, int argc, Scheme_Obj
|
||||||
port);
|
port);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
udp->bound = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2101,7 +2114,7 @@ static Scheme_Object *udp_send_it(const char *name, int argc, Scheme_Object *arg
|
||||||
|
|
||||||
scheme_security_check_network(name, address, id, 1);
|
scheme_security_check_network(name, address, id, 1);
|
||||||
|
|
||||||
dest_addr = do_resolve_address(name, address, id, RKTIO_FAMILY_ANY, 1);
|
dest_addr = do_resolve_address(name, address, id, RKTIO_FAMILY_ANY, 0, 1);
|
||||||
} else {
|
} else {
|
||||||
dest_addr = NULL;
|
dest_addr = NULL;
|
||||||
}
|
}
|
||||||
|
@ -2322,23 +2335,17 @@ static Scheme_Object *udp_receive_enable_break(int argc, Scheme_Object *argv[])
|
||||||
|
|
||||||
static Scheme_Object *make_udp_evt(const char *name, int argc, Scheme_Object **argv, int for_read)
|
static Scheme_Object *make_udp_evt(const char *name, int argc, Scheme_Object **argv, int for_read)
|
||||||
{
|
{
|
||||||
#ifdef UDP_IS_SUPPORTED
|
|
||||||
Scheme_UDP_Evt *uw;
|
Scheme_UDP_Evt *uw;
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!SCHEME_UDPP(argv[0]))
|
if (!SCHEME_UDPP(argv[0]))
|
||||||
scheme_wrong_contract(name, "udp?", 0, argc, argv);
|
scheme_wrong_contract(name, "udp?", 0, argc, argv);
|
||||||
|
|
||||||
#ifdef UDP_IS_SUPPORTED
|
|
||||||
uw = MALLOC_ONE_TAGGED(Scheme_UDP_Evt);
|
uw = MALLOC_ONE_TAGGED(Scheme_UDP_Evt);
|
||||||
uw->so.type = scheme_udp_evt_type;
|
uw->so.type = scheme_udp_evt_type;
|
||||||
uw->udp = (Scheme_UDP *)argv[0];
|
uw->udp = (Scheme_UDP *)argv[0];
|
||||||
uw->for_read = for_read;
|
uw->for_read = for_read;
|
||||||
|
|
||||||
return (Scheme_Object *)uw;
|
return (Scheme_Object *)uw;
|
||||||
#else
|
|
||||||
return scheme_void;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static Scheme_Object *udp_read_ready_evt(int argc, Scheme_Object *argv[])
|
static Scheme_Object *udp_read_ready_evt(int argc, Scheme_Object *argv[])
|
||||||
|
@ -2552,7 +2559,7 @@ udp_multicast_set_interface(int argc, Scheme_Object *argv[])
|
||||||
|
|
||||||
if (SCHEME_CHAR_STRINGP(argv[1])) {
|
if (SCHEME_CHAR_STRINGP(argv[1])) {
|
||||||
bs = scheme_char_string_to_byte_string(argv[1]);
|
bs = scheme_char_string_to_byte_string(argv[1]);
|
||||||
addr = do_resolve_address("udp-multicast-set-interface!", SCHEME_BYTE_STR_VAL(bs), -1, udp_default_family(), 0);
|
addr = do_resolve_address("udp-multicast-set-interface!", SCHEME_BYTE_STR_VAL(bs), -1, udp_default_family(), 0, 0);
|
||||||
} else
|
} else
|
||||||
addr = NULL;
|
addr = NULL;
|
||||||
|
|
||||||
|
@ -2581,7 +2588,6 @@ do_udp_multicast_join_or_leave_group(char const *name, int optname, Scheme_UDP *
|
||||||
|
|
||||||
pd = make_connect_progress_data();
|
pd = make_connect_progress_data();
|
||||||
|
|
||||||
|
|
||||||
bs = scheme_char_string_to_byte_string(multiaddrname);
|
bs = scheme_char_string_to_byte_string(multiaddrname);
|
||||||
address = SCHEME_BYTE_STR_VAL(bs);
|
address = SCHEME_BYTE_STR_VAL(bs);
|
||||||
|
|
||||||
|
@ -2640,7 +2646,6 @@ do_udp_multicast_join_or_leave_group(char const *name, int optname, Scheme_UDP *
|
||||||
rktio_addrinfo_free(scheme_rktio, multi_addr);
|
rktio_addrinfo_free(scheme_rktio, multi_addr);
|
||||||
if (intf_addr) rktio_addrinfo_free(scheme_rktio, intf_addr);
|
if (intf_addr) rktio_addrinfo_free(scheme_rktio, intf_addr);
|
||||||
|
|
||||||
|
|
||||||
if (!r)
|
if (!r)
|
||||||
scheme_raise_exn(MZEXN_FAIL_NETWORK,
|
scheme_raise_exn(MZEXN_FAIL_NETWORK,
|
||||||
"%s: setsockopt failed\n"
|
"%s: setsockopt failed\n"
|
||||||
|
@ -2704,14 +2709,10 @@ START_XFORM_SKIP;
|
||||||
|
|
||||||
static void register_traversers(void)
|
static void register_traversers(void)
|
||||||
{
|
{
|
||||||
#ifdef USE_TCP
|
|
||||||
GC_REG_TRAV(scheme_listener_type, mark_listener);
|
GC_REG_TRAV(scheme_listener_type, mark_listener);
|
||||||
GC_REG_TRAV(scheme_rt_tcp, mark_tcp);
|
GC_REG_TRAV(scheme_rt_tcp, mark_tcp);
|
||||||
# ifdef UDP_IS_SUPPORTED
|
|
||||||
GC_REG_TRAV(scheme_udp_type, mark_udp);
|
GC_REG_TRAV(scheme_udp_type, mark_udp);
|
||||||
GC_REG_TRAV(scheme_udp_evt_type, mark_udp_evt);
|
GC_REG_TRAV(scheme_udp_evt_type, mark_udp_evt);
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
END_XFORM_SKIP;
|
END_XFORM_SKIP;
|
||||||
|
|
|
@ -484,14 +484,6 @@ void scheme_set_stdio_makers(Scheme_Stdio_Maker_Proc in,
|
||||||
/* fd arrays */
|
/* fd arrays */
|
||||||
/*========================================================================*/
|
/*========================================================================*/
|
||||||
|
|
||||||
void scheme_alloc_global_fdset() {
|
|
||||||
scheme_semaphore_fd_set = rktio_ltps_open(scheme_rktio);
|
|
||||||
}
|
|
||||||
|
|
||||||
void scheme_free_global_fdset(void) {
|
|
||||||
rktio_ltps_close(scheme_rktio, scheme_semaphore_fd_set);
|
|
||||||
}
|
|
||||||
|
|
||||||
void scheme_add_fd_handle(void *h, void *fds, int repost)
|
void scheme_add_fd_handle(void *h, void *fds, int repost)
|
||||||
{
|
{
|
||||||
#if defined(WIN32_FD_HANDLES)
|
#if defined(WIN32_FD_HANDLES)
|
||||||
|
@ -3596,7 +3588,7 @@ scheme_do_open_input_file(char *name, int offset, int argc, Scheme_Object *argv[
|
||||||
| (text_mode ? RKTIO_OPEN_TEXT : 0)));
|
| (text_mode ? RKTIO_OPEN_TEXT : 0)));
|
||||||
|
|
||||||
if (!fd) {
|
if (!fd) {
|
||||||
filename_exn(name, "cannot open input file", filename, RKTIO_ERROR_DOES_NOT_EXIST);
|
filename_exn(name, "cannot open input file", filename, (for_module ? RKTIO_ERROR_DOES_NOT_EXIST : 0));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4355,9 +4347,11 @@ void scheme_filesystem_change_evt_cancel(Scheme_Object *evt, void *ignored_data)
|
||||||
{
|
{
|
||||||
Scheme_Filesystem_Change_Evt *fc = (Scheme_Filesystem_Change_Evt *)evt;
|
Scheme_Filesystem_Change_Evt *fc = (Scheme_Filesystem_Change_Evt *)evt;
|
||||||
|
|
||||||
|
if (fc->rfc) {
|
||||||
rktio_fs_change_forget(scheme_rktio, fc->rfc);
|
rktio_fs_change_forget(scheme_rktio, fc->rfc);
|
||||||
fc->rfc = NULL;
|
fc->rfc = NULL;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int filesystem_change_evt_ready(Scheme_Object *evt, Scheme_Schedule_Info *sinfo)
|
static int filesystem_change_evt_ready(Scheme_Object *evt, Scheme_Schedule_Info *sinfo)
|
||||||
{
|
{
|
||||||
|
@ -5881,7 +5875,7 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[])
|
||||||
rktio_fd_t *stdout_fd = NULL;
|
rktio_fd_t *stdout_fd = NULL;
|
||||||
rktio_fd_t *stdin_fd = NULL;
|
rktio_fd_t *stdin_fd = NULL;
|
||||||
rktio_fd_t *stderr_fd = NULL;
|
rktio_fd_t *stderr_fd = NULL;
|
||||||
int need_forget_out = 0, need_forget_in = 0, need_forget_err = 0, new_process_group = 0;
|
int need_forget_out = 0, need_forget_in = 0, need_forget_err = 0;
|
||||||
rktio_envvars_t *envvars;
|
rktio_envvars_t *envvars;
|
||||||
rktio_process_result_t *result;
|
rktio_process_result_t *result;
|
||||||
Scheme_Config *config;
|
Scheme_Config *config;
|
||||||
|
@ -6023,9 +6017,10 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[])
|
||||||
config = scheme_current_config();
|
config = scheme_current_config();
|
||||||
|
|
||||||
cust_mode = scheme_get_param(config, MZCONFIG_SUBPROC_GROUP_ENABLED);
|
cust_mode = scheme_get_param(config, MZCONFIG_SUBPROC_GROUP_ENABLED);
|
||||||
new_process_group = SCHEME_TRUEP(cust_mode);
|
if (SCHEME_TRUEP(cust_mode))
|
||||||
cust_mode = scheme_get_param(config, MZCONFIG_SUBPROC_CUSTODIAN_MODE);
|
flags |= RKTIO_PROCESS_NEW_GROUP;
|
||||||
|
|
||||||
|
cust_mode = scheme_get_param(config, MZCONFIG_SUBPROC_CUSTODIAN_MODE);
|
||||||
if (SCHEME_SYMBOLP(cust_mode)
|
if (SCHEME_SYMBOLP(cust_mode)
|
||||||
&& !strcmp(SCHEME_SYM_VAL(cust_mode), "kill")
|
&& !strcmp(SCHEME_SYM_VAL(cust_mode), "kill")
|
||||||
&& (rktio_process_allowed_flags(scheme_rktio) & RKTIO_PROCESS_WINDOWS_CHAIN_TERMINATION))
|
&& (rktio_process_allowed_flags(scheme_rktio) & RKTIO_PROCESS_WINDOWS_CHAIN_TERMINATION))
|
||||||
|
|
|
@ -435,7 +435,6 @@ void scheme_register_network_evts();
|
||||||
|
|
||||||
void scheme_free_dynamic_extensions(void);
|
void scheme_free_dynamic_extensions(void);
|
||||||
void scheme_free_all_code(void);
|
void scheme_free_all_code(void);
|
||||||
void scheme_free_global_fdset(void);
|
|
||||||
|
|
||||||
XFORM_NONGCING int scheme_is_multithreaded(int now);
|
XFORM_NONGCING int scheme_is_multithreaded(int now);
|
||||||
|
|
||||||
|
@ -4405,7 +4404,6 @@ int scheme_is_user_port(Scheme_Object *port);
|
||||||
int scheme_byte_ready_or_user_port_ready(Scheme_Object *p, Scheme_Schedule_Info *sinfo);
|
int scheme_byte_ready_or_user_port_ready(Scheme_Object *p, Scheme_Schedule_Info *sinfo);
|
||||||
|
|
||||||
int scheme_pipe_char_count(Scheme_Object *p);
|
int scheme_pipe_char_count(Scheme_Object *p);
|
||||||
void scheme_alloc_global_fdset();
|
|
||||||
Scheme_Object *scheme_port_name(Scheme_Object *p);
|
Scheme_Object *scheme_port_name(Scheme_Object *p);
|
||||||
intptr_t scheme_port_closed_p (Scheme_Object *port);
|
intptr_t scheme_port_closed_p (Scheme_Object *port);
|
||||||
|
|
||||||
|
|
|
@ -73,6 +73,7 @@ rktio_ltps_handle_t *make_ltps_handle()
|
||||||
rktio_ltps_handle_t *s;
|
rktio_ltps_handle_t *s;
|
||||||
s = malloc(sizeof(rktio_ltps_handle_t));
|
s = malloc(sizeof(rktio_ltps_handle_t));
|
||||||
s->data = NULL;
|
s->data = NULL;
|
||||||
|
s->next = NULL;
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -927,7 +927,7 @@ int rktio_socket_shutdown(rktio_t *rktio, rktio_fd_t *rfd, int mode)
|
||||||
{
|
{
|
||||||
rktio_socket_t s = rktio_fd_system_fd(rktio, rfd);
|
rktio_socket_t s = rktio_fd_system_fd(rktio, rfd);
|
||||||
|
|
||||||
if (!shutdown(s, ((mode == RKTIO_SHUTDOWN_READ) ? SHUT_RD : SHUT_RDWR))) {
|
if (shutdown(s, ((mode == RKTIO_SHUTDOWN_READ) ? SHUT_RD : SHUT_WR))) {
|
||||||
get_socket_error();
|
get_socket_error();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1129,10 +1129,6 @@ rktio_connect_t *rktio_start_connect(rktio_t *rktio, rktio_addrinfo_t *dest, rkt
|
||||||
{
|
{
|
||||||
rktio_connect_t *conn;
|
rktio_connect_t *conn;
|
||||||
|
|
||||||
#ifdef USE_TCP
|
|
||||||
TCP_INIT("tcp-connect");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
conn = malloc(sizeof(rktio_connect_t));
|
conn = malloc(sizeof(rktio_connect_t));
|
||||||
conn->dest = dest;
|
conn->dest = dest;
|
||||||
conn->src = src;
|
conn->src = src;
|
||||||
|
@ -1162,7 +1158,9 @@ static rktio_connect_t *try_connect(rktio_t *rktio, rktio_connect_t *conn)
|
||||||
fcntl(s, F_SETFL, RKTIO_NONBLOCKING);
|
fcntl(s, F_SETFL, RKTIO_NONBLOCKING);
|
||||||
RKTIO_WHEN_SET_SOCKBUF_SIZE(setsockopt(s, SOL_SOCKET, SO_SNDBUF, (char *)&size, sizeof(int)));
|
RKTIO_WHEN_SET_SOCKBUF_SIZE(setsockopt(s, SOL_SOCKET, SO_SNDBUF, (char *)&size, sizeof(int)));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
status = connect(s, RKTIO_AS_ADDRINFO(addr)->ai_addr, RKTIO_AS_ADDRINFO(addr)->ai_addrlen);
|
status = connect(s, RKTIO_AS_ADDRINFO(addr)->ai_addr, RKTIO_AS_ADDRINFO(addr)->ai_addrlen);
|
||||||
|
|
||||||
#ifdef RKTIO_SYSTEM_UNIX
|
#ifdef RKTIO_SYSTEM_UNIX
|
||||||
if (status)
|
if (status)
|
||||||
status = errno;
|
status = errno;
|
||||||
|
@ -1192,15 +1190,18 @@ static rktio_connect_t *try_connect(rktio_t *rktio, rktio_connect_t *conn)
|
||||||
|
|
||||||
int rktio_poll_connect_ready(rktio_t *rktio, rktio_connect_t *conn)
|
int rktio_poll_connect_ready(rktio_t *rktio, rktio_connect_t *conn)
|
||||||
{
|
{
|
||||||
if (!conn->inprogress) {
|
if (conn->inprogress)
|
||||||
return rktio_socket_poll_write_ready(rktio, conn->trying_fd);
|
return rktio_socket_poll_write_ready(rktio, conn->trying_fd);
|
||||||
} else
|
else
|
||||||
return RKTIO_POLL_READY;
|
return RKTIO_POLL_READY;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rktio_poll_add_connect(rktio_t *rktio, rktio_connect_t *conn, rktio_poll_set_t *fds)
|
void rktio_poll_add_connect(rktio_t *rktio, rktio_connect_t *conn, rktio_poll_set_t *fds)
|
||||||
{
|
{
|
||||||
|
if (conn->inprogress)
|
||||||
rktio_poll_add(rktio, conn->trying_fd, fds, RKTIO_POLL_WRITE);
|
rktio_poll_add(rktio, conn->trying_fd, fds, RKTIO_POLL_WRITE);
|
||||||
|
else
|
||||||
|
rktio_poll_set_add_nosleep(rktio, fds);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void conn_free(rktio_connect_t *conn)
|
static void conn_free(rktio_connect_t *conn)
|
||||||
|
@ -1709,24 +1710,7 @@ rktio_fd_t *rktio_udp_open(rktio_t *rktio, rktio_addrinfo_t *addr, int family)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef RKTIO_SYSTEM_WINDOWS
|
return rktio_system_fd(rktio, s, RKTIO_OPEN_SOCKET | RKTIO_OPEN_UDP | RKTIO_OPEN_INIT);
|
||||||
{
|
|
||||||
unsigned long ioarg = 1;
|
|
||||||
BOOL bc = 1;
|
|
||||||
ioctlsocket(s, FIONBIO, &ioarg);
|
|
||||||
setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)(&bc), sizeof(BOOL));
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
fcntl(s, F_SETFL, RKTIO_NONBLOCKING);
|
|
||||||
# ifdef SO_BROADCAST
|
|
||||||
{
|
|
||||||
int bc = 1;
|
|
||||||
setsockopt(s, SOL_SOCKET, SO_BROADCAST, &bc, sizeof(bc));
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return rktio_system_fd(rktio, s, RKTIO_OPEN_SOCKET | RKTIO_OPEN_UDP);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef UDP_DISCONNECT_EADRNOTAVAIL_OK
|
#ifdef UDP_DISCONNECT_EADRNOTAVAIL_OK
|
||||||
|
@ -1935,6 +1919,7 @@ char *rktio_udp_multicast_interface(rktio_t *rktio, rktio_fd_t *rfd)
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
status = getsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, (void *)&intf, &intf_len);
|
status = getsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, (void *)&intf, &intf_len);
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
get_socket_error();
|
get_socket_error();
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1960,6 +1945,7 @@ int rktio_udp_set_multicast_interface(rktio_t *rktio, rktio_fd_t *rfd, rktio_add
|
||||||
}
|
}
|
||||||
|
|
||||||
status = setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, (void *)&intf, intf_len);
|
status = setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, (void *)&intf, intf_len);
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
get_socket_error();
|
get_socket_error();
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1988,10 +1974,8 @@ int rktio_udp_change_multicast_group(rktio_t *rktio, rktio_fd_t *rfd,
|
||||||
|
|
||||||
if (action == RKTIO_ADD_MEMBERSHIP)
|
if (action == RKTIO_ADD_MEMBERSHIP)
|
||||||
optname = IP_ADD_MEMBERSHIP;
|
optname = IP_ADD_MEMBERSHIP;
|
||||||
else if (action == RKTIO_DROP_MEMBERSHIP)
|
|
||||||
optname = IP_DROP_MEMBERSHIP;
|
|
||||||
else
|
else
|
||||||
optname = 0;
|
optname = IP_DROP_MEMBERSHIP;
|
||||||
|
|
||||||
status = setsockopt(s, IPPROTO_IP, optname, (void *) &mreq, mreq_len);
|
status = setsockopt(s, IPPROTO_IP, optname, (void *) &mreq, mreq_len);
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,7 @@ rktio_fd_t **rktio_make_pipe(rktio_t *rktio, int flags)
|
||||||
intptr_t a[2];
|
intptr_t a[2];
|
||||||
rktio_fd_t **rfds;
|
rktio_fd_t **rfds;
|
||||||
|
|
||||||
if (!rktio_make_os_pipe(rktio, a, flags))
|
if (rktio_make_os_pipe(rktio, a, flags))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
rfds = malloc(sizeof(rktio_fd_t*) * 2);
|
rfds = malloc(sizeof(rktio_fd_t*) * 2);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user