_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); 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;
} }
} }