mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 20:27:45 +00:00
Kernel+LibC: Add exit_thread() syscall.
This commit is contained in:
parent
02b69cf06a
commit
d07be1087a
6 changed files with 26 additions and 0 deletions
|
@ -2443,6 +2443,18 @@ int Process::sys$create_thread(int(*entry)(void*), void* argument)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Process::sys$exit_thread(int code)
|
||||||
|
{
|
||||||
|
InterruptDisabler disabler;
|
||||||
|
if (¤t->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()
|
int Process::sys$gettid()
|
||||||
{
|
{
|
||||||
return current->tid();
|
return current->tid();
|
||||||
|
|
|
@ -175,6 +175,7 @@ public:
|
||||||
int sys$setsockopt(const Syscall::SC_setsockopt_params*);
|
int sys$setsockopt(const Syscall::SC_setsockopt_params*);
|
||||||
int sys$restore_signal_mask(dword mask);
|
int sys$restore_signal_mask(dword mask);
|
||||||
int sys$create_thread(int(*)(void*), void*);
|
int sys$create_thread(int(*)(void*), void*);
|
||||||
|
void sys$exit_thread(int code);
|
||||||
int sys$rename(const char* oldpath, const char* newpath);
|
int sys$rename(const char* oldpath, const char* newpath);
|
||||||
int sys$systrace(pid_t);
|
int sys$systrace(pid_t);
|
||||||
|
|
||||||
|
|
|
@ -118,6 +118,11 @@ static dword handle(RegisterDump& regs, dword function, dword arg1, dword arg2,
|
||||||
current->process().sys$exit((int)arg1);
|
current->process().sys$exit((int)arg1);
|
||||||
ASSERT_NOT_REACHED();
|
ASSERT_NOT_REACHED();
|
||||||
return 0;
|
return 0;
|
||||||
|
case Syscall::SC_exit_thread:
|
||||||
|
cli();
|
||||||
|
current->process().sys$exit_thread((int)arg1);
|
||||||
|
ASSERT_NOT_REACHED();
|
||||||
|
break;
|
||||||
case Syscall::SC_chdir:
|
case Syscall::SC_chdir:
|
||||||
return current->process().sys$chdir((const char*)arg1);
|
return current->process().sys$chdir((const char*)arg1);
|
||||||
case Syscall::SC_uname:
|
case Syscall::SC_uname:
|
||||||
|
|
|
@ -100,6 +100,7 @@
|
||||||
__ENUMERATE_SYSCALL(shm_close) \
|
__ENUMERATE_SYSCALL(shm_close) \
|
||||||
__ENUMERATE_SYSCALL(ftruncate) \
|
__ENUMERATE_SYSCALL(ftruncate) \
|
||||||
__ENUMERATE_SYSCALL(systrace) \
|
__ENUMERATE_SYSCALL(systrace) \
|
||||||
|
__ENUMERATE_SYSCALL(exit_thread) \
|
||||||
|
|
||||||
|
|
||||||
namespace Syscall {
|
namespace Syscall {
|
||||||
|
|
|
@ -451,6 +451,12 @@ int create_thread(int(*entry)(void*), void* argument)
|
||||||
__RETURN_WITH_ERRNO(rc, rc, -1);
|
__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 ftruncate(int fd, off_t length)
|
||||||
{
|
{
|
||||||
int rc = syscall(SC_ftruncate, fd, length);
|
int rc = syscall(SC_ftruncate, fd, length);
|
||||||
|
|
|
@ -18,6 +18,7 @@ int systrace(pid_t);
|
||||||
int gettid();
|
int gettid();
|
||||||
int donate(int tid);
|
int donate(int tid);
|
||||||
int create_thread(int(*)(void*), void*);
|
int create_thread(int(*)(void*), void*);
|
||||||
|
void exit_thread(int);
|
||||||
int create_shared_buffer(pid_t peer_pid, int, void** buffer);
|
int create_shared_buffer(pid_t peer_pid, int, void** buffer);
|
||||||
void* get_shared_buffer(int shared_buffer_id);
|
void* get_shared_buffer(int shared_buffer_id);
|
||||||
int release_shared_buffer(int shared_buffer_id);
|
int release_shared_buffer(int shared_buffer_id);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue