diff options
author | Bruce Momjian <bruce@momjian.us> | 2002-10-23 21:16:17 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 2002-10-23 21:16:17 +0000 |
commit | 6b9d496988f143553d4226a81651154aa7a1e1ed (patch) | |
tree | 28e094e82836832abf48052ac4d28cca1f4349f6 | |
parent | c9984ab79d000849328cd7a767532a0fd9c844ea (diff) | |
download | postgresql-6b9d496988f143553d4226a81651154aa7a1e1ed.tar.gz postgresql-6b9d496988f143553d4226a81651154aa7a1e1ed.zip |
Make BSD/OS fseeko thread-safe.
-rw-r--r-- | src/port/fseeko.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/src/port/fseeko.c b/src/port/fseeko.c index 22aa80c98dd..60a0ae41029 100644 --- a/src/port/fseeko.c +++ b/src/port/fseeko.c @@ -8,13 +8,14 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/port/fseeko.c,v 1.1 2002/10/23 20:56:24 momjian Exp $ + * $Header: /cvsroot/pgsql/src/port/fseeko.c,v 1.2 2002/10/23 21:16:17 momjian Exp $ * *------------------------------------------------------------------------- */ #ifdef __bsdi__ +#include <pthread.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> @@ -25,7 +26,7 @@ * off_t is an arithmetic type, but not necessarily integral, * while fpos_t might be neither. * - * I don't think this is thread-safe. + * This is thread-safe using flockfile/funlockfile. */ int @@ -37,11 +38,19 @@ fseeko(FILE *stream, off_t offset, int whence) switch (whence) { case SEEK_CUR: + flockfile(stream); if (fgetpos(stream, &floc) != 0) + { + funlockfile(stream); return -1; + } floc += offset; if (fsetpos(stream, &floc) != 0) + { + funlockfile(stream); return -1; + } + flockfile(stream); return 0; break; case SEEK_SET: @@ -50,11 +59,19 @@ fseeko(FILE *stream, off_t offset, int whence) return 0; break; case SEEK_END: + flockfile(stream); if (fstat(fileno(stream), &filestat) != 0) + { + funlockfile(stream); return -1; + } floc = filestat.st_size; if (fsetpos(stream, &floc) != 0) + { + funlockfile(stream); return -1; + } + funlockfile(stream); return 0; break; default: |