00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _RTAI_PRINHER_H
00021 #define _RTAI_PRINHER_H
00022
00023 #include <rtai_schedcore.h>
00024
00025 #ifdef __KERNEL__
00026
00027 #ifdef CONFIG_RTAI_FULL_PRINHER
00028
00029 #define task_owns_sems(task) ((task)->resq.next != &(task)->resq)
00030
00031 static inline void enqueue_resqel(QUEUE *resqel, RT_TASK *resownr)
00032 {
00033 QUEUE *resq;
00034 resqel->next = resq = &resownr->resq;
00035 (resqel->prev = resq->prev)->next = resqel;
00036 resq->prev = resqel;
00037 }
00038
00039 #define enqueue_resqtsk(resownr)
00040
00041 #define RESQEL_TASK ((((QUEUE *)resqel->task)->next)->task)
00042
00043 static inline int _set_task_prio_from_resq(RT_TASK *resownr)
00044 {
00045 int hprio;
00046 RT_TASK *task;
00047 QUEUE *resq, *resqel;
00048 hprio = resownr->base_priority;
00049 resqel = resq = &resownr->resq;
00050 while ((resqel = resqel->next) != resq && (task = RESQEL_TASK) && task->priority < hprio) {
00051 hprio = task->priority;
00052 }
00053 return hprio;
00054 }
00055
00056 static inline int dequeue_resqel_reset_task_priority(QUEUE *resqel, RT_TASK *resownr)
00057 {
00058 int hprio, prio;
00059 QUEUE *q;
00060 (resqel->prev)->next = resqel->next;
00061 (resqel->next)->prev = resqel->prev;
00062 hprio = _set_task_prio_from_resq(resownr);
00063 return renq_ready_task(resownr, ((q = resownr->msg_queue.next) != &resownr->msg_queue && (prio = (q->task)->priority) < hprio) ? prio : hprio);
00064 }
00065
00066 static inline int set_task_prio_from_resq(RT_TASK *resownr)
00067 {
00068 int hprio, prio;
00069 QUEUE *q;
00070 hprio = _set_task_prio_from_resq(resownr);
00071 return renq_ready_task(resownr, ((q = resownr->msg_queue.next) != &resownr->msg_queue && (prio = (q->task)->priority) < hprio) ? prio : hprio);
00072 }
00073
00074 #else
00075
00076 #define task_owns_sems(task) ((task)->owndres)
00077
00078 #define enqueue_resqel(resqel, task) \
00079 do { (task)->owndres++; } while (0)
00080
00081 #define enqueue_resqtsk(task)
00082
00083
00084 static inline int _set_task_prio_from_resq(RT_TASK *resownr)
00085 {
00086 QUEUE *q;
00087 int prio;
00088 return renq_ready_task(resownr, ((q = resownr->msg_queue.next) != &resownr->msg_queue && (prio = (q->task)->priority) < resownr->base_priority) ? prio : resownr->base_priority);
00089 }
00090
00091 static inline int dequeue_resqel_reset_task_priority(QUEUE *resqel, RT_TASK *resownr)
00092 {
00093 if (--resownr->owndres <= 0) {
00094 resownr->owndres = 0;
00095 return _set_task_prio_from_resq(resownr);
00096 }
00097 return 0;
00098 }
00099
00100 static inline int set_task_prio_from_resq(RT_TASK *resownr)
00101 {
00102 return !resownr->owndres ? _set_task_prio_from_resq(resownr) : 0;
00103 }
00104
00105 #endif
00106
00107 #define dequeue_resqel_reset_current_priority(resqel, rt_current) \
00108 dequeue_resqel_reset_task_priority(resqel, rt_current)
00109
00110 #define set_current_prio_from_resq(rt_current) \
00111 set_task_prio_from_resq(rt_current)
00112
00113 #define task_owns_msgs(task) ((task)->msg_queue.next != &(task)->msg_queue)
00114 #define task_owns_res(task) (task_owns_sems(task) || task_owns_msgs(task))
00115
00116 #endif
00117
00118 #endif