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.
This commit is contained in:
Matthew Flatt 2021-04-14 17:08:26 -06:00
parent 448b77a662
commit 237d627583
3 changed files with 37 additions and 15 deletions

View File

@ -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;

View File

@ -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 */
/*========================================================================*/

View File

@ -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);