base/include/rtai_prinher.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2006-2008 Paolo Mantegazza <mantegazza@aero.polimi.it>
00003  *
00004  * This program is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU General Public License as
00006  * published by the Free Software Foundation; either version 2 of the
00007  * License, or (at your option) any later version.
00008  *
00009  * This program is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  * GNU General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU General Public License
00015  * along with this program; if not, write to the Free Software
00016  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
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 /* !CONFIG_RTAI_FULL_PRINHER */
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 //  do { (task)->owndres += RPCINC; } while (0)
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 /* CONFIG_RTAI_FULL_PRINHER */
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 /* __KERNEL__ */
00117 
00118 #endif /* !_RTAI_PRINHER_H */

Generated on Tue Feb 2 17:46:05 2010 for RTAI API by  doxygen 1.4.7