Kernel+LibC: Add exit_thread() syscall.

This commit is contained in:
Andreas Kling 2019-04-29 15:17:20 +02:00
parent 02b69cf06a
commit d07be1087a
Notes: sideshowbarker 2024-07-19 14:32:41 +09:00
6 changed files with 26 additions and 0 deletions

View file

@ -2443,6 +2443,18 @@ int Process::sys$create_thread(int(*entry)(void*), void* argument)
return 0;
}
void Process::sys$exit_thread(int code)
{
InterruptDisabler disabler;
if (&current->process().main_thread() == current) {
sys$exit(code);
return;
}
current->set_state(Thread::State::Dying);
Scheduler::pick_next_and_switch_now();
ASSERT_NOT_REACHED();
}
int Process::sys$gettid()
{
return current->tid();

View file

@ -175,6 +175,7 @@ public:
int sys$setsockopt(const Syscall::SC_setsockopt_params*);
int sys$restore_signal_mask(dword mask);
int sys$create_thread(int(*)(void*), void*);
void sys$exit_thread(int code);
int sys$rename(const char* oldpath, const char* newpath);
int sys$systrace(pid_t);

View file

@ -118,6 +118,11 @@ static dword handle(RegisterDump& regs, dword function, dword arg1, dword arg2,
current->process().sys$exit((int)arg1);
ASSERT_NOT_REACHED();
return 0;
case Syscall::SC_exit_thread:
cli();
current->process().sys$exit_thread((int)arg1);
ASSERT_NOT_REACHED();
break;
case Syscall::SC_chdir:
return current->process().sys$chdir((const char*)arg1);
case Syscall::SC_uname:

View file

@ -100,6 +100,7 @@
__ENUMERATE_SYSCALL(shm_close) \
__ENUMERATE_SYSCALL(ftruncate) \
__ENUMERATE_SYSCALL(systrace) \
__ENUMERATE_SYSCALL(exit_thread) \
namespace Syscall {

View file

@ -451,6 +451,12 @@ int create_thread(int(*entry)(void*), void* argument)
__RETURN_WITH_ERRNO(rc, rc, -1);
}
int exit_thread(int code)
{
int rc = syscall(SC_exit_thread, code);
__RETURN_WITH_ERRNO(rc, rc, -1);
}
int ftruncate(int fd, off_t length)
{
int rc = syscall(SC_ftruncate, fd, length);

View file

@ -18,6 +18,7 @@ int systrace(pid_t);
int gettid();
int donate(int tid);
int create_thread(int(*)(void*), void*);
void exit_thread(int);
int create_shared_buffer(pid_t peer_pid, int, void** buffer);
void* get_shared_buffer(int shared_buffer_id);
int release_shared_buffer(int shared_buffer_id);