Files
jsix_import/src/kernel/syscalls/thread.cpp
Justin C. Miller e08e00790f [kernel] Give processes and threads self handles
It was not consistent how processes got handles to themselves or their
threads, ending up with double entries. Now make such handles automatic
and expose them with new self_handle() methods.
2021-01-06 23:14:39 -08:00

58 lines
1.2 KiB
C++

#include "j6/errors.h"
#include "j6/types.h"
#include "log.h"
#include "objects/process.h"
#include "objects/thread.h"
namespace syscalls {
j6_status_t
thread_create(void *rip, j6_handle_t *handle)
{
thread &parent = thread::current();
process &p = parent.parent();
thread *child = p.create_thread();
child->add_thunk_user(reinterpret_cast<uintptr_t>(rip));
*handle = p.self_handle();
child->clear_state(thread::state::loading);
child->set_state(thread::state::ready);
log::debug(logs::syscall, "Thread %llx spawned new thread %llx, handle %d",
parent.koid(), child->koid(), *handle);
return j6_status_ok;
}
j6_status_t
thread_exit(int64_t status)
{
thread &th = thread::current();
log::debug(logs::syscall, "Thread %llx exiting with code %d", th.koid(), status);
th.exit(status);
log::error(logs::syscall, "returned to exit syscall");
return j6_err_unexpected;
}
j6_status_t
thread_pause()
{
thread &th = thread::current();
th.wait_on_signals(&th, -1ull);
return j6_status_ok;
}
j6_status_t
thread_sleep(uint64_t til)
{
thread &th = thread::current();
log::debug(logs::syscall, "Thread %llx sleeping until %llu", th.koid(), til);
th.wait_on_time(til);
return j6_status_ok;
}
} // namespace syscalls