wait_for_thread_etc: expose as syscall/make public.

* This will be needed for the following commit that implements
  `pthread_tryjoin_np` and `pthread_timedjoin_np`.

Change-Id: Idccb1aa588d6d10825294d14925d9bd046b65f19
Reviewed-on: https://review.haiku-os.org/c/haiku/+/5098
Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org>
Reviewed-by: Jérôme Duval <jerome.duval@gmail.com>
Reviewed-by: Adrien Destugues <pulkomandy@gmail.com>
This commit is contained in:
Jessica Hamilton 2022-03-11 23:49:53 +00:00 committed by waddlesplash
parent f123acc1d9
commit 914b10c17e
7 changed files with 37 additions and 2 deletions

View File

@ -341,6 +341,8 @@ extern status_t rename_thread(thread_id thread, const char *newName);
extern status_t set_thread_priority(thread_id thread, int32 newPriority);
extern void exit_thread(status_t status);
extern status_t wait_for_thread(thread_id thread, status_t *returnValue);
extern status_t wait_for_thread_etc(thread_id id, uint32 flags, bigtime_t timeout,
status_t *_returnCode);
extern status_t on_exit_thread(void (*callback)(void *), void *data);
extern thread_id find_thread(const char *name);

View File

@ -127,8 +127,6 @@ thread_id thread_create_thread(const ThreadCreationAttributes& attributes,
thread_id spawn_kernel_thread_etc(thread_func, const char *name, int32 priority,
void *args, team_id team);
status_t wait_for_thread_etc(thread_id id, uint32 flags, bigtime_t timeout,
status_t *_returnCode);
status_t select_thread(int32 object, struct select_info *info, bool kernel);
status_t deselect_thread(int32 object, struct select_info *info, bool kernel);
@ -147,6 +145,8 @@ status_t _user_resume_thread(thread_id thread);
status_t _user_rename_thread(thread_id thread, const char *name);
thread_id _user_spawn_thread(struct thread_creation_attributes* attributes);
status_t _user_wait_for_thread(thread_id id, status_t *_returnCode);
status_t _user_wait_for_thread_etc(thread_id id, uint32 flags, bigtime_t timeout,
status_t *_returnCode);
status_t _user_snooze_etc(bigtime_t timeout, int timebase, uint32 flags,
bigtime_t* _remainingTime);
status_t _user_kill_thread(thread_id thread);

View File

@ -167,6 +167,8 @@ extern status_t _kern_cancel_thread(thread_id threadID,
extern void _kern_thread_yield(void);
extern status_t _kern_wait_for_thread(thread_id thread,
status_t *_returnCode);
extern status_t _kern_wait_for_thread_etc(thread_id thread, uint32 flags,
bigtime_t timeout, 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);

View File

@ -3676,6 +3676,28 @@ _user_wait_for_thread(thread_id id, status_t *userReturnCode)
}
status_t
_user_wait_for_thread_etc(thread_id id, uint32 flags, bigtime_t timeout, status_t *userReturnCode)
{
status_t returnCode;
status_t status;
if (userReturnCode != NULL && !IS_USER_ADDRESS(userReturnCode))
return B_BAD_ADDRESS;
syscall_restart_handle_timeout_pre(flags, timeout);
status = wait_for_thread_etc(id, flags | B_CAN_INTERRUPT, timeout, &returnCode);
if (status == B_OK && userReturnCode != NULL
&& user_memcpy(userReturnCode, &returnCode, sizeof(status_t)) < B_OK) {
return B_BAD_ADDRESS;
}
return syscall_restart_handle_timeout_post(status, timeout);
}
bool
_user_has_data(thread_id thread)
{

View File

@ -183,6 +183,13 @@ wait_for_thread(thread_id thread, status_t *_returnCode)
}
status_t
wait_for_thread_etc(thread_id thread, uint32 flags, bigtime_t timeout, status_t *_returnCode)
{
return _kern_wait_for_thread_etc(thread, flags, timeout, _returnCode);
}
status_t
on_exit_thread(void (*callback)(void *), void *data)
{

View File

@ -2894,6 +2894,7 @@ void wait_for_debugger() {}
void wait_for_objects() {}
void wait_for_objects_etc() {}
void wait_for_thread() {}
void wait_for_thread_etc() {}
void waitid() {}
void waitpid() {}
void wcpcpy() {}

View File

@ -2841,6 +2841,7 @@ void wait_for_debugger() {}
void wait_for_objects() {}
void wait_for_objects_etc() {}
void wait_for_thread() {}
void wait_for_thread_etc() {}
void waitid() {}
void waitpid() {}
void wcpcpy() {}