nfs4: Reset object_wait_info.events in each iteration
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user