I have applied the following patch to move the non-blocking code into
its own /port file for code clarity. This was Peter's suggestion.
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073
Index: src/Makefile.global.in
===================================================================
RCS file: /cvsroot/pgsql-server/src/Makefile.global.in,v
retrieving revision 1.175
diff -c -c -r1.175 Makefile.global.in
*** src/Makefile.global.in 10 Feb 2004 03:42:42 -0000 1.175
--- src/Makefile.global.in 10 Mar 2004 21:03:39 -0000
***************
*** 339,345 ****
#
# substitute implementations of the C library
! LIBOBJS = @LIBOBJS@ path.o pgsleep.o sprompt.o thread.o
ifneq (,$(LIBOBJS))
LIBS += -lpgport
--- 339,345 ----
#
# substitute implementations of the C library
! LIBOBJS = @LIBOBJS@ noblock.o path.o pgsleep.o sprompt.o thread.o
ifneq (,$(LIBOBJS))
LIBS += -lpgport
Index: src/backend/postmaster/pgstat.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/postmaster/pgstat.c,v
retrieving revision 1.59
diff -c -c -r1.59 pgstat.c
*** src/backend/postmaster/pgstat.c 9 Mar 2004 05:11:52 -0000 1.59
--- src/backend/postmaster/pgstat.c 10 Mar 2004 21:03:42 -0000
***************
*** 327,333 ****
* messages will be discarded; backends won't block waiting to send
* messages to the collector.
*/
! if (FCNTL_NONBLOCK(pgStatSock) < 0)
{
ereport(LOG,
(errcode_for_socket_access(),
--- 327,333 ----
* messages will be discarded; backends won't block waiting to send
* messages to the collector.
*/
! if (!set_noblock(pgStatSock))
{
ereport(LOG,
(errcode_for_socket_access(),
***************
*** 1819,1825 ****
* Set the write pipe to nonblock mode, so that we cannot block when
* the collector falls behind.
*/
! if (FCNTL_NONBLOCK(writePipe) < 0)
{
ereport(LOG,
(errcode_for_socket_access(),
--- 1819,1825 ----
* Set the write pipe to nonblock mode, so that we cannot block when
* the collector falls behind.
*/
! if (!set_noblock(writePipe))
{
ereport(LOG,
(errcode_for_socket_access(),
Index: src/backend/postmaster/postmaster.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/postmaster/postmaster.c,v
retrieving revision 1.372
diff -c -c -r1.372 postmaster.c
*** src/backend/postmaster/postmaster.c 9 Mar 2004 05:11:52 -0000 1.372
--- src/backend/postmaster/postmaster.c 10 Mar 2004 21:03:44 -0000
***************
*** 219,229 ****
char *rendezvous_name;
- /* For FNCTL_NONBLOCK */
- #if defined(WIN32) || defined(__BEOS__)
- long ioctlsocket_ret=1;
- #endif
-
/* list of library:init-function to be preloaded */
char *preload_libraries_string = NULL;
--- 219,224 ----
***************
*** 2365,2371 ****
strerror(errnum));
/* Set port to non-blocking. Don't do send() if this fails */
! if (FCNTL_NONBLOCK(port->sock) < 0)
return;
send(port->sock, buffer, strlen(buffer) + 1, 0);
--- 2360,2366 ----
strerror(errnum));
/* Set port to non-blocking. Don't do send() if this fails */
! if (!set_noblock(port->sock))
return;
send(port->sock, buffer, strlen(buffer) + 1, 0);
Index: src/include/c.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/c.h,v
retrieving revision 1.159
diff -c -c -r1.159 c.h
*** src/include/c.h 10 Jan 2004 23:39:51 -0000 1.159
--- src/include/c.h 10 Mar 2004 21:03:46 -0000
***************
*** 689,708 ****
#define PG_BINARY_W "w"
#endif
- #if !defined(WIN32) && !defined(__BEOS__)
- #define FCNTL_NONBLOCK(sock) fcntl(sock, F_SETFL, O_NONBLOCK)
- #else
- extern long ioctlsocket_ret;
-
- /* Returns non-0 on failure, while fcntl() returns -1 on failure */
- #ifdef WIN32
- #define FCNTL_NONBLOCK(sock) ((ioctlsocket(sock, FIONBIO, &ioctlsocket_ret) == 0) ? 0 : -1)
- #endif
- #ifdef __BEOS__
- #define FCNTL_NONBLOCK(sock) ((ioctl(sock, FIONBIO, &ioctlsocket_ret) == 0) ? 0 : -1)
- #endif
- #endif
-
#if defined(sun) && defined(__sparc__) && !defined(__SVR4)
#include <unistd.h>
#endif
--- 689,694 ----
Index: src/include/port.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port.h,v
retrieving revision 1.21
diff -c -c -r1.21 port.h
*** src/include/port.h 9 Mar 2004 04:49:02 -0000 1.21
--- src/include/port.h 10 Mar 2004 21:03:46 -0000
***************
*** 17,22 ****
--- 17,25 ----
#include <netdb.h>
#endif
+ /* non-blocking */
+ bool set_noblock(int sock);
+
/* Portable path handling for Unix/Win32 */
extern bool is_absolute_path(const char *filename);
extern char *first_path_separator(const char *filename);
Index: src/interfaces/libpq/Makefile
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/libpq/Makefile,v
retrieving revision 1.97
diff -c -c -r1.97 Makefile
*** src/interfaces/libpq/Makefile 2 Feb 2004 00:11:31 -0000 1.97
--- src/interfaces/libpq/Makefile 10 Mar 2004 21:03:46 -0000
***************
*** 23,29 ****
OBJS= fe-auth.o fe-connect.o fe-exec.o fe-misc.o fe-print.o fe-lobj.o \
fe-protocol2.o fe-protocol3.o pqexpbuffer.o pqsignal.o fe-secure.o \
dllist.o md5.o ip.o wchar.o encnames.o \
! $(filter crypt.o getaddrinfo.o inet_aton.o snprintf.o strerror.o path.o thread.o, $(LIBOBJS))
ifeq ($(PORTNAME), win32)
OBJS+=win32.o
endif
--- 23,29 ----
OBJS= fe-auth.o fe-connect.o fe-exec.o fe-misc.o fe-print.o fe-lobj.o \
fe-protocol2.o fe-protocol3.o pqexpbuffer.o pqsignal.o fe-secure.o \
dllist.o md5.o ip.o wchar.o encnames.o \
! $(filter crypt.o getaddrinfo.o inet_aton.o nonblock.o snprintf.o strerror.o path.o thread.o, $(LIBOBJS))
ifeq ($(PORTNAME), win32)
OBJS+=win32.o
endif
***************
*** 52,58 ****
# For port modules, this only happens if configure decides the module
# is needed (see filter hack in OBJS, above).
! crypt.c getaddrinfo.c inet_aton.c snprintf.c strerror.c path.c thread.c: % : $(top_srcdir)/src/port/%
rm -f $@ && $(LN_S) $< .
md5.c ip.c: % : $(backend_src)/libpq/%
--- 52,58 ----
# For port modules, this only happens if configure decides the module
# is needed (see filter hack in OBJS, above).
! crypt.c getaddrinfo.c inet_aton.c nonblock.c snprintf.c strerror.c path.c thread.c: % : $(top_srcdir)/src/port/%
rm -f $@ && $(LN_S) $< .
md5.c ip.c: % : $(backend_src)/libpq/%
***************
*** 78,81 ****
rm -f $(DESTDIR)$(includedir)/libpq-fe.h $(DESTDIR)$(includedir_internal)/libpq-int.h
$(DESTDIR)$(includedir_internal)/pqexpbuffer.h
clean distclean maintainer-clean: clean-lib
! rm -f $(OBJS) crypt.c getaddrinfo.c inet_aton.c snprintf.c strerror.c path.c thread.c dllist.c md5.c ip.c
encnames.cwchar.c
--- 78,81 ----
rm -f $(DESTDIR)$(includedir)/libpq-fe.h $(DESTDIR)$(includedir_internal)/libpq-int.h
$(DESTDIR)$(includedir_internal)/pqexpbuffer.h
clean distclean maintainer-clean: clean-lib
! rm -f $(OBJS) crypt.c getaddrinfo.c inet_aton.c nonblock.c snprintf.c strerror.c path.c thread.c dllist.c md5.c
ip.cencnames.c wchar.c
Index: src/interfaces/libpq/fe-connect.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/libpq/fe-connect.c,v
retrieving revision 1.267
diff -c -c -r1.267 fe-connect.c
*** src/interfaces/libpq/fe-connect.c 9 Jan 2004 02:02:43 -0000 1.267
--- src/interfaces/libpq/fe-connect.c 10 Mar 2004 21:03:49 -0000
***************
*** 50,60 ****
#include "libpq/ip.h"
#include "mb/pg_wchar.h"
- /* For FNCTL_NONBLOCK */
- #if defined(WIN32) || defined(__BEOS__)
- long ioctlsocket_ret=1;
- #endif
-
#define PGPASSFILE ".pgpass"
/* fall back options if they are not specified by arguments or defined
--- 50,55 ----
***************
*** 779,785 ****
static int
connectMakeNonblocking(PGconn *conn)
{
! if (FCNTL_NONBLOCK(conn->sock) < 0)
{
char sebuf[256];
--- 774,780 ----
static int
connectMakeNonblocking(PGconn *conn)
{
! if (!set_noblock(conn->sock))
{
char sebuf[256];
/*-------------------------------------------------------------------------
*
* noblock.c
* set a file descriptor as non-blocking
*
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
* $PostgreSQL: pgsql-server/src/port/copydir.c,v 1.8 2004/02/23 23:03:10 tgl Exp $
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include <sys/types.h>
#include <fcntl.h>
bool set_noblock(int sock)
{
#if !defined(WIN32) && !defined(__BEOS__)
return (fcntl(sock, F_SETFL, O_NONBLOCK) != -1);
#else
long ioctlsocket_ret = 1;
/* Returns non-0 on failure, while fcntl() returns -1 on failure */
#ifdef WIN32
return (ioctlsocket(sock, FIONBIO, &ioctlsocket_ret) == 0);
#endif
#ifdef __BEOS__
return (ioctl(sock, FIONBIO, &ioctlsocket_ret) == 0);
#endif
#endif
}