Inode::FillPendingRequests() could fill the requests in the wrong team context.
Now, it will only notify the read requests do gather the data. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@10198 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -50,6 +50,7 @@ class ReadRequest {
|
|||||||
~ReadRequest();
|
~ReadRequest();
|
||||||
|
|
||||||
status_t Wait(bool nonBlocking);
|
status_t Wait(bool nonBlocking);
|
||||||
|
void Notify();
|
||||||
void Abort();
|
void Abort();
|
||||||
|
|
||||||
status_t PutBufferChain(cbuf *bufferChain, size_t *_bytesRead = NULL,
|
status_t PutBufferChain(cbuf *bufferChain, size_t *_bytesRead = NULL,
|
||||||
@@ -549,10 +550,8 @@ Inode::WriteBufferToChain(const void **_buffer, size_t *_bytesLeft, bool nonBloc
|
|||||||
}
|
}
|
||||||
|
|
||||||
// join this chain with our already existing chain (if any)
|
// join this chain with our already existing chain (if any)
|
||||||
|
fBufferChain = cbuf_merge_chains(fBufferChain, chain);
|
||||||
|
|
||||||
chain = cbuf_merge_chains(fBufferChain, chain);
|
|
||||||
|
|
||||||
fBufferChain = chain;
|
|
||||||
*_buffer = (const void *)((addr_t)buffer + bufferSize);
|
*_buffer = (const void *)((addr_t)buffer + bufferSize);
|
||||||
*_bytesLeft -= bufferSize;
|
*_bytesLeft -= bufferSize;
|
||||||
|
|
||||||
@@ -586,12 +585,18 @@ Inode::FillPendingRequests()
|
|||||||
ReadRequest *request;
|
ReadRequest *request;
|
||||||
DoublyLinked::Iterator<ReadRequest> iterator(fRequests);
|
DoublyLinked::Iterator<ReadRequest> iterator(fRequests);
|
||||||
while (bytesLeft != 0 && (request = iterator.Next()) != NULL) {
|
while (bytesLeft != 0 && (request = iterator.Next()) != NULL) {
|
||||||
// try to fill this request
|
// notify the request, so that it can be filled
|
||||||
size_t bytesRead;
|
size_t space = request->SpaceLeft();
|
||||||
if (request->PutBufferChain(fBufferChain, &bytesRead, true) == B_OK) {
|
if (space == 0)
|
||||||
bytesLeft -= bytesRead;
|
continue;
|
||||||
MayReleaseWriter();
|
|
||||||
}
|
if (space > bytesLeft)
|
||||||
|
bytesLeft = 0;
|
||||||
|
else
|
||||||
|
bytesLeft -= space;
|
||||||
|
|
||||||
|
request->Notify();
|
||||||
|
MayReleaseWriter();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -780,10 +785,17 @@ ReadRequest::Wait(bool nonBlocking)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
ReadRequest::Notify()
|
||||||
|
{
|
||||||
|
release_sem(fLock);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ReadRequest::Abort()
|
ReadRequest::Abort()
|
||||||
{
|
{
|
||||||
fBytesRead = 0;
|
fBuffer = NULL;
|
||||||
release_sem(fLock);
|
release_sem(fLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -800,6 +812,9 @@ ReadRequest::PutBufferChain(cbuf *bufferChain, size_t *_bytesRead, bool releaseP
|
|||||||
if (_bytesRead)
|
if (_bytesRead)
|
||||||
*_bytesRead = 0;
|
*_bytesRead = 0;
|
||||||
|
|
||||||
|
if (fBuffer == NULL)
|
||||||
|
return B_CANCELED;
|
||||||
|
|
||||||
if (bufferChain == NULL)
|
if (bufferChain == NULL)
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|
||||||
@@ -824,6 +839,7 @@ ReadRequest::PutBufferChain(cbuf *bufferChain, size_t *_bytesRead, bool releaseP
|
|||||||
// if that call fails, the next read will duplicate the input
|
// if that call fails, the next read will duplicate the input
|
||||||
dprintf("pipefs: cbuf_truncate_head() failed for cbuf %p\n", bufferChain);
|
dprintf("pipefs: cbuf_truncate_head() failed for cbuf %p\n", bufferChain);
|
||||||
}
|
}
|
||||||
|
|
||||||
fBytesRead += length;
|
fBytesRead += length;
|
||||||
if (_bytesRead)
|
if (_bytesRead)
|
||||||
*_bytesRead = length;
|
*_bytesRead = length;
|
||||||
|
|||||||
Reference in New Issue
Block a user