]> granicus.if.org Git - php/commitdiff
Avoid useless stream buffer copying and workaround with chunk_size manipulation.
authorDmitry Stogov <dmitry@zend.com>
Wed, 13 Jun 2018 23:34:17 +0000 (02:34 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 13 Jun 2018 23:34:17 +0000 (02:34 +0300)
ext/mysqlnd/mysqlnd_vio.c
main/streams/streams.c

index 997fbd4d6823d03b7608275b410d924665a6555a..50db782be6e974cf241959e4f18cedd799afac28 100644 (file)
@@ -79,14 +79,12 @@ MYSQLND_METHOD(mysqlnd_vio, network_read)(MYSQLND_VIO * const vio, zend_uchar *
 {
        enum_func_status return_value = PASS;
        php_stream * net_stream = vio->data->m.get_stream(vio);
-       size_t old_chunk_size = net_stream->chunk_size;
        size_t to_read = count, ret;
        zend_uchar * p = buffer;
 
        DBG_ENTER("mysqlnd_vio::network_read");
        DBG_INF_FMT("count="MYSQLND_SZ_T_SPEC, count);
 
-       net_stream->chunk_size = MIN(to_read, vio->data->options.net_read_buffer_size);
        while (to_read) {
                if (!(ret = php_stream_read(net_stream, (char *) p, to_read))) {
                        DBG_ERR_FMT("Error while reading header from socket");
@@ -97,7 +95,6 @@ MYSQLND_METHOD(mysqlnd_vio, network_read)(MYSQLND_VIO * const vio, zend_uchar *
                to_read -= ret;
        }
        MYSQLND_INC_CONN_STATISTIC_W_VALUE(stats, STAT_BYTES_RECEIVED, count - to_read);
-       net_stream->chunk_size = old_chunk_size;
        DBG_RETURN(return_value);
 }
 /* }}} */
@@ -265,6 +262,8 @@ MYSQLND_METHOD(mysqlnd_vio, post_connect_set_opt)(MYSQLND_VIO * const vio, const
                        /* TCP -> Set SO_KEEPALIVE */
                        mysqlnd_set_sock_keepalive(net_stream);
                }
+
+               net_stream->chunk_size = vio->data->options.net_read_buffer_size;
        }
 
        DBG_VOID_RETURN;
index b82f092f0c5f5277d1f04a2e77d21005d3fd1359..6f77b29af8bbc72388bdfea78f344ba68db19fba 100644 (file)
@@ -624,7 +624,9 @@ PHPAPI void _php_stream_fill_read_buffer(php_stream *stream, size_t size)
 
                        /* reduce buffer memory consumption if possible, to avoid a realloc */
                        if (stream->readbuf && stream->readbuflen - stream->writepos < stream->chunk_size) {
-                               memmove(stream->readbuf, stream->readbuf + stream->readpos, stream->readbuflen - stream->readpos);
+                               if (stream->writepos > stream->readpos) {
+                                       memmove(stream->readbuf, stream->readbuf + stream->readpos, stream->writepos - stream->readpos);
+                               }
                                stream->writepos -= stream->readpos;
                                stream->readpos = 0;
                        }