X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fkern%2Fproc_p.h;h=a5c7dbe3120ef6ff134039ecd4adca68c63e52f0;hb=ce455a07c3f2d0055f3b7971e91fe5a6e3903395;hp=d99d5fc187d6090eea283304d43c3a49e881d1e5;hpb=b0ba66e728f0885d53e7836898ea60902c818aa8;p=bertos.git diff --git a/bertos/kern/proc_p.h b/bertos/kern/proc_p.h index d99d5fc1..a5c7dbe3 100644 --- a/bertos/kern/proc_p.h +++ b/bertos/kern/proc_p.h @@ -40,54 +40,19 @@ #ifndef KERN_PROC_P_H #define KERN_PROC_P_H -#include "cfg/cfg_kern.h" +#include "cfg/cfg_proc.h" +#include "cfg/cfg_monitor.h" + #include #include /* for cpu_stack_t */ - -#include +#include // IRQ_ASSERT_DISABLED() #if CONFIG_KERN_PREEMPT #include // XXX #endif -typedef struct Process -{ -#if CONFIG_KERN_PRI - PriNode link; /**< Link Process into scheduler lists */ -#else - Node link; /**< Link Process into scheduler lists */ -#endif - cpu_stack_t *stack; /**< Per-process SP */ - iptr_t user_data; /**< Custom data passed to the process */ - -#if CONFIG_KERN_SIGNALS - sigmask_t sig_wait; /**< Signals the process is waiting for */ - sigmask_t sig_recv; /**< Received signals */ -#endif - -#if CONFIG_KERN_HEAP - uint16_t flags; /**< Flags */ -#endif - -#if CONFIG_KERN_HEAP | CONFIG_KERN_MONITOR | (ARCH & ARCH_EMUL) - cpu_stack_t *stack_base; /**< Base of process stack */ - size_t stack_size; /**< Size of process stack */ -#endif - -#if CONFIG_KERN_PREEMPT - ucontext_t context; -#endif - -#if CONFIG_KERN_MONITOR - struct ProcMonitor - { - Node link; - const char *name; - } monitor; -#endif - -} Process; +#include // struct Process /** @@ -129,6 +94,41 @@ extern REGISTER List ProcReadyList; SCHED_ENQUEUE_INTERNAL(proc); \ } while (0) +#if CONFIG_KERN_PRI +/** + * Changes the priority of an already enqueued process. + * + * Searches and removes the process from the ready list, then uses LIST_ENQUEUE(() + * to insert again to fix priority. + * + * No action is performed for processes that aren't in the ready list, eg. in semaphore queues. + * + * \note Performance could be improved with a different implementation of priority list. + */ +INLINE void sched_reenqueue(struct Process *proc) +{ + IRQ_ASSERT_DISABLED(); + LIST_ASSERT_VALID(&ProcReadyList); + Node *n; + PriNode *pos = NULL; + FOREACH_NODE(n, &ProcReadyList) + { + if (n == &proc->link.link) + { + pos = (PriNode *)n; + break; + } + } + + // only remove and enqueue again if process is already in the ready list + // otherwise leave it alone + if (pos) + { + REMOVE(&proc->link.link); + LIST_ENQUEUE(&ProcReadyList, &proc->link); + } +} +#endif //CONFIG_KERN_PRI /// Schedule another process *without* adding the current one to the ready list. void proc_switch(void);