Patch streams.c.5.6.20.unfinished.patch for Performance problem Bug #73262
Patch version 2016-10-12 23:26 UTC
Return to Bug #73262 |
Download this patch
Patch Revisions:
Developer: jeffreydwalter@gmail.com
1116c1116
< size_t didwrite = 0, towrite, justwrote;
---
> size_t didwrite = 0, numwrites = 1, towrite, justwrote;
1118,1144c1118,1134
< /* if we have a seekable stream we need to ensure that data is written at the
< * current stream->position. This means invalidating the read buffer and then
< * performing a low-level seek */
< if (stream->ops->seek && (stream->flags & PHP_STREAM_FLAG_NO_SEEK) == 0 && stream->readpos != stream->writepos) {
< stream->readpos = stream->writepos = 0;
<
< stream->ops->seek(stream, stream->position, SEEK_SET, &stream->position TSRMLS_CC);
< }
<
<
< while (count > 0) {
< towrite = count;
< if (towrite > stream->chunk_size)
< towrite = stream->chunk_size;
<
< justwrote = stream->ops->write(stream, buf, towrite TSRMLS_CC);
<
< /* convert justwrote to an integer, since normally it is unsigned */
< if ((int)justwrote > 0) {
< buf += justwrote;
< count -= justwrote;
< didwrite += justwrote;
<
< /* Only screw with the buffer if we can seek, otherwise we lose data
< * buffered from fifos and sockets */
< if (stream->ops->seek && (stream->flags & PHP_STREAM_FLAG_NO_SEEK) == 0) {
< stream->position += justwrote;
---
> /* if we have a seekable stream we need to ensure that data is written at the
> * current stream->position. This means invalidating the read buffer and then
> * performing a low-level seek */
> if (stream->ops->seek && (stream->flags & PHP_STREAM_FLAG_NO_SEEK) == 0 && stream->readpos != stream->writepos) {
> stream->readpos = stream->writepos = 0;
> stream->ops->seek(stream, stream->position, SEEK_SET, &stream->position TSRMLS_CC);
> }
>
> while (count > 0) {
>
> // If we write more than about 5MB, then increase the buffer to 196K.
> if(numwrites%320 == 0) {
> if(stream->chunk_size < FG(def_chunk_size) * 24) {
> stream->chunk_size = stream->chunk_size * 4;
> #if STREAM_DEBUG
> fprintf(stderr, "Scaling: %d\n", stream->chunk_size);
> #endif
1146,1150c1136
< } else {
< break;
< }
< }
< return didwrite;
---
> }
1152c1138,1164
< }
---
> towrite = count;
>
> if (towrite > stream->chunk_size)
> towrite = stream->chunk_size;
>
> justwrote = stream->ops->write(stream, buf, towrite TSRMLS_CC);
>
> numwrites++;
>
> /* convert justwrote to an integer, since normally it is unsigned */
> if ((int)justwrote > 0) {
> buf += justwrote;
> count -= justwrote;
> didwrite += justwrote;
>
> /* Only screw with the buffer if we can seek, otherwise we lose data
> * buffered from fifos and sockets */
> if (stream->ops->seek && (stream->flags & PHP_STREAM_FLAG_NO_SEEK) == 0) {
> stream->position += justwrote;
> }
> } else {
> break;
> }
> }
> return didwrite;
>
> }
|