diff options
author | jb <jb@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-05-26 20:50:21 +0000 |
---|---|---|
committer | jb <jb@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-05-26 20:50:21 +0000 |
commit | 71668ec3f6494cb773b907a9c52421e86428d073 (patch) | |
tree | 4e2303357e8167527ca0327de5c641ef3e67f616 /libgfortran | |
parent | ad407878d73c174ed6446284b20034d8a32dcfb6 (diff) | |
download | gcc-71668ec3f6494cb773b907a9c52421e86428d073.tar.gz |
2007-05-26 Janne Blomqvist <jb@gcc.gnu.org>
* io/unix.c (unix_stream): Rearrange struct members, remove
small_buffer.
(int_stream): New struct.
(fd_alloc): Always use existing buffer, never reallocate.
(fd_sfree): Remove check for buffer != small_buffer.
(fd_close): Likewise.
(mem_alloc_r_at): Change to use int_stream.
(mem_alloc_w_at): Likewise.
(mem_read): Likewise.
(mem_write): Likewise.
(mem_set): Likewise.
(mem_truncate): Likewise.
(mem_close): Likewise.
(mem_sfree): Likewise.
(empty_internal_buffer): Likewise.
(open_internal): Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@125099 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgfortran')
-rw-r--r-- | libgfortran/ChangeLog | 19 | ||||
-rw-r--r-- | libgfortran/io/unix.c | 96 |
2 files changed, 69 insertions, 46 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 38774284d24..1df8b3c937e 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,22 @@ +2007-05-26 Janne Blomqvist <jb@gcc.gnu.org> + + * io/unix.c (unix_stream): Rearrange struct members, remove + small_buffer. + (int_stream): New struct. + (fd_alloc): Always use existing buffer, never reallocate. + (fd_sfree): Remove check for buffer != small_buffer. + (fd_close): Likewise. + (mem_alloc_r_at): Change to use int_stream. + (mem_alloc_w_at): Likewise. + (mem_read): Likewise. + (mem_write): Likewise. + (mem_set): Likewise. + (mem_truncate): Likewise. + (mem_close): Likewise. + (mem_sfree): Likewise. + (empty_internal_buffer): Likewise. + (open_internal): Likewise. + 2007-05-25 Jerry DeLisle <jvdelisle@gcc.gnu.org> * io/transfer.c (unformatted_read): Use size from front end eliminating diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c index 38d4adfef63..39ee87d076f 100644 --- a/libgfortran/io/unix.c +++ b/libgfortran/io/unix.c @@ -97,7 +97,6 @@ typedef struct gfc_offset dirty_offset; /* Start of modified bytes in buffer */ gfc_offset file_length; /* Length of the file, -1 if not seekable. */ - char *buffer; int len; /* Physical length of the current buffer */ int active; /* Length of valid bytes in the buffer */ @@ -106,13 +105,42 @@ typedef struct int special_file; /* =1 if the fd refers to a special file */ - unsigned unbuffered:1; - - char small_buffer[BUFFER_SIZE]; + int unbuffered; /* =1 if the stream is not buffered */ + char buffer[BUFFER_SIZE]; } unix_stream; + +/* Stream structure for internal files. Fields must be kept in sync + with unix_stream above, except for the buffer. For internal files + we point the buffer pointer directly at the destination memory. */ + +typedef struct +{ + stream st; + + int fd; + gfc_offset buffer_offset; /* File offset of the start of the buffer */ + gfc_offset physical_offset; /* Current physical file offset */ + gfc_offset logical_offset; /* Current logical file offset */ + gfc_offset dirty_offset; /* Start of modified bytes in buffer */ + gfc_offset file_length; /* Length of the file, -1 if not seekable. */ + + int len; /* Physical length of the current buffer */ + int active; /* Length of valid bytes in the buffer */ + + int prot; + int ndirty; /* Dirty bytes starting at dirty_offset */ + + int special_file; /* =1 if the fd refers to a special file */ + + int unbuffered; /* =1 if the stream is not buffered */ + + char *buffer; +} +int_stream; + extern stream *init_error_stream (unix_stream *); internal_proto(init_error_stream); @@ -409,29 +437,17 @@ static void fd_alloc (unix_stream * s, gfc_offset where, int *len __attribute__ ((unused))) { - char *new_buffer; - int n, read_len; - - if (*len <= BUFFER_SIZE) - { - new_buffer = s->small_buffer; - read_len = BUFFER_SIZE; - } - else - { - new_buffer = get_mem (*len); - read_len = *len; - } + int n; /* Salvage bytes currently within the buffer. This is important for * devices that cannot seek. */ - if (s->buffer != NULL && s->buffer_offset <= where && + if (s->buffer_offset <= where && where <= s->buffer_offset + s->active) { n = s->active - (where - s->buffer_offset); - memmove (new_buffer, s->buffer + (where - s->buffer_offset), n); + memmove (s->buffer, s->buffer + (where - s->buffer_offset), n); s->active = n; } @@ -442,13 +458,7 @@ fd_alloc (unix_stream * s, gfc_offset where, s->buffer_offset = where; - /* free the old buffer if necessary */ - - if (s->buffer != NULL && s->buffer != s->small_buffer) - free_mem (s->buffer); - - s->buffer = new_buffer; - s->len = read_len; + s->len = BUFFER_SIZE; } @@ -580,8 +590,7 @@ static try fd_sfree (unix_stream * s) { if (s->ndirty != 0 && - (s->buffer != s->small_buffer || options.all_unbuffered || - s->unbuffered)) + (options.all_unbuffered || s->unbuffered)) return fd_flush (s); return SUCCESS; @@ -782,9 +791,6 @@ fd_close (unix_stream * s) if (fd_flush (s) == FAILURE) return FAILURE; - if (s->buffer != NULL && s->buffer != s->small_buffer) - free_mem (s->buffer); - if (s->fd != STDOUT_FILENO && s->fd != STDERR_FILENO) { if (close (s->fd) < 0) @@ -813,7 +819,6 @@ fd_open (unix_stream * s) s->st.write = (void *) fd_write; s->st.set = (void *) fd_sset; - s->buffer = NULL; } @@ -831,7 +836,7 @@ fd_open (unix_stream * s) static char * -mem_alloc_r_at (unix_stream * s, int *len, gfc_offset where) +mem_alloc_r_at (int_stream * s, int *len, gfc_offset where) { gfc_offset n; @@ -852,7 +857,7 @@ mem_alloc_r_at (unix_stream * s, int *len, gfc_offset where) static char * -mem_alloc_w_at (unix_stream * s, int *len, gfc_offset where) +mem_alloc_w_at (int_stream * s, int *len, gfc_offset where) { gfc_offset m; @@ -880,7 +885,7 @@ mem_alloc_w_at (unix_stream * s, int *len, gfc_offset where) routines use mem_alloc_r_at. */ static int -mem_read (unix_stream * s, void * buf, size_t * nbytes) +mem_read (int_stream * s, void * buf, size_t * nbytes) { void *p; int tmp; @@ -906,7 +911,7 @@ mem_read (unix_stream * s, void * buf, size_t * nbytes) routines use mem_alloc_w_at. */ static int -mem_write (unix_stream * s, const void * buf, size_t * nbytes) +mem_write (int_stream * s, const void * buf, size_t * nbytes) { void *p; int tmp; @@ -930,7 +935,7 @@ mem_write (unix_stream * s, const void * buf, size_t * nbytes) static int -mem_seek (unix_stream * s, gfc_offset offset) +mem_seek (int_stream * s, gfc_offset offset) { if (offset > s->file_length) { @@ -944,7 +949,7 @@ mem_seek (unix_stream * s, gfc_offset offset) static try -mem_set (unix_stream * s, int c, size_t n) +mem_set (int_stream * s, int c, size_t n) { void *p; int len; @@ -963,14 +968,14 @@ mem_set (unix_stream * s, int c, size_t n) static int -mem_truncate (unix_stream * s __attribute__ ((unused))) +mem_truncate (int_stream * s __attribute__ ((unused))) { return SUCCESS; } static try -mem_close (unix_stream * s) +mem_close (int_stream * s) { if (s != NULL) free_mem (s); @@ -980,7 +985,7 @@ mem_close (unix_stream * s) static try -mem_sfree (unix_stream * s __attribute__ ((unused))) +mem_sfree (int_stream * s __attribute__ ((unused))) { return SUCCESS; } @@ -997,7 +1002,7 @@ mem_sfree (unix_stream * s __attribute__ ((unused))) void empty_internal_buffer(stream *strm) { - unix_stream * s = (unix_stream *) strm; + int_stream * s = (int_stream *) strm; memset(s->buffer, ' ', s->file_length); } @@ -1006,10 +1011,10 @@ empty_internal_buffer(stream *strm) stream * open_internal (char *base, int length) { - unix_stream *s; + int_stream *s; - s = get_mem (sizeof (unix_stream)); - memset (s, '\0', sizeof (unix_stream)); + s = get_mem (sizeof (int_stream)); + memset (s, '\0', sizeof (int_stream)); s->buffer = base; s->buffer_offset = 0; @@ -1372,7 +1377,6 @@ init_error_stream (unix_stream *error) error->st.sfree = (void *) fd_sfree; error->unbuffered = 1; - error->buffer = error->small_buffer; return (stream *) error; } |