From: Matthias Kruk Date: Sat, 25 Jan 2020 07:46:31 +0000 (+0900) Subject: Add functions to raise sleeping processes and tasks X-Git-Url: https://git.corax.cc/?a=commitdiff_plain;h=0f9b36c928340bfd1f5899e385d0ea893a4cdb71;p=corax Add functions to raise sleeping processes and tasks - Implement sched_task_raise() - Implement sched_raise() --- diff --git a/kernel/core/sched.c b/kernel/core/sched.c index 1d73477..549097e 100644 --- a/kernel/core/sched.c +++ b/kernel/core/sched.c @@ -111,6 +111,12 @@ void sched_tick(void) #if FEATURE(DEBUG_SCHED) dbg_printf("Returned to task %p\n", task_get_current()); #endif /* FEATURE(DEBUG_SCHED) */ + cur_task = task_get_current(); + + dbg_printf("Returned to task %p [state=%u]\n", cur_task, cur_task->t_state); + /* the task state may have been set to TASK_STATE_SIGNAL */ + cur_task->t_state = TASK_STATE_RUNNING; + } else { dbg_printf("This should not have happened\n"); } @@ -223,6 +229,52 @@ int sched_signal(pid_t pid) return(ret_val); } +static int __sched_raise_all(process_t *proc, task_t *task, void *data) +{ + return(sched_task_raise(task)); +} + +int sched_raise(pid_t pid) +{ + process_t *proc; + int ret_val; + + ret_val = -ENOENT; + proc = process_lookup(pid); + + if(proc) { + ret_val = process_task_foreach(proc, __sched_raise_all, NULL); + } + + return(ret_val); +} + +int sched_task_raise(task_t *t) +{ + int ret_val; + + ret_val = -EINVAL; + + if(t) { + ret_val = -EBADFD; + + task_lock(t); + + if(t->t_state == TASK_STATE_WAITING) { + ret_val = _unq(&_waitq, t); + + if(!ret_val) { + _nq(&_readyq, t); + t->t_state = TASK_STATE_SIGNAL; + } + } + + task_unlock(t); + } + + return(ret_val); +} + int sched_task_suspend(task_t *t) { task_t *ctask; diff --git a/kernel/include/arch.h b/kernel/include/arch.h index 3a2aed0..9707be8 100644 --- a/kernel/include/arch.h +++ b/kernel/include/arch.h @@ -28,7 +28,7 @@ #define TASK_STATE_BROKEN 4 #define TASK_STATE_EXIT 5 #define TASK_STATE_FORKED 6 - +#define TASK_STATE_SIGNAL 7 #define EXC_VECTOR0 0x00 #define INT_VECTOR0 0x40 #define SYS_VECTOR0 SYS_VECTOR_CORAX diff --git a/kernel/include/sched.h b/kernel/include/sched.h index 65efeb9..7efa399 100644 --- a/kernel/include/sched.h +++ b/kernel/include/sched.h @@ -5,9 +5,11 @@ void sched_tick(void); void sched_wait(pid_t); +int sched_raise(pid_t); int sched_enqueue(task_t*); int sched_dequeue(task_t*); int sched_signal(pid_t); +int sched_task_raise(task_t*); int sched_task_suspend(task_t*); int sched_task_resume(task_t*);