#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");
}
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;
#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
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*);