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; object[1].events = B_EVENT_READ;
do { do {
object[0].events = B_EVENT_ACQUIRE_SEMAPHORE;
object[1].events = B_EVENT_READ;
result = wait_for_objects(object, 2); result = wait_for_objects(object, 2);
if (result < B_OK if (result < B_OK
|| (object[0].events & B_EVENT_ACQUIRE_SEMAPHORE) != 0) { || (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. // There is only one listener thread per connection. No need to lock.
uint32 received = 0; uint32 received = 0;
do { do {
result = recv(fSocket, &record_size + received, result = recv(fSocket, ((uint8*)&record_size) + received,
sizeof(record_size) - received, 0); sizeof(record_size) - received, 0);
received += result; received += result;
} while (result > 0 && received < sizeof(record_size)); } while (result > 0 && received < sizeof(record_size));
@@ -397,6 +400,8 @@ ConnectionStream::Receive(void** _buffer, uint32* _size)
} }
record_size = ntohl(record_size); record_size = ntohl(record_size);
ASSERT(record_size > 0);
last_one = static_cast<int32>(record_size) < 0; last_one = static_cast<int32>(record_size) < 0;
record_size &= LAST_FRAGMENT - 1; record_size &= LAST_FRAGMENT - 1;
@@ -417,6 +422,9 @@ ConnectionStream::Receive(void** _buffer, uint32* _size)
result = errno; result = errno;
free(buffer); free(buffer);
return result; return result;
} else if (result == 0) {
free(buffer);
return ECONNABORTED;
} }
size += record_size; size += record_size;
@@ -453,6 +461,9 @@ ConnectionPacket::Receive(void** _buffer, uint32* _size)
object[1].events = B_EVENT_READ; object[1].events = B_EVENT_READ;
do { do {
object[0].events = B_EVENT_ACQUIRE_SEMAPHORE;
object[1].events = B_EVENT_READ;
result = wait_for_objects(object, 2); result = wait_for_objects(object, 2);
if (result < B_OK if (result < B_OK
|| (object[0].events & B_EVENT_ACQUIRE_SEMAPHORE) != 0) { || (object[0].events & B_EVENT_ACQUIRE_SEMAPHORE) != 0) {
@@ -719,6 +730,9 @@ ConnectionListener::AcceptConnection(Connection** connection)
object[1].events = B_EVENT_READ; object[1].events = B_EVENT_READ;
do { do {
object[0].events = B_EVENT_ACQUIRE_SEMAPHORE;
object[1].events = B_EVENT_READ;
status_t result = wait_for_objects(object, 2); status_t result = wait_for_objects(object, 2);
if (result < B_OK if (result < B_OK
|| (object[0].events & B_EVENT_ACQUIRE_SEMAPHORE) != 0) { || (object[0].events & B_EVENT_ACQUIRE_SEMAPHORE) != 0) {
@@ -265,7 +265,7 @@ Server::_Listener()
{ {
status_t result; status_t result;
uint32 size; uint32 size;
void* buffer; void* buffer = NULL;
while (!fThreadCancel) { while (!fThreadCancel) {
result = fConnection->Receive(&buffer, &size); result = fConnection->Receive(&buffer, &size);
@@ -275,7 +275,8 @@ Server::_Listener()
fThreadError = result; fThreadError = result;
return result; return result;
} }
ASSERT(buffer != NULL && size > 0);
Reply* reply = new(std::nothrow) Reply(buffer, size); Reply* reply = new(std::nothrow) Reply(buffer, size);
if (reply == NULL) { if (reply == NULL) {
free(buffer); free(buffer);
@@ -115,8 +115,8 @@ void
WorkQueue::DequeueJob() WorkQueue::DequeueJob()
{ {
MutexLocker locker(fQueueLock); MutexLocker locker(fQueueLock);
WorkQueueEntry* entry = fQueue.RemoveHead(); WorkQueueEntry* entry = fQueue.RemoveHead();
locker.Unlock();
ASSERT(entry != NULL); ASSERT(entry != NULL);
void* args = entry->fArguments; void* args = entry->fArguments;