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:
parent
96b5c85819
commit
183dee22cb
@ -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)))
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user