There is no need to consume or trim the buffer, it is automatically done in output_to. That removes the written data from the start of the buffer. You would need to keep relevant checks, yes, but the current size (except for a check for 0 size) is not one of the needed checks.
On Wed, Aug 19, 2015 at 6:05 AM, Chris Angelico <ros...@gmail.com> wrote: > On Wed, Aug 19, 2015 at 1:45 PM, Per Hedbor <p...@hedbor.org> wrote: >> In this specific case you could use Stdio.Buffer instead. >> >> Change writeme to be a buffer, then add to it using ->add(string) >> >> In the socket_write function, you only need this: >> >> if( sizeof( con->_writeme ) ) >> con->_writeme->output_to(con->_socket); >> >> This should be O(1) regardless of the buffer size, and in general >> slightly faster than strings even for short:ish buffers. > > Presumably with the same check-and-trim behaviour, so it'd look like this: > > conn->_writeme->consume(conn->_writeme->output_to(conn->_sock)); > > But the main problem is that, as far as I know, Stdio.Buffer is > available only in the newer Pikes. I guess it'll have to be guarded > with a #if constant(Stdio.Buffer), but that means maintaining another > code branch. Maybe I'll drop chunked mode in favour of automatically > using Stdio.Buffer if it's available, and just warn people "On Pike > 7.8, avoid outputting large amounts of data as it can cause > performance problems". > > ChrisA