cataphract                               Sat, 19 Feb 2011 01:28:37 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=308477

Log:
- PHP_STREAM_OPTION_WRITE_BUFFER no longer disables the read buffer of a plain
  stream when 0 is given as the value.
- PHP_STREAM_OPTION_WRITE_BUFFER no longer changes the chunk size in socket
  streams.
- Added stream_set_chunk_size() function.
- Some signedness fixes.
- Test for commit r308474, now that it's possible to actually test it.

Changed paths:
    U   php/php-src/trunk/UPGRADING
    U   php/php-src/trunk/ext/standard/basic_functions.c
    U   php/php-src/trunk/ext/standard/streamsfuncs.c
    U   php/php-src/trunk/ext/standard/streamsfuncs.h
    A   php/php-src/trunk/ext/standard/tests/file/userstreams_006.phpt
    A   php/php-src/trunk/ext/standard/tests/streams/stream_set_chunk_size.phpt
    U   php/php-src/trunk/main/streams/plain_wrapper.c
    U   php/php-src/trunk/main/streams/xp_socket.c

Modified: php/php-src/trunk/UPGRADING
===================================================================
--- php/php-src/trunk/UPGRADING	2011-02-19 01:11:32 UTC (rev 308476)
+++ php/php-src/trunk/UPGRADING	2011-02-19 01:28:37 UTC (rev 308477)
@@ -164,7 +164,9 @@
   strings. This breaks code that iterated the resulting stream array using a
   numeric index, but makes easier to identify which of the passed streams are
   present in the result.
-
+- stream_set_write_buffer() no longer disables the read buffer of a plain
+  stream when 0 is given as the second argument.
+- stream_set_write_buffer() no longer changes the chunk size in socket streams.

 ===================================
 5. Changes made to existing methods
@@ -325,6 +327,7 @@
          - get_declared_traits()
          - http_response_code()
          - trait_exists()
+         - stream_set_chunk_size()

      f. New global constants


Modified: php/php-src/trunk/ext/standard/basic_functions.c
===================================================================
--- php/php-src/trunk/ext/standard/basic_functions.c	2011-02-19 01:11:32 UTC (rev 308476)
+++ php/php-src/trunk/ext/standard/basic_functions.c	2011-02-19 01:28:37 UTC (rev 308477)
@@ -2117,6 +2117,11 @@
 	ZEND_ARG_INFO(0, fp)
 	ZEND_ARG_INFO(0, buffer)
 ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO(arginfo_stream_set_chunk_size, 0)
+	ZEND_ARG_INFO(0, fp)
+	ZEND_ARG_INFO(0, chunk_size)
+ZEND_END_ARG_INFO()

 ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_enable_crypto, 0, 0, 2)
 	ZEND_ARG_INFO(0, stream)
@@ -3119,6 +3124,7 @@
 	PHP_FE(stream_set_read_buffer,											arginfo_stream_set_read_buffer)
 	PHP_FE(stream_set_write_buffer,											arginfo_stream_set_write_buffer)
 	PHP_FALIAS(set_file_buffer, stream_set_write_buffer,					arginfo_stream_set_write_buffer)
+	PHP_FE(stream_set_chunk_size,											arginfo_stream_set_chunk_size)

 	PHP_DEP_FALIAS(set_socket_blocking, stream_set_blocking,				arginfo_stream_set_blocking)
 	PHP_FE(stream_set_blocking,												arginfo_stream_set_blocking)

Modified: php/php-src/trunk/ext/standard/streamsfuncs.c
===================================================================
--- php/php-src/trunk/ext/standard/streamsfuncs.c	2011-02-19 01:11:32 UTC (rev 308476)
+++ php/php-src/trunk/ext/standard/streamsfuncs.c	2011-02-19 01:28:37 UTC (rev 308477)
@@ -557,7 +557,7 @@
 {
 	HashTable *stream_xport_hash;
 	char *stream_xport;
-	int stream_xport_len;
+	uint stream_xport_len;
 	ulong num_key;

 	if (zend_parse_parameters_none() == FAILURE) {
@@ -586,7 +586,8 @@
 {
 	HashTable *url_stream_wrappers_hash;
 	char *stream_protocol;
-	int key_flags, stream_protocol_len = 0;
+	int key_flags;
+	uint stream_protocol_len = 0;
 	ulong num_key;

 	if (zend_parse_parameters_none() == FAILURE) {
@@ -924,7 +925,7 @@
 	HashPosition pos, opos;
 	zval **wval, **oval;
 	char *wkey, *okey;
-	int wkey_len, okey_len;
+	uint wkey_len, okey_len;
 	int ret = SUCCESS;
 	ulong num_key;

@@ -1433,6 +1434,40 @@
 }
 /* }}} */

+/* {{{ proto int stream_set_chunk_size(resource fp, int chunk_size)
+   Set the stream chunk size */
+PHP_FUNCTION(stream_set_chunk_size)
+{
+	int			ret;
+	long		csize;
+	zval		*zstream;
+	php_stream	*stream;
+
+	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &zstream, &csize) == FAILURE) {
+		RETURN_FALSE;
+	}
+
+	if (csize <= 0) {
+		php_error_docref(NULL TSRMLS_CC, E_WARNING, "The chunk size must be a positive integer, given %ld", csize);
+		RETURN_FALSE;
+	}
+	/* stream.chunk_size is actually a size_t, but php_stream_set_option
+	 * can only use an int to accept the new value and return the old one.
+	 * In any case, values larger than INT_MAX for a chunk size make no sense.
+	 */
+	if (csize > INT_MAX) {
+		php_error_docref(NULL TSRMLS_CC, E_WARNING, "The chunk size cannot be larger than %d", INT_MAX);
+		RETURN_FALSE;
+	}
+
+	php_stream_from_zval(stream, &zstream);
+
+	ret = php_stream_set_option(stream, PHP_STREAM_OPTION_SET_CHUNK_SIZE, (int)csize, NULL);
+
+	RETURN_LONG(ret > 0 ? (long)ret : (long)EOF);
+}
+/* }}} */
+
 /* {{{ proto int stream_set_read_buffer(resource fp, int buffer)
    Set file read buffer */
 PHP_FUNCTION(stream_set_read_buffer)

Modified: php/php-src/trunk/ext/standard/streamsfuncs.h
===================================================================
--- php/php-src/trunk/ext/standard/streamsfuncs.h	2011-02-19 01:11:32 UTC (rev 308476)
+++ php/php-src/trunk/ext/standard/streamsfuncs.h	2011-02-19 01:28:37 UTC (rev 308477)
@@ -38,6 +38,7 @@
 PHP_FUNCTION(stream_set_timeout);
 PHP_FUNCTION(stream_set_read_buffer);
 PHP_FUNCTION(stream_set_write_buffer);
+PHP_FUNCTION(stream_set_chunk_size);
 PHP_FUNCTION(stream_get_transports);
 PHP_FUNCTION(stream_get_wrappers);
 PHP_FUNCTION(stream_get_line);

Added: php/php-src/trunk/ext/standard/tests/file/userstreams_006.phpt
===================================================================
--- php/php-src/trunk/ext/standard/tests/file/userstreams_006.phpt	                        (rev 0)
+++ php/php-src/trunk/ext/standard/tests/file/userstreams_006.phpt	2011-02-19 01:28:37 UTC (rev 308477)
@@ -0,0 +1,38 @@
+--TEST--
+User-space streams: set_options returns "not implemented" for unhandled option types
+--FILE--
+<?php
+class test_wrapper {
+	function stream_open($path, $mode, $openedpath) {
+		return true;
+	}
+	function stream_eof() {
+		return false;
+	}
+	function stream_write($data) {
+		echo "size: ", strlen($data), "\n";
+		return strlen($data);
+	}
+	function stream_set_option($option, $arg1, $arg2) {
+		echo "option: ", $option, ", ", $arg1, ", ", $arg2, "\n";
+		return false;
+	}
+}
+
+var_dump(stream_wrapper_register('test', 'test_wrapper'));
+
+$fd = fopen("test://foo","r");
+
+var_dump(stream_set_write_buffer($fd, 50));
+var_dump(stream_set_chunk_size($fd, 42));
+
+var_dump(fwrite($fd, str_repeat('0', 70)));
+
+--EXPECT--
+bool(true)
+option: 3, 2, 50
+int(-1)
+int(8192)
+size: 42
+size: 28
+int(70)

Added: php/php-src/trunk/ext/standard/tests/streams/stream_set_chunk_size.phpt
===================================================================
--- php/php-src/trunk/ext/standard/tests/streams/stream_set_chunk_size.phpt	                        (rev 0)
+++ php/php-src/trunk/ext/standard/tests/streams/stream_set_chunk_size.phpt	2011-02-19 01:28:37 UTC (rev 308477)
@@ -0,0 +1,93 @@
+--TEST--
+stream_set_chunk_size basic tests
+--FILE--
+<?php
+class test_wrapper {
+	function stream_open($path, $mode, $openedpath) {
+		return true;
+	}
+	function stream_eof() {
+		return false;
+	}
+	function stream_read($count) {
+		echo "read with size: ", $count, "\n";
+		return str_repeat('a', $count);
+	}
+	function stream_write($data) {
+		echo "write with size: ", strlen($data), "\n";
+		return strlen($data);
+	}
+	function stream_set_option($option, $arg1, $arg2) {
+		echo "option: ", $option, ", ", $arg1, ", ", $arg2, "\n";
+		return false;
+	}
+}
+
+var_dump(stream_wrapper_register('test', 'test_wrapper'));
+
+$f = fopen("test://foo","r");
+
+/* when the chunk size is 1, the read buffer is skipped, but the
+ * the writes are made in chunks of size 1 (business as usual)
+ * This should probably be revisited */
+echo "should return previous chunk size (8192)\n";
+var_dump(stream_set_chunk_size($f, 1));
+echo "should be read without buffer (\$count == 10000)\n";
+var_dump(strlen(fread($f, 10000)));
+echo "should elicit 3 writes of size 1 and return 3\n";
+var_dump(fwrite($f, str_repeat('b', 3)));
+
+echo "should return previous chunk size (1)\n";
+var_dump(stream_set_chunk_size($f, 100));
+echo "should elicit one read of size 100 (chunk size)\n";
+var_dump(strlen(fread($f, 250)));
+echo "should elicit one read of size 100 (chunk size)\n";
+var_dump(strlen(fread($f, 50)));
+echo "should elicit no read because there is sufficient cached data\n";
+var_dump(strlen(fread($f, 50)));
+echo "should elicit 2 writes of size 100 and one of size 50\n";
+var_dump(strlen(fwrite($f, str_repeat('b', 250))));
+
+echo "\nerror conditions\n";
+var_dump(stream_set_chunk_size($f, 0));
+var_dump(stream_set_chunk_size($f, -1));
+var_dump(stream_set_chunk_size($f, array()));
+
+--EXPECTF--
+bool(true)
+should return previous chunk size (8192)
+int(8192)
+should be read without buffer ($count == 10000)
+read with size: 10000
+int(10000)
+should elicit 3 writes of size 1 and return 3
+write with size: 1
+write with size: 1
+write with size: 1
+int(3)
+should return previous chunk size (1)
+int(1)
+should elicit one read of size 100 (chunk size)
+read with size: 100
+int(100)
+should elicit one read of size 100 (chunk size)
+read with size: 100
+int(50)
+should elicit no read because there is sufficient cached data
+int(50)
+should elicit 2 writes of size 100 and one of size 50
+write with size: 100
+write with size: 100
+write with size: 50
+int(3)
+
+error conditions
+
+Warning: stream_set_chunk_size(): The chunk size must be a positive integer, given 0 in %s on line %d
+bool(false)
+
+Warning: stream_set_chunk_size(): The chunk size must be a positive integer, given -1 in %s on line %d
+bool(false)
+
+Warning: stream_set_chunk_size() expects parameter 2 to be long, array given in %s on line %d
+bool(false)

Modified: php/php-src/trunk/main/streams/plain_wrapper.c
===================================================================
--- php/php-src/trunk/main/streams/plain_wrapper.c	2011-02-19 01:11:32 UTC (rev 308476)
+++ php/php-src/trunk/main/streams/plain_wrapper.c	2011-02-19 01:28:37 UTC (rev 308477)
@@ -588,15 +588,12 @@

 			switch(value) {
 				case PHP_STREAM_BUFFER_NONE:
-					stream->flags |= PHP_STREAM_FLAG_NO_BUFFER;
 					return setvbuf(data->file, NULL, _IONBF, 0);

 				case PHP_STREAM_BUFFER_LINE:
-					stream->flags ^= PHP_STREAM_FLAG_NO_BUFFER;
 					return setvbuf(data->file, NULL, _IOLBF, size);

 				case PHP_STREAM_BUFFER_FULL:
-					stream->flags ^= PHP_STREAM_FLAG_NO_BUFFER;
 					return setvbuf(data->file, NULL, _IOFBF, size);

 				default:

Modified: php/php-src/trunk/main/streams/xp_socket.c
===================================================================
--- php/php-src/trunk/main/streams/xp_socket.c	2011-02-19 01:11:32 UTC (rev 308476)
+++ php/php-src/trunk/main/streams/xp_socket.c	2011-02-19 01:28:37 UTC (rev 308477)
@@ -400,10 +400,6 @@
 				}
 #endif

-				case PHP_STREAM_OPTION_WRITE_BUFFER:
-					php_stream_set_chunk_size(stream, (ptrparam ? *(size_t *)ptrparam : PHP_SOCK_CHUNK_SIZE));
-					return PHP_STREAM_OPTION_RETURN_OK;
-
 				default:
 					return PHP_STREAM_OPTION_RETURN_NOTIMPL;
 			}
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to