_user_xsi_msgrcv():
* Fixed some places that set an error return value but didn't actually return. * Fixed success case return value. The number of bytes received must be returned, not B_OK. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28335 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -76,7 +76,7 @@ struct queued_message : DoublyLinkedListLinkImpl<queued_message> {
|
|||||||
free(message);
|
free(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t copy_to_user_buffer(void *_message, ssize_t _length)
|
ssize_t copy_to_user_buffer(void *_message, ssize_t _length)
|
||||||
{
|
{
|
||||||
if (_length > length)
|
if (_length > length)
|
||||||
_length = length;
|
_length = length;
|
||||||
@@ -85,7 +85,7 @@ struct queued_message : DoublyLinkedListLinkImpl<queued_message> {
|
|||||||
|| user_memcpy((void *)((char *)_message + sizeof(long)), message,
|
|| user_memcpy((void *)((char *)_message + sizeof(long)), message,
|
||||||
_length) != B_OK)
|
_length) != B_OK)
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
return B_OK;
|
return _length;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool initOK;
|
bool initOK;
|
||||||
@@ -753,8 +753,7 @@ _user_xsi_msgrcv(int messageQueueID, void *messagePointer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
queued_message *message = NULL;
|
queued_message *message = NULL;
|
||||||
bool notReceived = true;
|
while (true) {
|
||||||
while (notReceived) {
|
|
||||||
message = messageQueue->Remove(messageType);
|
message = messageQueue->Remove(messageType);
|
||||||
|
|
||||||
if (message == NULL && !(messageFlags & IPC_NOWAIT)) {
|
if (message == NULL && !(messageFlags & IPC_NOWAIT)) {
|
||||||
@@ -776,15 +775,13 @@ _user_xsi_msgrcv(int messageQueueID, void *messagePointer,
|
|||||||
&& sequenceNumber != messageQueue->SequenceNumber())) {
|
&& sequenceNumber != messageQueue->SequenceNumber())) {
|
||||||
TRACE_ERROR(("xsi_msgrcv: message queue id %d (sequence = %ld) "
|
TRACE_ERROR(("xsi_msgrcv: message queue id %d (sequence = %ld) "
|
||||||
"got destroyed\n", messageQueueID, sequenceNumber));
|
"got destroyed\n", messageQueueID, sequenceNumber));
|
||||||
notReceived = false;
|
return EIDRM;
|
||||||
result = EIDRM;
|
|
||||||
} else if (result == B_INTERRUPTED) {
|
} else if (result == B_INTERRUPTED) {
|
||||||
TRACE_ERROR(("xsi_msgrcv: thread %d got interrupted while "
|
TRACE_ERROR(("xsi_msgrcv: thread %d got interrupted while "
|
||||||
"waiting on message queue %d\n",(int)thread->id,
|
"waiting on message queue %d\n",(int)thread->id,
|
||||||
messageQueueID));
|
messageQueueID));
|
||||||
messageQueue->Deque(&queueEntry, /* waitForMessage */ true);
|
messageQueue->Deque(&queueEntry, /* waitForMessage */ true);
|
||||||
notReceived = false;
|
return EINTR;
|
||||||
result = EINTR;
|
|
||||||
} else {
|
} else {
|
||||||
messageQueueLocker.Lock();
|
messageQueueLocker.Lock();
|
||||||
messageQueueHashLocker.Unlock();
|
messageQueueHashLocker.Unlock();
|
||||||
@@ -805,16 +802,16 @@ _user_xsi_msgrcv(int messageQueueID, void *messagePointer,
|
|||||||
return E2BIG;
|
return E2BIG;
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t result
|
ssize_t result
|
||||||
= message->copy_to_user_buffer(messagePointer, messageSize);
|
= message->copy_to_user_buffer(messagePointer, messageSize);
|
||||||
if (result != B_OK) {
|
if (result < 0) {
|
||||||
messageQueue->Insert(message);
|
messageQueue->Insert(message);
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete message;
|
delete message;
|
||||||
TRACE(("xsi_msgrcv: message received correctly\n"));
|
TRACE(("xsi_msgrcv: message received correctly\n"));
|
||||||
notReceived = false;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user