]> git.corax.cc Git - corax/commitdiff
Add functions to raise sleeping processes and tasks
authorMatthias Kruk <m@m10k.eu>
Sat, 25 Jan 2020 07:46:31 +0000 (16:46 +0900)
committerMatthias Kruk <m@m10k.eu>
Sat, 25 Jan 2020 07:46:31 +0000 (16:46 +0900)
 - Implement sched_task_raise()
 - Implement sched_raise()

kernel/core/sched.c
kernel/include/arch.h
kernel/include/sched.h

index 1d73477cd6f07196e024faa80f487987dbaffe9e..549097e644749f05d68e581db4b7b0e16733c73c 100644 (file)
@@ -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;
index 3a2aed0a69a4be5a6a0e1e6aeca7bb3db4355e3a..9707be80d7db38f85ad6a9f4d82cd17c6216a654 100644 (file)
@@ -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
index 65efeb9bbc823a32fefdc3d4348a783f4c292a4a..7efa3997a1564f0f4360e06a972959bbc6c4fa0a 100644 (file)
@@ -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*);