diff --git a/headers/os/kernel/OS.h b/headers/os/kernel/OS.h index 48543940c4..b520be78c0 100644 --- a/headers/os/kernel/OS.h +++ b/headers/os/kernel/OS.h @@ -320,8 +320,9 @@ find_thread(const char *name) { extern thread_id find_thread(const char *name); #endif -extern status_t send_data(thread_id thread, int32 code, const void *buffer, size_t buffer_size); -extern status_t receive_data(thread_id *sender, void *buffer, size_t buffer_size); +extern status_t send_data(thread_id thread, int32 code, const void *buffer, + size_t bufferSize); +extern int32 receive_data(thread_id *sender, void *buffer, size_t bufferSize); extern bool has_data(thread_id thread); extern status_t snooze(bigtime_t amount); @@ -330,7 +331,8 @@ extern status_t snooze_until(bigtime_t time, int timeBase); /* system private, use macros instead */ extern status_t _get_thread_info(thread_id id, thread_info *info, size_t size); -extern status_t _get_next_thread_info(team_id team, int32 *cookie, thread_info *info, size_t size); +extern status_t _get_next_thread_info(team_id team, int32 *cookie, + thread_info *info, size_t size); #define get_thread_info(id, info) \ _get_thread_info((id), (info), sizeof(*(info))) diff --git a/headers/private/kernel/syscalls.h b/headers/private/kernel/syscalls.h index d48fb04661..f2de354b01 100644 --- a/headers/private/kernel/syscalls.h +++ b/headers/private/kernel/syscalls.h @@ -89,7 +89,7 @@ extern void _kern_exit_thread(status_t returnValue); extern status_t _kern_wait_for_thread(thread_id thread, status_t *_returnCode); extern bool _kern_has_data(thread_id thread); extern status_t _kern_send_data(thread_id thread, int32 code, const void *buffer, size_t bufferSize); -extern status_t _kern_receive_data(thread_id *_sender, void *buffer, size_t bufferSize); +extern int32 _kern_receive_data(thread_id *_sender, void *buffer, size_t bufferSize); extern int64 _kern_restore_signal_frame(); extern status_t _kern_get_thread_info(thread_id id, thread_info *info); diff --git a/src/system/kernel/thread.c b/src/system/kernel/thread.c index cfaee85d64..b28940cfe3 100644 --- a/src/system/kernel/thread.c +++ b/src/system/kernel/thread.c @@ -1418,7 +1418,7 @@ send_data(thread_id thread, int32 code, const void *buffer, size_t bufferSize) } -static status_t +static int32 receive_data_etc(thread_id *_sender, void *buffer, size_t bufferSize, int32 flags) { struct thread *thread = thread_get_current_thread(); @@ -1427,8 +1427,13 @@ receive_data_etc(thread_id *_sender, void *buffer, size_t bufferSize, int32 flag int32 code; status = acquire_sem_etc(thread->msg.read_sem, 1, flags, 0); - if (status < B_OK) + if (status < B_OK) { + // Actually, we're not supposed to return error codes + // but since the only reason this can fail is that we + // were killed, it's probably okay to do so (but also + // meaningless). return status; + } if (buffer != NULL && bufferSize != 0) { size = min(bufferSize, thread->msg.size); @@ -1450,7 +1455,7 @@ receive_data_etc(thread_id *_sender, void *buffer, size_t bufferSize, int32 flag } -status_t +int32 receive_data(thread_id *sender, void *buffer, size_t bufferSize) { return receive_data_etc(sender, buffer, bufferSize, 0); @@ -2015,7 +2020,7 @@ _user_send_data(thread_id thread, int32 code, const void *buffer, size_t bufferS if (!IS_USER_ADDRESS(buffer)) return B_BAD_ADDRESS; - return send_data_etc(thread, code, buffer, bufferSize, B_CAN_INTERRUPT); + return send_data_etc(thread, code, buffer, bufferSize, B_KILL_CAN_INTERRUPT); // supports userland buffers } @@ -2030,7 +2035,7 @@ _user_receive_data(thread_id *_userSender, void *buffer, size_t bufferSize) || !IS_USER_ADDRESS(buffer)) return B_BAD_ADDRESS; - code = receive_data_etc(&sender, buffer, bufferSize, B_CAN_INTERRUPT); + code = receive_data_etc(&sender, buffer, bufferSize, B_KILL_CAN_INTERRUPT); // supports userland buffers if (user_memcpy(_userSender, &sender, sizeof(thread_id)) < B_OK) diff --git a/src/system/libroot/os/thread.c b/src/system/libroot/os/thread.c index 3fc8076710..91dbc14ae8 100644 --- a/src/system/libroot/os/thread.c +++ b/src/system/libroot/os/thread.c @@ -1,5 +1,5 @@ /* - * Copyright 2002-2004, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Copyright 2002-2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved. * Distributed under the terms of the MIT License. */ @@ -170,7 +170,7 @@ send_data(thread_id thread, int32 code, const void *buffer, size_t bufferSize) } -status_t +int32 receive_data(thread_id *_sender, void *buffer, size_t bufferSize) { return _kern_receive_data(_sender, buffer, bufferSize);