Unlike R5, receive_data() could return an error code under Haiku - this

can now only happen if the thread is killed.
_user_receive_data() will now longer pass B_CAN_INTERRUPT to receive_data(),
but B_KILL_CAN_INTERRUPT - this should fix the problem Stefano experienced
with this function, even if I couldn't reproduce it.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13075 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2005-06-12 11:14:37 +00:00
parent 96b5c85819
commit 183dee22cb
4 changed files with 18 additions and 11 deletions

View File

@ -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)))

View File

@ -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);

View File

@ -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)

View File

@ -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);