From 1dc66edf3deac92ec67972e8e7e171e260809977 Mon Sep 17 00:00:00 2001 From: Juan Jose Garcia Ripoll Date: Sat, 7 Feb 2009 18:07:19 +0100 Subject: [PATCH] Use a union type for storing the ANSI C stream handle and the POSIX file descriptor --- src/c/alloc.d | 2 +- src/c/file.d | 26 +++++++++++++------------- src/c/gbc.d | 13 +++---------- src/h/internal.h | 4 ++-- src/h/object.h | 5 ++++- 5 files changed, 23 insertions(+), 27 deletions(-) diff --git a/src/c/alloc.d b/src/c/alloc.d index 430718fbc..8f9709a5f 100644 --- a/src/c/alloc.d +++ b/src/c/alloc.d @@ -346,7 +346,7 @@ ONCE_MORE: #endif /* CLOS */ case t_stream: obj->stream.mode = (short)smm_broadcast; - obj->stream.file = NULL; + obj->stream.file.descriptor = -1; obj->stream.object0 = OBJNULL; obj->stream.object1 = OBJNULL; obj->stream.buffer = NULL; diff --git a/src/c/file.d b/src/c/file.d index a5ffc11cf..3c465f105 100644 --- a/src/c/file.d +++ b/src/c/file.d @@ -2725,7 +2725,7 @@ io_file_close(cl_object strm) ecl_enable_interrupts(); if (failed < 0) FElibc_error("Cannot close stream ~S.", 1, strm); - strm->stream.file = (void*)-1; + IO_FILE_DESCRIPTOR(strm) = -1; return generic_close(strm); } @@ -3137,7 +3137,7 @@ ecl_make_file_stream_from_fd(cl_object fname, int fd, enum ecl_smmode smm, set_stream_elt_type(stream, byte_size, flags, external_format); IO_FILE_FILENAME(stream) = fname; /* not really used */ IO_FILE_COLUMN(stream) = 0; - stream->stream.file = (void*)fd; + IO_FILE_DESCRIPTOR(stream) = fd; stream->stream.last_op = 0; si_set_finalizer(stream, Ct); return stream; @@ -3199,7 +3199,7 @@ io_stream_write_byte8(cl_object strm, unsigned char *c, cl_index n) if (!Null(aux)) ecl_file_position_set(strm, aux); } else if (strm->stream.last_op > 0) { - ecl_fseeko((FILE*)strm->stream.file, 0, SEEK_CUR); + ecl_fseeko(IO_STREAM_FILE(strm), 0, SEEK_CUR); } strm->stream.last_op = -1; return input_stream_read_byte8(strm, c, n); @@ -3365,7 +3365,7 @@ io_stream_close(cl_object strm) FElibc_error("Cannot close stream ~S.", 1, strm); #if !defined(GBC_BOEHM) ecl_dealloc(strm->stream.buffer); - strm->stream.file = NULL; + IO_STREAM_FILE(strm) = NULL; #endif return generic_close(strm); } @@ -3495,7 +3495,7 @@ si_set_buffering_mode(cl_object stream, cl_object buffer_mode_symbol) FEerror("Not a valid buffering mode: ~A", 1, buffer_mode_symbol); } if (mode == smm_output || mode == smm_io || mode == smm_input) { - FILE *fp = (FILE*)stream->stream.file; + FILE *fp = IO_STREAM_FILE(stream); setvbuf(fp, 0, _IONBF, 0); if (buffer_mode != _IONBF) { cl_index buffer_size = BUFSIZ; @@ -3536,7 +3536,7 @@ ecl_make_stream_from_FILE(cl_object fname, void *f, enum ecl_smmode smm, set_stream_elt_type(stream, byte_size, flags, external_format); IO_STREAM_FILENAME(stream) = fname; /* not really used */ IO_STREAM_COLUMN(stream) = 0; - stream->stream.file = f; + IO_STREAM_FILE(stream) = f; stream->stream.last_op = 0; si_set_finalizer(stream, Ct); return stream; @@ -3591,20 +3591,20 @@ ecl_stream_to_handle(cl_object s, bool output) switch ((enum ecl_smmode)s->stream.mode) { case smm_input: if (output) return -1; - return fileno((FILE*)s->stream.file); + return fileno(IO_STREAM_FILE(s)); case smm_input_file: if (output) return -1; - return (int)s->stream.file; + return IO_FILE_DESCRIPTOR(s); case smm_output: if (!output) return -1; - return fileno((FILE*)s->stream.file); + return fileno(IO_STREAM_FILE(s)); case smm_output_file: if (!output) return -1; - return (int)s->stream.file; + return IO_FILE_DESCRIPTOR(s); case smm_io: - return fileno((FILE*)s->stream.file); + return fileno(IO_STREAM_FILE(s)); case smm_io_file: - return (int)s->stream.file; + return IO_FILE_DESCRIPTOR(s); case smm_synonym: s = SYNONYM_STREAM_STREAM(s); goto BEGIN; @@ -4483,7 +4483,7 @@ alloc_stream() { cl_object x = ecl_alloc_object(t_stream); x->stream.closed = 0; - x->stream.file = NULL; + x->stream.file.descriptor = -1; x->stream.object0 = x->stream.object1 = OBJNULL; x->stream.int0 = x->stream.int1 = 0; diff --git a/src/c/gbc.d b/src/c/gbc.d index 75e30ffd5..3f6271ff4 100644 --- a/src/c/gbc.d +++ b/src/c/gbc.d @@ -655,16 +655,9 @@ sweep_phase(void) break; #endif case t_stream: -#if defined(ECL_WSOCK) - if (x->stream.mode == smm_input_wsock - || x->stream.mode == smm_output_wsock - || x->stream.mode == smm_io_wsock) { - closesocket((int)x->stream.file); - } else -#endif - if (x->stream.file != NULL) - fclose(x->stream.file); - x->stream.file = NULL; + if (!x->stream.closed) + cl_close(1, x); + break; #ifdef ECL_THREADS case t_lock: #if defined(_MSC_VER) || defined(mingw32) diff --git a/src/h/internal.h b/src/h/internal.h index 7ea55d3dc..4a2034d2b 100644 --- a/src/h/internal.h +++ b/src/h/internal.h @@ -152,11 +152,11 @@ extern void* ecl_dynamic_callback_make(cl_object data, enum ecl_ffi_calling_conv #define ECHO_STREAM_INPUT(strm) (strm)->stream.object0 #define ECHO_STREAM_OUTPUT(strm) (strm)->stream.object1 #define CONCATENATED_STREAM_LIST(strm) (strm)->stream.object0 -#define IO_STREAM_FILE(strm) (FILE*)((strm)->stream.file) +#define IO_STREAM_FILE(strm) (FILE*)((strm)->stream.file.stream) #define IO_STREAM_COLUMN(strm) (strm)->stream.int1 #define IO_STREAM_ELT_TYPE(strm) (strm)->stream.object0 #define IO_STREAM_FILENAME(strm) (strm)->stream.object1 -#define IO_FILE_DESCRIPTOR(strm) (cl_fixnum)((strm)->stream.file) +#define IO_FILE_DESCRIPTOR(strm) (strm)->stream.file.descriptor #define IO_FILE_COLUMN(strm) (strm)->stream.int1 #define IO_FILE_ELT_TYPE(strm) (strm)->stream.object0 #define IO_FILE_FILENAME(strm) (strm)->stream.object1 diff --git a/src/h/object.h b/src/h/object.h index d0a16d343..620ff5151 100644 --- a/src/h/object.h +++ b/src/h/object.h @@ -547,7 +547,10 @@ struct ecl_stream { HEADER2(mode,closed); /* stream mode of enum smmode */ /* closed stream? */ struct ecl_file_ops *ops; /* dispatch table */ - void *file; /* file pointer */ + union { + void *stream; /* ANSI C streams */ + cl_fixnum descriptor; /* POSIX files */ + } file; cl_object object0; /* some object */ cl_object object1; /* some object */ cl_object byte_stack; /* buffer for unread bytes */