diff --git a/src/system/kernel/thread.cpp b/src/system/kernel/thread.cpp index 470f4d71e4..01a14442a3 100644 --- a/src/system/kernel/thread.cpp +++ b/src/system/kernel/thread.cpp @@ -3041,20 +3041,40 @@ receive_data(thread_id *sender, void *buffer, size_t bufferSize) } -bool -has_data(thread_id thread) +static bool +thread_has_data(thread_id id, bool kernel) { - // TODO: The thread argument is ignored. - int32 count; + Thread* currentThread = thread_get_current_thread(); + Thread* thread; + BReference threadReference; + if (id == currentThread->id) { + thread = currentThread; + } else { + thread = Thread::Get(id); + if (thread == NULL) + return false; - if (get_sem_count(thread_get_current_thread()->msg.read_sem, - &count) != B_OK) + threadReference.SetTo(thread, true); + } + + if (!kernel && thread->team != currentThread->team) + return false; + + int32 count; + if (get_sem_count(thread->msg.read_sem, &count) != B_OK) return false; return count == 0 ? false : true; } +bool +has_data(thread_id thread) +{ + return thread_has_data(thread, true); +} + + status_t _get_thread_info(thread_id id, thread_info *info, size_t size) { @@ -3581,7 +3601,7 @@ _user_wait_for_thread(thread_id id, status_t *userReturnCode) bool _user_has_data(thread_id thread) { - return has_data(thread); + return thread_has_data(thread, false); }