From e36469b8e4a7157023018a54878f066911b96224 Mon Sep 17 00:00:00 2001 From: Matthias Kruk Date: Mon, 25 Nov 2019 15:08:43 +0900 Subject: [PATCH] Implement sched_task_suspend() function --- kernel/core/sched.c | 28 ++++++++++++++++++++++++++++ kernel/core/sched.h | 1 + 2 files changed, 29 insertions(+) diff --git a/kernel/core/sched.c b/kernel/core/sched.c index e0e1f4f..00f458f 100644 --- a/kernel/core/sched.c +++ b/kernel/core/sched.c @@ -222,3 +222,31 @@ int sched_signal(pid_t pid) return(ret_val); } + +int sched_task_suspend(task_t *t) +{ + int ret_val; + + ret_val = -EALREADY; + + if(!t) { + t = task_get_current(); + } + + task_lock(t); + + if(t->t_state != TASK_STATE_WAITING) { + t->t_state = TASK_STATE_WAITING; + + /* remove the task from the ready queue and put it on the wait queue */ + ret_val = _unq(&_readyq, t); + + if(ret_val >= 0) { + _nq(&_waitq, t); + } + } + + task_unlock(t); + + return(ret_val); +} diff --git a/kernel/core/sched.h b/kernel/core/sched.h index a37208f..4f54bea 100644 --- a/kernel/core/sched.h +++ b/kernel/core/sched.h @@ -8,5 +8,6 @@ void sched_wait(pid_t); int sched_enqueue(task_t*); int sched_dequeue(task_t*); int sched_signal(pid_t); +int sched_task_suspend(task_t*); #endif /* __CORE_SCHED_H */ -- 2.47.3