_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:
Ingo Weinhold
2008-10-26 12:36:24 +00:00
parent 4534a38441
commit e360230ecd
+8 -11
View File
@@ -76,7 +76,7 @@ struct queued_message : DoublyLinkedListLinkImpl<queued_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)
_length = length;
@@ -85,7 +85,7 @@ struct queued_message : DoublyLinkedListLinkImpl<queued_message> {
|| user_memcpy((void *)((char *)_message + sizeof(long)), message,
_length) != B_OK)
return B_ERROR;
return B_OK;
return _length;
}
bool initOK;
@@ -753,8 +753,7 @@ _user_xsi_msgrcv(int messageQueueID, void *messagePointer,
}
queued_message *message = NULL;
bool notReceived = true;
while (notReceived) {
while (true) {
message = messageQueue->Remove(messageType);
if (message == NULL && !(messageFlags & IPC_NOWAIT)) {
@@ -776,15 +775,13 @@ _user_xsi_msgrcv(int messageQueueID, void *messagePointer,
&& sequenceNumber != messageQueue->SequenceNumber())) {
TRACE_ERROR(("xsi_msgrcv: message queue id %d (sequence = %ld) "
"got destroyed\n", messageQueueID, sequenceNumber));
notReceived = false;
result = EIDRM;
return EIDRM;
} else if (result == B_INTERRUPTED) {
TRACE_ERROR(("xsi_msgrcv: thread %d got interrupted while "
"waiting on message queue %d\n",(int)thread->id,
messageQueueID));
messageQueue->Deque(&queueEntry, /* waitForMessage */ true);
notReceived = false;
result = EINTR;
return EINTR;
} else {
messageQueueLocker.Lock();
messageQueueHashLocker.Unlock();
@@ -805,16 +802,16 @@ _user_xsi_msgrcv(int messageQueueID, void *messagePointer,
return E2BIG;
}
status_t result
ssize_t result
= message->copy_to_user_buffer(messagePointer, messageSize);
if (result != B_OK) {
if (result < 0) {
messageQueue->Insert(message);
return B_BAD_ADDRESS;
}
delete message;
TRACE(("xsi_msgrcv: message received correctly\n"));
notReceived = false;
return result;
}
}