Add non-blocking function to /port - Mailing list pgsql-patches
From | Bruce Momjian |
---|---|
Subject | Add non-blocking function to /port |
Date | |
Msg-id | 200403102110.i2ALAp920842@candle.pha.pa.us Whole thread Raw |
List | pgsql-patches |
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 }
pgsql-patches by date: