QUIC memory slicer takes ref-counted IOBuffer and uses it to avoid extra copies of data.
This doesn't work with Cronet implementation of BidirectionalStream::Write, which takes application-provided raw data pointer and wraps it using WrappedIOBuffer.
It works if net stack relinquishes ownership when onWriteCompleted is invoked, but it doesn't work with FLAGS_quic_reloadable_flag_quic_use_mem_slices=true because underlying code expects buffer to be retained by holding the additional reference, which results in crash like this:
libsystem_platform.dylib _platform_memmove : <line number missing>
Cronet net::QuicDataWriter::WriteBytes(void const*, unsigned long) : 151
Cronet net::QuicDataWriter::WriteBytes(void const*, unsigned long) : 151
Cronet net::QuicStreamSendBuffer::WriteStreamData(unsigned long long, unsigned long long, net::QuicDataWriter*) : 75
Cronet net::QuicFramer::AppendStreamFrame(net::QuicStreamFrame const&, bool, net::QuicDataWriter*) : 2025
Cronet net::QuicFramer::BuildDataPacket(net::QuicPacketHeader const&, std::__1::vector<net::QuicFrame, std::__1::allocator<net::QuicFrame> > const&, char*, unsigned long) : 384
Cronet net::QuicPacketCreator::SerializePacket(char*, unsigned long) : 429
Cronet net::QuicPacketCreator::Flush() : 260
Cronet net::QuicPacketGenerator::FinishBatchOperations() : 240
Cronet net::QuicConnection::ScopedPacketBundler::~ScopedPacketBundler() : 2276
Cronet net::QuicConnection::WriteAndBundleAcksIfNotBlocked() : 2269
Cronet base::debug::TaskAnnotator::RunTask(char const*, base::PendingTask*) : 65
Cronet base::MessageLoop::RunTask(base::PendingTask*) : 394
Cronet base::MessageLoop::DoDelayedWork(base::TimeTicks*) : 406
Cronet base::MessagePumpCFRunLoopBase::RunWork() : 456
Cronet base::MessagePumpCFRunLoopBase::RunWorkSource(void*) : 428
CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ : <line number missing>
CoreFoundation __CFRunLoopDoSource0 : <line number missing>
CoreFoundation __CFRunLoopDoSources0 : <line number missing>
CoreFoundation __CFRunLoopRun : <line number missing>
CoreFoundation CFRunLoopRunSpecific : <line number missing>
Foundation -[NSRunLoop(NSRunLoop) runMode:beforeDate:] : <line number missing>
Cronet base::MessagePumpNSRunLoop::DoRun(base::MessagePump::Delegate*) : 724
Cronet base::MessagePumpCFRunLoopBase::Run(base::MessagePump::Delegate*) : 179
Comment 1 by mef@chromium.org
, Nov 20 2017Labels: -OS-Linux OS-Android