scheduler: dequeue takes a state argument and releases a threadexit lock

This commit is contained in:
Matheus
2022-12-31 19:52:19 -03:00
parent bbcda47dcd
commit 814ee1f69a
3 changed files with 10 additions and 8 deletions
+2 -1
View File
@@ -67,6 +67,7 @@ typedef struct _proc_t{
dirnode_t* cwd;
event_t childevent;
mode_t umask;
int threadexitlock;
} proc_t;
@@ -76,7 +77,7 @@ typedef struct{
int lock;
} sched_queue;
void sched_dequeue();
void sched_dequeue(long state);
proc_t* sched_getinit();
thread_t* sched_newuthread(void* ip, size_t stacksize, void* stack, proc_t* proc, bool run, int prio);
thread_t* sched_newkthread(void* ip, size_t stacksize, bool run, int prio);
+7 -6
View File
@@ -363,7 +363,7 @@ void sched_eventsignal(event_t* event, thread_t* thread){
spinlock_release(&queues[thread->priority].lock);
}
void sched_dequeue(){
void sched_dequeue(long state){
timer_stop();
arch_interrupt_disable();
@@ -377,17 +377,18 @@ void sched_dequeue(){
arch_getcls()->thread = thread;
vmm_switchcontext(thread->ctx);
thread->state = state;
if(state == THREAD_STATE_DEAD)
spinlock_release(&thread->proc->threadexitlock);
switch_thread(thread);
}
__attribute__((noreturn)) int sched_die(){
arch_getcls()->thread->state = THREAD_STATE_DEAD;
sched_dequeue();
sched_dequeue(THREAD_STATE_DEAD);
}
void sched_threadexitcheck(){
+1 -1
View File
@@ -75,7 +75,7 @@ void syscall_exit(int status){
spinlock_release(&proc->lock);
spinlock_release(&init->lock);
sched_dequeue();
sched_die();
__builtin_unreachable();