1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-01 01:04:50 +03:00

Make BSD/OS fseeko thread-safe.

This commit is contained in:
Bruce Momjian 2002-10-23 21:16:17 +00:00
parent c9984ab79d
commit 6b9d496988

View File

@ -8,13 +8,14 @@
* *
* *
* IDENTIFICATION * 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__ #ifdef __bsdi__
#include <pthread.h>
#include <stdio.h> #include <stdio.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
@ -25,7 +26,7 @@
* off_t is an arithmetic type, but not necessarily integral, * off_t is an arithmetic type, but not necessarily integral,
* while fpos_t might be neither. * while fpos_t might be neither.
* *
* I don't think this is thread-safe. * This is thread-safe using flockfile/funlockfile.
*/ */
int int
@ -37,11 +38,19 @@ fseeko(FILE *stream, off_t offset, int whence)
switch (whence) switch (whence)
{ {
case SEEK_CUR: case SEEK_CUR:
flockfile(stream);
if (fgetpos(stream, &floc) != 0) if (fgetpos(stream, &floc) != 0)
{
funlockfile(stream);
return -1; return -1;
}
floc += offset; floc += offset;
if (fsetpos(stream, &floc) != 0) if (fsetpos(stream, &floc) != 0)
{
funlockfile(stream);
return -1; return -1;
}
flockfile(stream);
return 0; return 0;
break; break;
case SEEK_SET: case SEEK_SET:
@ -50,11 +59,19 @@ fseeko(FILE *stream, off_t offset, int whence)
return 0; return 0;
break; break;
case SEEK_END: case SEEK_END:
flockfile(stream);
if (fstat(fileno(stream), &filestat) != 0) if (fstat(fileno(stream), &filestat) != 0)
{
funlockfile(stream);
return -1; return -1;
}
floc = filestat.st_size; floc = filestat.st_size;
if (fsetpos(stream, &floc) != 0) if (fsetpos(stream, &floc) != 0)
{
funlockfile(stream);
return -1; return -1;
}
funlockfile(stream);
return 0; return 0;
break; break;
default: default: