Remove dead pread and pwrite replacement code.
pread() and pwrite() are in SUSv2, and all targeted Unix systems have them. Previously, we defined pg_pread and pg_pwrite to emulate these function with lseek() on old Unixen. The names with a pg_ prefix were a reminder of a portability hazard: they might change the current file position. That hazard is gone, so we can drop the prefixes. Since the remaining replacement code is Windows-only, move it into src/port/win32p{read,write}.c, and move the declarations into src/include/port/win32_port.h. No need for vestigial HAVE_PREAD, HAVE_PWRITE macros as they were only used for declarations in port.h which have now moved into win32_port.h. Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Reviewed-by: Greg Stark <stark@mit.edu> Reviewed-by: Robert Haas <robertmhaas@gmail.com> Reviewed-by: Andres Freund <andres@anarazel.de> Discussion: https://postgr.es/m/CA+hUKGJ3LHeP9w5Fgzdr4G8AnEtJ=z=p6hGDEm4qYGEUX5B6fQ@mail.gmail.com
This commit is contained in:
parent
71f5dc6dfb
commit
cf112c1220
|
@ -16728,32 +16728,6 @@ esac
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ac_fn_c_check_func "$LINENO" "pread" "ac_cv_func_pread"
|
|
||||||
if test "x$ac_cv_func_pread" = xyes; then :
|
|
||||||
$as_echo "#define HAVE_PREAD 1" >>confdefs.h
|
|
||||||
|
|
||||||
else
|
|
||||||
case " $LIBOBJS " in
|
|
||||||
*" pread.$ac_objext "* ) ;;
|
|
||||||
*) LIBOBJS="$LIBOBJS pread.$ac_objext"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
ac_fn_c_check_func "$LINENO" "pwrite" "ac_cv_func_pwrite"
|
|
||||||
if test "x$ac_cv_func_pwrite" = xyes; then :
|
|
||||||
$as_echo "#define HAVE_PWRITE 1" >>confdefs.h
|
|
||||||
|
|
||||||
else
|
|
||||||
case " $LIBOBJS " in
|
|
||||||
*" pwrite.$ac_objext "* ) ;;
|
|
||||||
*) LIBOBJS="$LIBOBJS pwrite.$ac_objext"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
ac_fn_c_check_func "$LINENO" "strlcat" "ac_cv_func_strlcat"
|
ac_fn_c_check_func "$LINENO" "strlcat" "ac_cv_func_strlcat"
|
||||||
if test "x$ac_cv_func_strlcat" = xyes; then :
|
if test "x$ac_cv_func_strlcat" = xyes; then :
|
||||||
$as_echo "#define HAVE_STRLCAT 1" >>confdefs.h
|
$as_echo "#define HAVE_STRLCAT 1" >>confdefs.h
|
||||||
|
@ -17015,6 +16989,18 @@ esac
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
case " $LIBOBJS " in
|
||||||
|
*" win32pread.$ac_objext "* ) ;;
|
||||||
|
*) LIBOBJS="$LIBOBJS win32pread.$ac_objext"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
case " $LIBOBJS " in
|
||||||
|
*" win32pwrite.$ac_objext "* ) ;;
|
||||||
|
*) LIBOBJS="$LIBOBJS win32pwrite.$ac_objext"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
case " $LIBOBJS " in
|
case " $LIBOBJS " in
|
||||||
*" win32security.$ac_objext "* ) ;;
|
*" win32security.$ac_objext "* ) ;;
|
||||||
*) LIBOBJS="$LIBOBJS win32security.$ac_objext"
|
*) LIBOBJS="$LIBOBJS win32security.$ac_objext"
|
||||||
|
|
|
@ -1876,8 +1876,6 @@ AC_REPLACE_FUNCS(m4_normalize([
|
||||||
getpeereid
|
getpeereid
|
||||||
inet_aton
|
inet_aton
|
||||||
mkdtemp
|
mkdtemp
|
||||||
pread
|
|
||||||
pwrite
|
|
||||||
strlcat
|
strlcat
|
||||||
strlcpy
|
strlcpy
|
||||||
strnlen
|
strnlen
|
||||||
|
@ -1943,6 +1941,8 @@ if test "$PORTNAME" = "win32"; then
|
||||||
AC_LIBOBJ(win32error)
|
AC_LIBOBJ(win32error)
|
||||||
AC_LIBOBJ(win32link)
|
AC_LIBOBJ(win32link)
|
||||||
AC_LIBOBJ(win32ntdll)
|
AC_LIBOBJ(win32ntdll)
|
||||||
|
AC_LIBOBJ(win32pread)
|
||||||
|
AC_LIBOBJ(win32pwrite)
|
||||||
AC_LIBOBJ(win32security)
|
AC_LIBOBJ(win32security)
|
||||||
AC_LIBOBJ(win32setlocale)
|
AC_LIBOBJ(win32setlocale)
|
||||||
AC_LIBOBJ(win32stat)
|
AC_LIBOBJ(win32stat)
|
||||||
|
|
|
@ -2103,9 +2103,9 @@ qtext_store(const char *query, int query_len,
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (pg_pwrite(fd, query, query_len, off) != query_len)
|
if (pwrite(fd, query, query_len, off) != query_len)
|
||||||
goto error;
|
goto error;
|
||||||
if (pg_pwrite(fd, "\0", 1, off + query_len) != 1)
|
if (pwrite(fd, "\0", 1, off + query_len) != 1)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
CloseTransientFile(fd);
|
CloseTransientFile(fd);
|
||||||
|
|
|
@ -1149,7 +1149,7 @@ heap_xlog_logical_rewrite(XLogReaderState *r)
|
||||||
/* write out tail end of mapping file (again) */
|
/* write out tail end of mapping file (again) */
|
||||||
errno = 0;
|
errno = 0;
|
||||||
pgstat_report_wait_start(WAIT_EVENT_LOGICAL_REWRITE_MAPPING_WRITE);
|
pgstat_report_wait_start(WAIT_EVENT_LOGICAL_REWRITE_MAPPING_WRITE);
|
||||||
if (pg_pwrite(fd, data, len, xlrec->offset) != len)
|
if (pwrite(fd, data, len, xlrec->offset) != len)
|
||||||
{
|
{
|
||||||
/* if write didn't set errno, assume problem is no disk space */
|
/* if write didn't set errno, assume problem is no disk space */
|
||||||
if (errno == 0)
|
if (errno == 0)
|
||||||
|
|
|
@ -718,7 +718,7 @@ SlruPhysicalReadPage(SlruCtl ctl, int pageno, int slotno)
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
pgstat_report_wait_start(WAIT_EVENT_SLRU_READ);
|
pgstat_report_wait_start(WAIT_EVENT_SLRU_READ);
|
||||||
if (pg_pread(fd, shared->page_buffer[slotno], BLCKSZ, offset) != BLCKSZ)
|
if (pread(fd, shared->page_buffer[slotno], BLCKSZ, offset) != BLCKSZ)
|
||||||
{
|
{
|
||||||
pgstat_report_wait_end();
|
pgstat_report_wait_end();
|
||||||
slru_errcause = SLRU_READ_FAILED;
|
slru_errcause = SLRU_READ_FAILED;
|
||||||
|
@ -873,7 +873,7 @@ SlruPhysicalWritePage(SlruCtl ctl, int pageno, int slotno, SlruWriteAll fdata)
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
pgstat_report_wait_start(WAIT_EVENT_SLRU_WRITE);
|
pgstat_report_wait_start(WAIT_EVENT_SLRU_WRITE);
|
||||||
if (pg_pwrite(fd, shared->page_buffer[slotno], BLCKSZ, offset) != BLCKSZ)
|
if (pwrite(fd, shared->page_buffer[slotno], BLCKSZ, offset) != BLCKSZ)
|
||||||
{
|
{
|
||||||
pgstat_report_wait_end();
|
pgstat_report_wait_end();
|
||||||
/* if write didn't set errno, assume problem is no disk space */
|
/* if write didn't set errno, assume problem is no disk space */
|
||||||
|
|
|
@ -2189,7 +2189,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible)
|
||||||
INSTR_TIME_SET_CURRENT(start);
|
INSTR_TIME_SET_CURRENT(start);
|
||||||
|
|
||||||
pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE);
|
pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE);
|
||||||
written = pg_pwrite(openLogFile, from, nleft, startoffset);
|
written = pwrite(openLogFile, from, nleft, startoffset);
|
||||||
pgstat_report_wait_end();
|
pgstat_report_wait_end();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -3011,7 +3011,7 @@ XLogFileInitInternal(XLogSegNo logsegno, TimeLineID logtli,
|
||||||
* enough.
|
* enough.
|
||||||
*/
|
*/
|
||||||
errno = 0;
|
errno = 0;
|
||||||
if (pg_pwrite(fd, zbuffer.data, 1, wal_segment_size - 1) != 1)
|
if (pwrite(fd, zbuffer.data, 1, wal_segment_size - 1) != 1)
|
||||||
{
|
{
|
||||||
/* if write didn't set errno, assume no disk space */
|
/* if write didn't set errno, assume no disk space */
|
||||||
save_errno = errno ? errno : ENOSPC;
|
save_errno = errno ? errno : ENOSPC;
|
||||||
|
|
|
@ -1514,7 +1514,7 @@ WALRead(XLogReaderState *state,
|
||||||
|
|
||||||
/* Reset errno first; eases reporting non-errno-affecting errors */
|
/* Reset errno first; eases reporting non-errno-affecting errors */
|
||||||
errno = 0;
|
errno = 0;
|
||||||
readbytes = pg_pread(state->seg.ws_file, p, segbytes, (off_t) startoff);
|
readbytes = pread(state->seg.ws_file, p, segbytes, (off_t) startoff);
|
||||||
|
|
||||||
#ifndef FRONTEND
|
#ifndef FRONTEND
|
||||||
pgstat_report_wait_end();
|
pgstat_report_wait_end();
|
||||||
|
|
|
@ -3260,7 +3260,7 @@ retry:
|
||||||
readOff = targetPageOff;
|
readOff = targetPageOff;
|
||||||
|
|
||||||
pgstat_report_wait_start(WAIT_EVENT_WAL_READ);
|
pgstat_report_wait_start(WAIT_EVENT_WAL_READ);
|
||||||
r = pg_pread(readFile, readBuf, XLOG_BLCKSZ, (off_t) readOff);
|
r = pread(readFile, readBuf, XLOG_BLCKSZ, (off_t) readOff);
|
||||||
if (r != XLOG_BLCKSZ)
|
if (r != XLOG_BLCKSZ)
|
||||||
{
|
{
|
||||||
char fname[MAXFNAMELEN];
|
char fname[MAXFNAMELEN];
|
||||||
|
|
|
@ -1822,7 +1822,7 @@ basebackup_read_file(int fd, char *buf, size_t nbytes, off_t offset,
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
pgstat_report_wait_start(WAIT_EVENT_BASEBACKUP_READ);
|
pgstat_report_wait_start(WAIT_EVENT_BASEBACKUP_READ);
|
||||||
rc = pg_pread(fd, buf, nbytes, offset);
|
rc = pread(fd, buf, nbytes, offset);
|
||||||
pgstat_report_wait_end();
|
pgstat_report_wait_end();
|
||||||
|
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
|
|
|
@ -915,7 +915,7 @@ XLogWalRcvWrite(char *buf, Size nbytes, XLogRecPtr recptr, TimeLineID tli)
|
||||||
/* OK to write the logs */
|
/* OK to write the logs */
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
|
||||||
byteswritten = pg_pwrite(recvFile, buf, segbytes, (off_t) startoff);
|
byteswritten = pwrite(recvFile, buf, segbytes, (off_t) startoff);
|
||||||
if (byteswritten <= 0)
|
if (byteswritten <= 0)
|
||||||
{
|
{
|
||||||
char xlogfname[MAXFNAMELEN];
|
char xlogfname[MAXFNAMELEN];
|
||||||
|
|
|
@ -2063,7 +2063,7 @@ FileRead(File file, char *buffer, int amount, off_t offset,
|
||||||
|
|
||||||
retry:
|
retry:
|
||||||
pgstat_report_wait_start(wait_event_info);
|
pgstat_report_wait_start(wait_event_info);
|
||||||
returnCode = pg_pread(vfdP->fd, buffer, amount, offset);
|
returnCode = pread(vfdP->fd, buffer, amount, offset);
|
||||||
pgstat_report_wait_end();
|
pgstat_report_wait_end();
|
||||||
|
|
||||||
if (returnCode < 0)
|
if (returnCode < 0)
|
||||||
|
@ -2145,7 +2145,7 @@ FileWrite(File file, char *buffer, int amount, off_t offset,
|
||||||
retry:
|
retry:
|
||||||
errno = 0;
|
errno = 0;
|
||||||
pgstat_report_wait_start(wait_event_info);
|
pgstat_report_wait_start(wait_event_info);
|
||||||
returnCode = pg_pwrite(VfdCache[file].fd, buffer, amount, offset);
|
returnCode = pwrite(VfdCache[file].fd, buffer, amount, offset);
|
||||||
pgstat_report_wait_end();
|
pgstat_report_wait_end();
|
||||||
|
|
||||||
/* if write didn't set errno, assume problem is no disk space */
|
/* if write didn't set errno, assume problem is no disk space */
|
||||||
|
|
|
@ -1429,7 +1429,7 @@ AddToDataDirLockFile(int target_line, const char *str)
|
||||||
len = strlen(destbuffer);
|
len = strlen(destbuffer);
|
||||||
errno = 0;
|
errno = 0;
|
||||||
pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE);
|
pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE);
|
||||||
if (pg_pwrite(fd, destbuffer, len, 0) != len)
|
if (pwrite(fd, destbuffer, len, 0) != len)
|
||||||
{
|
{
|
||||||
pgstat_report_wait_end();
|
pgstat_report_wait_end();
|
||||||
/* if write didn't set errno, assume problem is no disk space */
|
/* if write didn't set errno, assume problem is no disk space */
|
||||||
|
|
|
@ -312,10 +312,10 @@ test_sync(int writes_per_op)
|
||||||
for (ops = 0; alarm_triggered == false; ops++)
|
for (ops = 0; alarm_triggered == false; ops++)
|
||||||
{
|
{
|
||||||
for (writes = 0; writes < writes_per_op; writes++)
|
for (writes = 0; writes < writes_per_op; writes++)
|
||||||
if (pg_pwrite(tmpfile,
|
if (pwrite(tmpfile,
|
||||||
buf,
|
buf,
|
||||||
XLOG_BLCKSZ,
|
XLOG_BLCKSZ,
|
||||||
writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
|
writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
|
||||||
die("write failed");
|
die("write failed");
|
||||||
}
|
}
|
||||||
STOP_TIMER;
|
STOP_TIMER;
|
||||||
|
@ -338,10 +338,10 @@ test_sync(int writes_per_op)
|
||||||
for (ops = 0; alarm_triggered == false; ops++)
|
for (ops = 0; alarm_triggered == false; ops++)
|
||||||
{
|
{
|
||||||
for (writes = 0; writes < writes_per_op; writes++)
|
for (writes = 0; writes < writes_per_op; writes++)
|
||||||
if (pg_pwrite(tmpfile,
|
if (pwrite(tmpfile,
|
||||||
buf,
|
buf,
|
||||||
XLOG_BLCKSZ,
|
XLOG_BLCKSZ,
|
||||||
writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
|
writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
|
||||||
die("write failed");
|
die("write failed");
|
||||||
fdatasync(tmpfile);
|
fdatasync(tmpfile);
|
||||||
}
|
}
|
||||||
|
@ -363,10 +363,10 @@ test_sync(int writes_per_op)
|
||||||
for (ops = 0; alarm_triggered == false; ops++)
|
for (ops = 0; alarm_triggered == false; ops++)
|
||||||
{
|
{
|
||||||
for (writes = 0; writes < writes_per_op; writes++)
|
for (writes = 0; writes < writes_per_op; writes++)
|
||||||
if (pg_pwrite(tmpfile,
|
if (pwrite(tmpfile,
|
||||||
buf,
|
buf,
|
||||||
XLOG_BLCKSZ,
|
XLOG_BLCKSZ,
|
||||||
writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
|
writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
|
||||||
die("write failed");
|
die("write failed");
|
||||||
if (fsync(tmpfile) != 0)
|
if (fsync(tmpfile) != 0)
|
||||||
die("fsync failed");
|
die("fsync failed");
|
||||||
|
@ -387,10 +387,10 @@ test_sync(int writes_per_op)
|
||||||
for (ops = 0; alarm_triggered == false; ops++)
|
for (ops = 0; alarm_triggered == false; ops++)
|
||||||
{
|
{
|
||||||
for (writes = 0; writes < writes_per_op; writes++)
|
for (writes = 0; writes < writes_per_op; writes++)
|
||||||
if (pg_pwrite(tmpfile,
|
if (pwrite(tmpfile,
|
||||||
buf,
|
buf,
|
||||||
XLOG_BLCKSZ,
|
XLOG_BLCKSZ,
|
||||||
writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
|
writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
|
||||||
die("write failed");
|
die("write failed");
|
||||||
if (pg_fsync_writethrough(tmpfile) != 0)
|
if (pg_fsync_writethrough(tmpfile) != 0)
|
||||||
die("fsync failed");
|
die("fsync failed");
|
||||||
|
@ -419,10 +419,10 @@ test_sync(int writes_per_op)
|
||||||
for (ops = 0; alarm_triggered == false; ops++)
|
for (ops = 0; alarm_triggered == false; ops++)
|
||||||
{
|
{
|
||||||
for (writes = 0; writes < writes_per_op; writes++)
|
for (writes = 0; writes < writes_per_op; writes++)
|
||||||
if (pg_pwrite(tmpfile,
|
if (pwrite(tmpfile,
|
||||||
buf,
|
buf,
|
||||||
XLOG_BLCKSZ,
|
XLOG_BLCKSZ,
|
||||||
writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
|
writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This can generate write failures if the filesystem has
|
* This can generate write failures if the filesystem has
|
||||||
|
@ -484,10 +484,10 @@ test_open_sync(const char *msg, int writes_size)
|
||||||
for (ops = 0; alarm_triggered == false; ops++)
|
for (ops = 0; alarm_triggered == false; ops++)
|
||||||
{
|
{
|
||||||
for (writes = 0; writes < 16 / writes_size; writes++)
|
for (writes = 0; writes < 16 / writes_size; writes++)
|
||||||
if (pg_pwrite(tmpfile,
|
if (pwrite(tmpfile,
|
||||||
buf,
|
buf,
|
||||||
writes_size * 1024,
|
writes_size * 1024,
|
||||||
writes * writes_size * 1024) !=
|
writes * writes_size * 1024) !=
|
||||||
writes_size * 1024)
|
writes_size * 1024)
|
||||||
die("write failed");
|
die("write failed");
|
||||||
}
|
}
|
||||||
|
@ -586,7 +586,7 @@ test_non_sync(void)
|
||||||
START_TIMER;
|
START_TIMER;
|
||||||
for (ops = 0; alarm_triggered == false; ops++)
|
for (ops = 0; alarm_triggered == false; ops++)
|
||||||
{
|
{
|
||||||
if (pg_pwrite(tmpfile, buf, XLOG_BLCKSZ, 0) != XLOG_BLCKSZ)
|
if (pwrite(tmpfile, buf, XLOG_BLCKSZ, 0) != XLOG_BLCKSZ)
|
||||||
die("write failed");
|
die("write failed");
|
||||||
}
|
}
|
||||||
STOP_TIMER;
|
STOP_TIMER;
|
||||||
|
|
|
@ -375,11 +375,11 @@ extern bool XLogReaderValidatePageHeader(XLogReaderState *state,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Error information from WALRead that both backend and frontend caller can
|
* Error information from WALRead that both backend and frontend caller can
|
||||||
* process. Currently only errors from pg_pread can be reported.
|
* process. Currently only errors from pread can be reported.
|
||||||
*/
|
*/
|
||||||
typedef struct WALReadError
|
typedef struct WALReadError
|
||||||
{
|
{
|
||||||
int wre_errno; /* errno set by the last pg_pread() */
|
int wre_errno; /* errno set by the last pread() */
|
||||||
int wre_off; /* Offset we tried to read from. */
|
int wre_off; /* Offset we tried to read from. */
|
||||||
int wre_req; /* Bytes requested to be read. */
|
int wre_req; /* Bytes requested to be read. */
|
||||||
int wre_read; /* Bytes read by the last read(). */
|
int wre_read; /* Bytes read by the last read(). */
|
||||||
|
|
|
@ -388,9 +388,6 @@
|
||||||
/* Define to 1 if you have the `ppoll' function. */
|
/* Define to 1 if you have the `ppoll' function. */
|
||||||
#undef HAVE_PPOLL
|
#undef HAVE_PPOLL
|
||||||
|
|
||||||
/* Define to 1 if you have the `pread' function. */
|
|
||||||
#undef HAVE_PREAD
|
|
||||||
|
|
||||||
/* Define to 1 if the PS_STRINGS thing exists. */
|
/* Define to 1 if the PS_STRINGS thing exists. */
|
||||||
#undef HAVE_PS_STRINGS
|
#undef HAVE_PS_STRINGS
|
||||||
|
|
||||||
|
@ -406,9 +403,6 @@
|
||||||
/* Have PTHREAD_PRIO_INHERIT. */
|
/* Have PTHREAD_PRIO_INHERIT. */
|
||||||
#undef HAVE_PTHREAD_PRIO_INHERIT
|
#undef HAVE_PTHREAD_PRIO_INHERIT
|
||||||
|
|
||||||
/* Define to 1 if you have the `pwrite' function. */
|
|
||||||
#undef HAVE_PWRITE
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <readline.h> header file. */
|
/* Define to 1 if you have the <readline.h> header file. */
|
||||||
#undef HAVE_READLINE_H
|
#undef HAVE_READLINE_H
|
||||||
|
|
||||||
|
|
|
@ -417,25 +417,6 @@ extern char *mkdtemp(char *path);
|
||||||
extern int inet_aton(const char *cp, struct in_addr *addr);
|
extern int inet_aton(const char *cp, struct in_addr *addr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* Windows and older Unix don't have pread(2) and pwrite(2). We have
|
|
||||||
* replacement functions, but they have slightly different semantics so we'll
|
|
||||||
* use a name with a pg_ prefix to avoid confusion.
|
|
||||||
*/
|
|
||||||
#ifdef HAVE_PREAD
|
|
||||||
#define pg_pread pread
|
|
||||||
#else
|
|
||||||
extern ssize_t pg_pread(int fd, void *buf, size_t nbyte, off_t offset);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_PWRITE
|
|
||||||
#define pg_pwrite pwrite
|
|
||||||
#else
|
|
||||||
extern ssize_t pg_pwrite(int fd, const void *buf, size_t nbyte, off_t offset);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* For pg_pwritev() and pg_preadv(), see port/pg_iovec.h. */
|
|
||||||
|
|
||||||
#if !HAVE_DECL_STRLCAT
|
#if !HAVE_DECL_STRLCAT
|
||||||
extern size_t strlcat(char *dst, const char *src, size_t siz);
|
extern size_t strlcat(char *dst, const char *src, size_t siz);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -562,4 +562,10 @@ typedef unsigned short mode_t;
|
||||||
#define HAVE_BUGGY_STRTOF 1
|
#define HAVE_BUGGY_STRTOF 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* in port/win32pread.c */
|
||||||
|
extern ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset);
|
||||||
|
|
||||||
|
/* in port/win32pwrite.c */
|
||||||
|
extern ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset);
|
||||||
|
|
||||||
#endif /* PG_WIN32_PORT_H */
|
#endif /* PG_WIN32_PORT_H */
|
||||||
|
|
|
@ -30,7 +30,7 @@ pg_preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_READV
|
#ifdef HAVE_READV
|
||||||
if (iovcnt == 1)
|
if (iovcnt == 1)
|
||||||
return pg_pread(fd, iov[0].iov_base, iov[0].iov_len, offset);
|
return pread(fd, iov[0].iov_base, iov[0].iov_len, offset);
|
||||||
if (lseek(fd, offset, SEEK_SET) < 0)
|
if (lseek(fd, offset, SEEK_SET) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
return readv(fd, iov, iovcnt);
|
return readv(fd, iov, iovcnt);
|
||||||
|
@ -40,7 +40,7 @@ pg_preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset)
|
||||||
|
|
||||||
for (int i = 0; i < iovcnt; ++i)
|
for (int i = 0; i < iovcnt; ++i)
|
||||||
{
|
{
|
||||||
part = pg_pread(fd, iov[i].iov_base, iov[i].iov_len, offset);
|
part = pread(fd, iov[i].iov_base, iov[i].iov_len, offset);
|
||||||
if (part < 0)
|
if (part < 0)
|
||||||
{
|
{
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
|
|
|
@ -30,7 +30,7 @@ pg_pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_WRITEV
|
#ifdef HAVE_WRITEV
|
||||||
if (iovcnt == 1)
|
if (iovcnt == 1)
|
||||||
return pg_pwrite(fd, iov[0].iov_base, iov[0].iov_len, offset);
|
return pwrite(fd, iov[0].iov_base, iov[0].iov_len, offset);
|
||||||
if (lseek(fd, offset, SEEK_SET) < 0)
|
if (lseek(fd, offset, SEEK_SET) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
return writev(fd, iov, iovcnt);
|
return writev(fd, iov, iovcnt);
|
||||||
|
@ -40,7 +40,7 @@ pg_pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset)
|
||||||
|
|
||||||
for (int i = 0; i < iovcnt; ++i)
|
for (int i = 0; i < iovcnt; ++i)
|
||||||
{
|
{
|
||||||
part = pg_pwrite(fd, iov[i].iov_base, iov[i].iov_len, offset);
|
part = pwrite(fd, iov[i].iov_base, iov[i].iov_len, offset);
|
||||||
if (part < 0)
|
if (part < 0)
|
||||||
{
|
{
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
|
|
|
@ -1,15 +1,12 @@
|
||||||
/*-------------------------------------------------------------------------
|
/*-------------------------------------------------------------------------
|
||||||
*
|
*
|
||||||
* pread.c
|
* win32pread.c
|
||||||
* Implementation of pread(2) for platforms that lack one.
|
* Implementation of pread(2) for Windows.
|
||||||
*
|
*
|
||||||
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* src/port/pread.c
|
* src/port/win32pread.c
|
||||||
*
|
|
||||||
* Note that this implementation changes the current file position, unlike
|
|
||||||
* the POSIX function, so we use the name pg_pread().
|
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -17,16 +14,11 @@
|
||||||
|
|
||||||
#include "postgres.h"
|
#include "postgres.h"
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#else
|
|
||||||
#include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ssize_t
|
ssize_t
|
||||||
pg_pread(int fd, void *buf, size_t size, off_t offset)
|
pread(int fd, void *buf, size_t size, off_t offset)
|
||||||
{
|
{
|
||||||
#ifdef WIN32
|
|
||||||
OVERLAPPED overlapped = {0};
|
OVERLAPPED overlapped = {0};
|
||||||
HANDLE handle;
|
HANDLE handle;
|
||||||
DWORD result;
|
DWORD result;
|
||||||
|
@ -49,10 +41,4 @@ pg_pread(int fd, void *buf, size_t size, off_t offset)
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
#else
|
|
||||||
if (lseek(fd, offset, SEEK_SET) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return read(fd, buf, size);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
|
@ -1,15 +1,12 @@
|
||||||
/*-------------------------------------------------------------------------
|
/*-------------------------------------------------------------------------
|
||||||
*
|
*
|
||||||
* pwrite.c
|
* win32pwrite.c
|
||||||
* Implementation of pwrite(2) for platforms that lack one.
|
* Implementation of pwrite(2) for Windows.
|
||||||
*
|
*
|
||||||
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* src/port/pwrite.c
|
* src/port/win32pwrite.c
|
||||||
*
|
|
||||||
* Note that this implementation changes the current file position, unlike
|
|
||||||
* the POSIX function, so we use the name pg_pwrite().
|
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -17,16 +14,11 @@
|
||||||
|
|
||||||
#include "postgres.h"
|
#include "postgres.h"
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#else
|
|
||||||
#include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ssize_t
|
ssize_t
|
||||||
pg_pwrite(int fd, const void *buf, size_t size, off_t offset)
|
pwrite(int fd, const void *buf, size_t size, off_t offset)
|
||||||
{
|
{
|
||||||
#ifdef WIN32
|
|
||||||
OVERLAPPED overlapped = {0};
|
OVERLAPPED overlapped = {0};
|
||||||
HANDLE handle;
|
HANDLE handle;
|
||||||
DWORD result;
|
DWORD result;
|
||||||
|
@ -46,10 +38,4 @@ pg_pwrite(int fd, const void *buf, size_t size, off_t offset)
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
#else
|
|
||||||
if (lseek(fd, offset, SEEK_SET) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return write(fd, buf, size);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
|
@ -104,13 +104,15 @@ sub mkvcbuild
|
||||||
getaddrinfo.c gettimeofday.c inet_net_ntop.c kill.c open.c
|
getaddrinfo.c gettimeofday.c inet_net_ntop.c kill.c open.c
|
||||||
snprintf.c strlcat.c strlcpy.c dirmod.c noblock.c path.c
|
snprintf.c strlcat.c strlcpy.c dirmod.c noblock.c path.c
|
||||||
dirent.c getopt.c getopt_long.c
|
dirent.c getopt.c getopt_long.c
|
||||||
pread.c preadv.c pwrite.c pwritev.c pg_bitutils.c
|
preadv.c pwritev.c pg_bitutils.c
|
||||||
pg_strong_random.c pgcheckdir.c pgmkdirp.c pgsleep.c pgstrcasecmp.c
|
pg_strong_random.c pgcheckdir.c pgmkdirp.c pgsleep.c pgstrcasecmp.c
|
||||||
pqsignal.c mkdtemp.c qsort.c qsort_arg.c bsearch_arg.c quotes.c system.c
|
pqsignal.c mkdtemp.c qsort.c qsort_arg.c bsearch_arg.c quotes.c system.c
|
||||||
strerror.c tar.c
|
strerror.c tar.c
|
||||||
win32dlopen.c
|
win32dlopen.c
|
||||||
win32env.c win32error.c
|
win32env.c win32error.c
|
||||||
win32link.c
|
win32link.c
|
||||||
|
win32pread.c
|
||||||
|
win32pwrite.c
|
||||||
win32ntdll.c
|
win32ntdll.c
|
||||||
win32security.c win32setlocale.c win32stat.c);
|
win32security.c win32setlocale.c win32stat.c);
|
||||||
|
|
||||||
|
|
|
@ -324,13 +324,11 @@ sub GenerateFiles
|
||||||
HAVE_POSIX_FALLOCATE => undef,
|
HAVE_POSIX_FALLOCATE => undef,
|
||||||
HAVE_PPC_LWARX_MUTEX_HINT => undef,
|
HAVE_PPC_LWARX_MUTEX_HINT => undef,
|
||||||
HAVE_PPOLL => undef,
|
HAVE_PPOLL => undef,
|
||||||
HAVE_PREAD => undef,
|
|
||||||
HAVE_PS_STRINGS => undef,
|
HAVE_PS_STRINGS => undef,
|
||||||
HAVE_PTHREAD => undef,
|
HAVE_PTHREAD => undef,
|
||||||
HAVE_PTHREAD_BARRIER_WAIT => undef,
|
HAVE_PTHREAD_BARRIER_WAIT => undef,
|
||||||
HAVE_PTHREAD_IS_THREADED_NP => undef,
|
HAVE_PTHREAD_IS_THREADED_NP => undef,
|
||||||
HAVE_PTHREAD_PRIO_INHERIT => undef,
|
HAVE_PTHREAD_PRIO_INHERIT => undef,
|
||||||
HAVE_PWRITE => undef,
|
|
||||||
HAVE_READLINE_H => undef,
|
HAVE_READLINE_H => undef,
|
||||||
HAVE_READLINE_HISTORY_H => undef,
|
HAVE_READLINE_HISTORY_H => undef,
|
||||||
HAVE_READLINE_READLINE_H => undef,
|
HAVE_READLINE_READLINE_H => undef,
|
||||||
|
|
Loading…
Reference in New Issue