CVS update: php3/functions

From: Date: Sun, 13 Jun 1999 10:07:44 +0000
Subject: CVS update: php3/functions
Groups: php.dev 
Request: Send a blank email to php-dev+get-6932@lists.php.net to get a copy of this message
Date: Sunday June 13, 1999 @ 6:07 Author: sas Update of /repository/php3/functions In directory php:/tmp/cvs-serv3013/functions Modified Files: file.c file.h fsock.c Log Message: optimize fgets for blocking sockets Index: php3/functions/file.c diff -u php3/functions/file.c:1.216 php3/functions/file.c:1.217 --- php3/functions/file.c:1.216 Wed Jun 9 07:20:39 1999 +++ php3/functions/file.c Sun Jun 13 06:07:39 1999 @@ -26,7 +26,7 @@ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> | +----------------------------------------------------------------------+ */ -/* $Id: file.c,v 1.216 1999/06/09 11:20:39 kk Exp $ */ +/* $Id: file.c,v 1.217 1999/06/13 10:07:39 sas Exp $ */ #ifdef THREAD_SAFE #include "tls.h" #endif @@ -658,13 +658,42 @@ } /* }}} */ +PHPAPI int _php3_set_sock_blocking(int socketd, int block) +{ + int ret = SUCCESS; + int flags; + int myflag = 0; + +#if WIN32|WINNT + /* with ioctlsocket, a non-zero sets nonblocking, a zero sets blocking */ + flags=block; + if (ioctlsocket(socketd,FIONBIO,&flags)==SOCKET_ERROR){ + php3_error(E_WARNING,"%s",WSAGetLastError()); + ret = FALSE; + } +#else + flags = fcntl(socketd, F_GETFL); +#ifdef O_NONBLOCK + myflag = O_NONBLOCK; /* POSIX version */ +#elif defined(O_NDELAY) + myflag = O_NDELAY; /* old non-POSIX version */ +#endif + if(block) { + flags |= myflag; + } else { + flags &= ~myflag; + } + fcntl(socketd,F_SETFL,flags); +#endif + return ret; +} + /* {{{ proto int set_socket_blocking(int socket descriptor, int mode) Set blocking/non-blocking mode on a socket */ void php3_set_socket_blocking(INTERNAL_FUNCTION_PARAMETERS) { pval *arg1, *arg2; int id, type, block; - int flags; int socketd=0, *sock; TLS_VARS; @@ -682,42 +711,10 @@ RETURN_FALSE; } socketd=*sock; - _php3_sock_set_blocking(socketd, block == 0 ? 0 : 1); -#if WIN32|WINNT - /* with ioctlsocket, a non-zero sets nonblocking, a zero sets blocking */ - flags=block; - if (ioctlsocket(socketd,FIONBIO,&flags)==SOCKET_ERROR){ - php3_error(E_WARNING,"%s",WSAGetLastError()); + if(_php3_set_sock_blocking(socketd, block) == FAILURE) RETURN_FALSE; - } else { - RETURN_TRUE; - } -#else - flags = fcntl(socketd, F_GETFL); -# ifdef O_NONBLOCK - /* POSIX version */ - if (block) { - if ((flags & O_NONBLOCK)) { - flags ^= O_NONBLOCK; - } - } else { - if (!(flags & O_NONBLOCK)) { - flags |= O_NONBLOCK; - } - } -# else -# ifdef O_NDELAY - /* old non-POSIX version */ - if (block) { - flags |= O_NDELAY; - } else { - flags ^= O_NDELAY; - } -# endif -# endif - fcntl(socketd,F_SETFL,flags); - /* FIXME: Shouldnt we return true on this function? */ -#endif + _php3_sock_set_blocking(socketd, block == 0 ? 0 : 1); + RETURN_TRUE; } /* }}} */ Index: php3/functions/file.h diff -u php3/functions/file.h:1.29 php3/functions/file.h:1.30 --- php3/functions/file.h:1.29 Tue Apr 27 08:55:20 1999 +++ php3/functions/file.h Sun Jun 13 06:07:43 1999 @@ -27,7 +27,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: file.h,v 1.29 1999/04/27 12:55:20 rasmus Exp $ */ +/* $Id: file.h,v 1.30 1999/06/13 10:07:43 sas Exp $ */ #ifndef _FILE_H #define _FILE_H @@ -68,5 +68,7 @@ extern void php3_set_socket_timeout(INTERNAL_FUNCTION_PARAMETERS); extern void php3_get_meta_tags(INTERNAL_FUNCTION_PARAMETERS); extern PHP_FUNCTION(flock); + +PHPAPI int _php3_set_sock_blocking(int socketd, int block); #endif /* _FILE_H */ Index: php3/functions/fsock.c diff -u php3/functions/fsock.c:1.113 php3/functions/fsock.c:1.114 --- php3/functions/fsock.c:1.113 Tue Jun 8 11:02:41 1999 +++ php3/functions/fsock.c Sun Jun 13 06:07:43 1999 @@ -27,7 +27,7 @@ | Jim Winstead (jimw@php.net) | +----------------------------------------------------------------------+ */ -/* $Id: fsock.c,v 1.113 1999/06/08 15:02:41 sas Exp $ */ +/* $Id: fsock.c,v 1.114 1999/06/13 10:07:43 sas Exp $ */ #ifdef THREAD_SAFE #include "tls.h" #endif @@ -503,6 +503,28 @@ return nr_read; } +/* only for blocking sockets */ +static size_t _php3_sock_queued_data(php3i_sockbuf *sock) +{ + int nr_bytes; + char buf[CHUNK_SIZE]; + int flags = MSG_PEEK; + +#ifdef MSG_DONTWAIT + flags |= MSG_DONTWAIT; +#else + _php3_set_sock_blocking(sock->socket, 1); +#endif + + nr_bytes = recv(sock->socket, buf, CHUNK_SIZE, flags); + +#ifndef MSG_DONTWAIT + _php3_set_sock_blocking(sock->socket, 0); +#endif + + return (nr_bytes < 0 ? 0 : nr_bytes); +} + static size_t _php3_sock_read(php3i_sockbuf *sock) { size_t nr_bytes; @@ -530,10 +552,6 @@ return old; } -#define SOCK_FIND_AND_READ \ - SOCK_FIND(sock,socket); \ - _php3_sock_read(sock) - #define SOCK_FIND_AND_READ_MAX(max) \ SOCK_FIND(sock, socket); \ if(sock->is_blocked) _php3_sock_read_limited(sock, max); else _php3_sock_read(sock) @@ -548,16 +566,21 @@ char *ret = NULL; size_t amount = 0; size_t nr_read; - SOCK_FIND_AND_READ_MAX(1); - + size_t nr_toread; + SOCK_FIND(sock, socket); + if(maxlen < 0) return ret; if(sock->is_blocked) { + nr_toread = _php3_sock_queued_data(sock); + if(!nr_toread) nr_toread = 1; for(nr_read = 1; !sock->eof && nr_read < maxlen; ) { - nr_read += _php3_sock_read_limited(sock, 1); + nr_read += _php3_sock_read_limited(sock, nr_toread); if((p = memchr(READPTR(sock), '\n', TOREAD(sock))) != NULL) break; + nr_toread = 1; } } else { + _php3_sock_read(sock); p = memchr(READPTR(sock), '\n', MIN(TOREAD(sock), maxlen - 1)); }

« previous php.dev (#6932) next »