From 237d6275831c0f3279829a42c8f1960c1b8a4c73 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 14 Apr 2021 17:08:26 -0600 Subject: [PATCH] bc: send stderr/stdout logging through rktio One effect of using rktio instead of fwrite is that Windows output produces LF instead of CRLF. Writing CRLF is arguably more correct, but it likely doesn't matter, and consistency with normal Racket output is helpful. --- racket/src/bc/src/error.c | 39 +++++++++++++++++++++++-------------- racket/src/bc/src/port.c | 11 +++++++++++ racket/src/bc/src/schpriv.h | 2 ++ 3 files changed, 37 insertions(+), 15 deletions(-) diff --git a/racket/src/bc/src/error.c b/racket/src/bc/src/error.c index 9b551b7669..f8b5efeb06 100644 --- a/racket/src/bc/src/error.c +++ b/racket/src/bc/src/error.c @@ -3829,26 +3829,35 @@ void scheme_log_name_pfx_message(Scheme_Logger *logger, int level, Scheme_Object } if (extract_spec_level(logger->stderr_level, name) >= level) { - if (name && prefix_msg) { - intptr_t slen; - slen = SCHEME_SYM_LEN(name); - fwrite(SCHEME_SYM_VAL(name), slen, 1, stderr); - fwrite(": ", 2, 1, stderr); + rktio_fd_t *fd; + fd = rktio_std_fd(scheme_rktio, RKTIO_STDERR); + if (fd) { + if (name && prefix_msg) { + intptr_t slen; + slen = SCHEME_SYM_LEN(name); + scheme_rktio_write_all(fd, SCHEME_SYM_VAL(name), slen); + scheme_rktio_write_all(fd, ": ", 2); + } + scheme_rktio_write_all(fd, buffer, len); + scheme_rktio_write_all(fd, "\n", 1); + rktio_forget(scheme_rktio, fd); } - fwrite(buffer, len, 1, stderr); - fwrite("\n", 1, 1, stderr); } if (extract_spec_level(logger->stdout_level, name) >= level) { - if (name && prefix_msg) { - intptr_t slen; - slen = SCHEME_SYM_LEN(name); - fwrite(SCHEME_SYM_VAL(name), slen, 1, stdout); - fwrite(": ", 2, 1, stdout); + rktio_fd_t *fd; + fd = rktio_std_fd(scheme_rktio, RKTIO_STDOUT); + if (fd) { + if (name && prefix_msg) { + intptr_t slen; + slen = SCHEME_SYM_LEN(name); + scheme_rktio_write_all(fd, SCHEME_SYM_VAL(name), slen); + scheme_rktio_write_all(fd, ": ", 2); + } + scheme_rktio_write_all(fd, buffer, len); + scheme_rktio_write_all(fd, "\n", 1); + rktio_forget(scheme_rktio, fd); } - fwrite(buffer, len, 1, stdout); - fwrite("\n", 1, 1, stdout); - fflush(stdout); } queue = logger->readers; diff --git a/racket/src/bc/src/port.c b/racket/src/bc/src/port.c index 28569b6397..eb6a25ed04 100644 --- a/racket/src/bc/src/port.c +++ b/racket/src/bc/src/port.c @@ -5607,6 +5607,17 @@ scheme_make_rktio_fd_output_port(rktio_fd_t *rfd, Scheme_Object *name, int read_ return make_fd_output_port(rfd, name, read_too, -1, NULL); } +void scheme_rktio_write_all(struct rktio_fd_t *fd, const char *data, intptr_t len) +{ + while (len > 0) { + intptr_t r; + r = rktio_write(scheme_rktio, fd, data, len); + if (r == RKTIO_WRITE_ERROR) + break; + len -= r; + } +} + /*========================================================================*/ /* null output ports */ /*========================================================================*/ diff --git a/racket/src/bc/src/schpriv.h b/racket/src/bc/src/schpriv.h index b8c62d5b0e..f7bf30f05d 100644 --- a/racket/src/bc/src/schpriv.h +++ b/racket/src/bc/src/schpriv.h @@ -3672,6 +3672,8 @@ void scheme_rktio_socket_to_input_port(struct rktio_fd_t *fd, Scheme_Object *nam void scheme_rktio_socket_to_output_port(struct rktio_fd_t *fd, Scheme_Object *name, int takeover, Scheme_Object **_outp); +void scheme_rktio_write_all(struct rktio_fd_t *fd, const char *data, intptr_t len); + void scheme_fs_change_properties(int *_supported, int *_scalable, int *_low_latency, int *_file_level); THREAD_LOCAL_DECL(extern struct rktio_ltps_t *scheme_semaphore_fd_set);