CVS update: php3/functions
| From: | sas | 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));
}