diff --git a/collects/tests/racket/place-channel-fd2.rkt b/collects/tests/racket/place-channel-fd2.rkt new file mode 100644 index 0000000000..eed8fcbdf3 --- /dev/null +++ b/collects/tests/racket/place-channel-fd2.rkt @@ -0,0 +1,66 @@ +#lang racket/base +(require racket/match + racket/place + rackunit) + +(define (racket-subprocess o i e . args) + (define (current-executable-path) + (parameterize ([current-directory (find-system-path 'orig-dir)]) + (find-executable-path (find-system-path 'exec-file) #f))) + + (apply subprocess o i e (current-executable-path) args)) + +(provide main) +(define (main) + (test-case + "test file descriptors copied across place channesl" +;; write out "fdt.rkt" + (with-output-to-file "fdt.rkt" #:exists 'replace (lambda () + (display +#<u.two_int_val.int1; int fd = ((Scheme_Simple_Object *) so)->u.two_int_val.int2; scheme_socket_to_ports(fd, "", 1, &in, &out); - new_so = (type == scheme_input_port_type) ? in : out; + if (type == scheme_input_port_type) { + scheme_tcp_abandon_port(out); + new_so = in; + } + else { + scheme_tcp_abandon_port(in); + new_so = out; + } } break; case scheme_serialized_file_fd_type: diff --git a/src/racket/src/schpriv.h b/src/racket/src/schpriv.h index d01acc9e3b..593a36af11 100644 --- a/src/racket/src/schpriv.h +++ b/src/racket/src/schpriv.h @@ -3697,6 +3697,7 @@ intptr_t scheme_dup_socket(intptr_t fd); intptr_t scheme_dup_file(intptr_t fd); void scheme_close_socket_fd(intptr_t fd); void scheme_close_file_fd(intptr_t fd); +void scheme_tcp_abandon_port(Scheme_Object *port); #define SCHEME_PLACE_OBJECTP(o) (SCHEME_TYPE(o) == scheme_place_object_type)