@@ -49,7 +49,14 @@ void SC::AsyncRequestReadableStream<AsyncReadRequest>::onCloseStopRequest()
4949{
5050 if (not request.isFree ())
5151 {
52+ SC::Result res = SC::Result::Error (" Fake error to unref bufferID" );
53+
54+ typename AsyncReadRequest::Result result (*eventLoop, request, res, nullptr );
55+
56+ justUnrefBuffer = true ;
57+ request.callback (result); // will free bufferID
5258 request.stop (*eventLoop);
59+ justUnrefBuffer = false ;
5360 }
5461 if (autoCloseDescriptor)
5562 {
@@ -111,6 +118,8 @@ void SC::AsyncRequestReadableStream<AsyncReadRequest>::afterRead(typename AsyncR
111118 else
112119 {
113120 getBuffersPool ().unrefBuffer (bufferID);
121+ if (justUnrefBuffer)
122+ return ;
114123 AsyncReadableStream::emitError (result.isValid ());
115124 }
116125}
@@ -161,7 +170,14 @@ void SC::AsyncRequestWritableStream<AsyncWriteRequest>::onFinishStopRequest()
161170{
162171 if (not request.isFree ())
163172 {
173+ SC::Result res = SC::Result::Error (" Fake error to unref bufferID" );
174+
175+ typename AsyncWriteRequest::Result result (*eventLoop, request, res, nullptr );
176+
177+ justUnrefBuffer = true ;
178+ request.callback (result); // will free bufferID
164179 request.stop (*eventLoop);
180+ justUnrefBuffer = false ;
165181 }
166182 if (autoCloseDescriptor)
167183 {
@@ -183,6 +199,8 @@ SC::Result SC::AsyncRequestWritableStream<AsyncWriteRequest>::write(AsyncBufferV
183199 request.callback = [this , bufferID](typename AsyncWriteRequest::Result& result)
184200 {
185201 getBuffersPool ().unrefBuffer (bufferID);
202+ if (justUnrefBuffer)
203+ return ;
186204 auto callbackCopy = move (callback);
187205 callback = {};
188206 AsyncWritableStream::finishedWriting (bufferID, move (callbackCopy), result.isValid ());
0 commit comments