nfs4: Reset object_wait_info.events in each iteration

This commit is contained in:
Pawel Dziepak
2012-11-02 16:14:07 +01:00
parent 81f2b97177
commit 2f44d34e5e
3 changed files with 19 additions and 4 deletions
@@ -372,6 +372,9 @@ ConnectionStream::Receive(void** _buffer, uint32* _size)
object[1].events = B_EVENT_READ;
do {
object[0].events = B_EVENT_ACQUIRE_SEMAPHORE;
object[1].events = B_EVENT_READ;
result = wait_for_objects(object, 2);
if (result < B_OK
|| (object[0].events & B_EVENT_ACQUIRE_SEMAPHORE) != 0) {
@@ -383,7 +386,7 @@ ConnectionStream::Receive(void** _buffer, uint32* _size)
// There is only one listener thread per connection. No need to lock.
uint32 received = 0;
do {
result = recv(fSocket, &record_size + received,
result = recv(fSocket, ((uint8*)&record_size) + received,
sizeof(record_size) - received, 0);
received += result;
} while (result > 0 && received < sizeof(record_size));
@@ -397,6 +400,8 @@ ConnectionStream::Receive(void** _buffer, uint32* _size)
}
record_size = ntohl(record_size);
ASSERT(record_size > 0);
last_one = static_cast<int32>(record_size) < 0;
record_size &= LAST_FRAGMENT - 1;
@@ -417,6 +422,9 @@ ConnectionStream::Receive(void** _buffer, uint32* _size)
result = errno;
free(buffer);
return result;
} else if (result == 0) {
free(buffer);
return ECONNABORTED;
}
size += record_size;
@@ -453,6 +461,9 @@ ConnectionPacket::Receive(void** _buffer, uint32* _size)
object[1].events = B_EVENT_READ;
do {
object[0].events = B_EVENT_ACQUIRE_SEMAPHORE;
object[1].events = B_EVENT_READ;
result = wait_for_objects(object, 2);
if (result < B_OK
|| (object[0].events & B_EVENT_ACQUIRE_SEMAPHORE) != 0) {
@@ -719,6 +730,9 @@ ConnectionListener::AcceptConnection(Connection** connection)
object[1].events = B_EVENT_READ;
do {
object[0].events = B_EVENT_ACQUIRE_SEMAPHORE;
object[1].events = B_EVENT_READ;
status_t result = wait_for_objects(object, 2);
if (result < B_OK
|| (object[0].events & B_EVENT_ACQUIRE_SEMAPHORE) != 0) {
@@ -265,7 +265,7 @@ Server::_Listener()
{
status_t result;
uint32 size;
void* buffer;
void* buffer = NULL;
while (!fThreadCancel) {
result = fConnection->Receive(&buffer, &size);
@@ -275,7 +275,8 @@ Server::_Listener()
fThreadError = result;
return result;
}
ASSERT(buffer != NULL && size > 0);
Reply* reply = new(std::nothrow) Reply(buffer, size);
if (reply == NULL) {
free(buffer);
@@ -115,8 +115,8 @@ void
WorkQueue::DequeueJob()
{
MutexLocker locker(fQueueLock);
WorkQueueEntry* entry = fQueue.RemoveHead();
locker.Unlock();
ASSERT(entry != NULL);
void* args = entry->fArguments;