From 6b22b2c44164b3c8e0fbad340705eec68a013515 Mon Sep 17 00:00:00 2001 From: patacongo Date: Sun, 8 Mar 2009 23:33:41 +0000 Subject: [PATCH] Add support for priority inheritance git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@1581 42af7a65-404d-4744-a932-0658087f49c3 --- arch/arm/src/common/up_reprioritizertr.c | 24 +++++++++-- arch/pjrc-8051/src/up_reprioritizertr.c | 54 +++++++++++++++--------- arch/sh/src/common/up_reprioritizertr.c | 24 +++++++++-- arch/sim/src/up_reprioritizertr.c | 24 +++++++++-- arch/z16/src/common/up_reprioritizertr.c | 24 +++++++++-- arch/z80/src/common/up_reprioritizertr.c | 24 +++++++++-- 6 files changed, 135 insertions(+), 39 deletions(-) diff --git a/arch/arm/src/common/up_reprioritizertr.c b/arch/arm/src/common/up_reprioritizertr.c index b802f2e848..edc2f9e1f3 100644 --- a/arch/arm/src/common/up_reprioritizertr.c +++ b/arch/arm/src/common/up_reprioritizertr.c @@ -1,7 +1,7 @@ /**************************************************************************** * arch/arm/src/common/up_reprioritizertr.c * - * Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved. + * Copyright (C) 2007-2009 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without @@ -85,14 +85,27 @@ void up_reprioritize_rtr(_TCB *tcb, ubyte priority) { /* Verify that the caller is sane */ - if (tcb->task_state < FIRST_READY_TO_RUN_STATE || - tcb->task_state > LAST_READY_TO_RUN_STATE || - priority < SCHED_PRIORITY_MIN || +#if CONFIG_DEBUG /* We only check parameters when debug is enabled */ + if (priority < SCHED_PRIORITY_MIN || priority > SCHED_PRIORITY_MAX) { PANIC(OSERR_BADREPRIORITIZESTATE); } else +#endif + if (tcb->task_state < FIRST_READY_TO_RUN_STATE || + tcb->task_state > LAST_READY_TO_RUN_STATE) + { + /* This is a hack and needs to be fixed.. here some taks is reprioritizing + * another task that is not running. Here we just set the priority of + * the task -- BUT some of the other states are also prioritized and the + * waiting task should also be re-ordered in the prioritized wiating list. + * As a consequence, the other task is still waiting at the lower priority. + */ + + tcb->sched_priority = priority; + } + else { _TCB *rtcb = (_TCB*)g_readytorun.head; boolean switch_needed; @@ -109,6 +122,9 @@ void up_reprioritize_rtr(_TCB *tcb, ubyte priority) /* Setup up the new task priority */ tcb->sched_priority = (ubyte)priority; +#ifdef CONFIG_PRIORITY_INHERITANCE + tcb->base_priority = (ubyte)priority; +#endif /* Return the task to the specified blocked task list. * sched_addreadytorun will return TRUE if the task was diff --git a/arch/pjrc-8051/src/up_reprioritizertr.c b/arch/pjrc-8051/src/up_reprioritizertr.c index b148e755c5..97d5682e08 100644 --- a/arch/pjrc-8051/src/up_reprioritizertr.c +++ b/arch/pjrc-8051/src/up_reprioritizertr.c @@ -1,7 +1,7 @@ -/************************************************************ +/**************************************************************************** * up_reprioritizertr.c * - * Copyright (C) 2007 Gregory Nutt. All rights reserved. + * Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without @@ -14,7 +14,7 @@ * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. - * 3. Neither the name Gregory Nutt nor the names of its contributors may be + * 3. Neither the name NuttX nor the names of its contributors may be * used to endorse or promote products derived from this software * without specific prior written permission. * @@ -31,11 +31,11 @@ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * - ************************************************************/ + ****************************************************************************/ -/************************************************************ +/**************************************************************************** * Included Files - ************************************************************/ + ****************************************************************************/ #include #include @@ -45,23 +45,23 @@ #include "os_internal.h" #include "up_internal.h" -/************************************************************ +/**************************************************************************** * Private Definitions - ************************************************************/ + ****************************************************************************/ -/************************************************************ +/**************************************************************************** * Private Data - ************************************************************/ + ****************************************************************************/ -/************************************************************ +/**************************************************************************** * Private Funtions - ************************************************************/ + ****************************************************************************/ -/************************************************************ +/**************************************************************************** * Public Funtions - ************************************************************/ + ****************************************************************************/ -/************************************************************ +/**************************************************************************** * Name: up_reprioritize_rtr * * Description: @@ -79,20 +79,33 @@ * tcb: The TCB of the task that has been reprioritized * priority: The new task priority * - ************************************************************/ + ****************************************************************************/ void up_reprioritize_rtr(FAR _TCB *tcb, ubyte priority) { /* Verify that the caller is sane */ - if (tcb->task_state < FIRST_READY_TO_RUN_STATE || - tcb->task_state > LAST_READY_TO_RUN_STATE || - priority < SCHED_PRIORITY_MIN || +#if CONFIG_DEBUG /* We only check parameters when debug is enabled */ + if (priority < SCHED_PRIORITY_MIN || priority > SCHED_PRIORITY_MAX) { PANIC(OSERR_BADREPRIORITIZESTATE); } else +#endif + if (tcb->task_state < FIRST_READY_TO_RUN_STATE || + tcb->task_state > LAST_READY_TO_RUN_STATE) + { + /* This is a hack and needs to be fixed.. here some taks is reprioritizing + * another task that is not running. Here we just set the priority of + * the task -- BUT some of the other states are also prioritized and the + * waiting task should also be re-ordered in the prioritized wiating list. + * As a consequence, the other task is still waiting at the lower priority. + */ + + tcb->sched_priority = priority; + } + else { FAR _TCB *rtcb = (FAR _TCB*)g_readytorun.head; boolean switch_needed; @@ -109,6 +122,9 @@ void up_reprioritize_rtr(FAR _TCB *tcb, ubyte priority) /* Setup up the new task priority */ tcb->sched_priority = (ubyte)priority; +#ifdef CONFIG_PRIORITY_INHERITANCE + tcb->base_priority = (ubyte)priority; +#endif /* Return the task to the specified blocked task list. * sched_addreadytorun will return TRUE if the task was diff --git a/arch/sh/src/common/up_reprioritizertr.c b/arch/sh/src/common/up_reprioritizertr.c index dccc6ad4a6..58ba7a0d69 100644 --- a/arch/sh/src/common/up_reprioritizertr.c +++ b/arch/sh/src/common/up_reprioritizertr.c @@ -1,7 +1,7 @@ /**************************************************************************** * arch/sh/src/common/up_reprioritizertr.c * - * Copyright (C) 2008 Gregory Nutt. All rights reserved. + * Copyright (C) 2008-2009 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without @@ -85,14 +85,27 @@ void up_reprioritize_rtr(_TCB *tcb, ubyte priority) { /* Verify that the caller is sane */ - if (tcb->task_state < FIRST_READY_TO_RUN_STATE || - tcb->task_state > LAST_READY_TO_RUN_STATE || - priority < SCHED_PRIORITY_MIN || +#if CONFIG_DEBUG /* We only check parameters when debug is enabled */ + if (priority < SCHED_PRIORITY_MIN || priority > SCHED_PRIORITY_MAX) { PANIC(OSERR_BADREPRIORITIZESTATE); } else +#endif + if (tcb->task_state < FIRST_READY_TO_RUN_STATE || + tcb->task_state > LAST_READY_TO_RUN_STATE) + { + /* This is a hack and needs to be fixed.. here some taks is reprioritizing + * another task that is not running. Here we just set the priority of + * the task -- BUT some of the other states are also prioritized and the + * waiting task should also be re-ordered in the prioritized wiating list. + * As a consequence, the other task is still waiting at the lower priority. + */ + + tcb->sched_priority = priority; + } + else { _TCB *rtcb = (_TCB*)g_readytorun.head; boolean switch_needed; @@ -109,6 +122,9 @@ void up_reprioritize_rtr(_TCB *tcb, ubyte priority) /* Setup up the new task priority */ tcb->sched_priority = (ubyte)priority; +#ifdef CONFIG_PRIORITY_INHERITANCE + tcb->base_priority = (ubyte)priority; +#endif /* Return the task to the specified blocked task list. * sched_addreadytorun will return TRUE if the task was diff --git a/arch/sim/src/up_reprioritizertr.c b/arch/sim/src/up_reprioritizertr.c index 5f1d2a42cd..f68ff2a828 100644 --- a/arch/sim/src/up_reprioritizertr.c +++ b/arch/sim/src/up_reprioritizertr.c @@ -1,7 +1,7 @@ /**************************************************************************** * up_reprioritizertr.c * - * Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved. + * Copyright (C) 2007-2009 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without @@ -85,14 +85,27 @@ void up_reprioritize_rtr(_TCB *tcb, ubyte priority) { /* Verify that the caller is sane */ - if (tcb->task_state < FIRST_READY_TO_RUN_STATE || - tcb->task_state > LAST_READY_TO_RUN_STATE || - priority < SCHED_PRIORITY_MIN || +#if CONFIG_DEBUG /* We only check parameters when debug is enabled */ + if (priority < SCHED_PRIORITY_MIN || priority > SCHED_PRIORITY_MAX) { PANIC(OSERR_BADREPRIORITIZESTATE); } else +#endif + if (tcb->task_state < FIRST_READY_TO_RUN_STATE || + tcb->task_state > LAST_READY_TO_RUN_STATE) + { + /* This is a hack and needs to be fixed.. here some taks is reprioritizing + * another task that is not running. Here we just set the priority of + * the task -- BUT some of the other states are also prioritized and the + * waiting task should also be re-ordered in the prioritized wiating list. + * As a consequence, the other task is still waiting at the lower priority. + */ + + tcb->sched_priority = priority; + } + else { _TCB *rtcb = (_TCB*)g_readytorun.head; boolean switch_needed; @@ -109,6 +122,9 @@ void up_reprioritize_rtr(_TCB *tcb, ubyte priority) /* Setup up the new task priority */ tcb->sched_priority = (ubyte)priority; +#ifdef CONFIG_PRIORITY_INHERITANCE + tcb->base_priority = (ubyte)priority; +#endif /* Return the task to the specified blocked task list. * sched_addreadytorun will return TRUE if the task was diff --git a/arch/z16/src/common/up_reprioritizertr.c b/arch/z16/src/common/up_reprioritizertr.c index e9c6a8a1e0..5692ac12c2 100644 --- a/arch/z16/src/common/up_reprioritizertr.c +++ b/arch/z16/src/common/up_reprioritizertr.c @@ -1,7 +1,7 @@ /**************************************************************************** * common/up_reprioritizertr.c * - * Copyright (C) 2008 Gregory Nutt. All rights reserved. + * Copyright (C) 2008-2009 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without @@ -89,14 +89,27 @@ void up_reprioritize_rtr(FAR _TCB *tcb, ubyte priority) { /* Verify that the caller is sane */ - if (tcb->task_state < FIRST_READY_TO_RUN_STATE || - tcb->task_state > LAST_READY_TO_RUN_STATE || - priority < SCHED_PRIORITY_MIN || +#if CONFIG_DEBUG /* We only check parameters when debug is enabled */ + if (priority < SCHED_PRIORITY_MIN || priority > SCHED_PRIORITY_MAX) { PANIC(OSERR_BADREPRIORITIZESTATE); } else +#endif + if (tcb->task_state < FIRST_READY_TO_RUN_STATE || + tcb->task_state > LAST_READY_TO_RUN_STATE) + { + /* This is a hack and needs to be fixed.. here some taks is reprioritizing + * another task that is not running. Here we just set the priority of + * the task -- BUT some of the other states are also prioritized and the + * waiting task should also be re-ordered in the prioritized wiating list. + * As a consequence, the other task is still waiting at the lower priority. + */ + + tcb->sched_priority = priority; + } + else { FAR _TCB *rtcb = (FAR _TCB*)g_readytorun.head; boolean switch_needed; @@ -113,6 +126,9 @@ void up_reprioritize_rtr(FAR _TCB *tcb, ubyte priority) /* Setup up the new task priority */ tcb->sched_priority = (ubyte)priority; +#ifdef CONFIG_PRIORITY_INHERITANCE + tcb->base_priority = (ubyte)priority; +#endif /* Return the task to the specified blocked task list. * sched_addreadytorun will return TRUE if the task was diff --git a/arch/z80/src/common/up_reprioritizertr.c b/arch/z80/src/common/up_reprioritizertr.c index 72e550d89b..73272553e0 100644 --- a/arch/z80/src/common/up_reprioritizertr.c +++ b/arch/z80/src/common/up_reprioritizertr.c @@ -1,7 +1,7 @@ /**************************************************************************** * arch/z80/src/common/up_reprioritizertr.c * - * Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved. + * Copyright (C) 2007-2009 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without @@ -90,14 +90,27 @@ void up_reprioritize_rtr(FAR _TCB *tcb, ubyte priority) { /* Verify that the caller is sane */ - if (tcb->task_state < FIRST_READY_TO_RUN_STATE || - tcb->task_state > LAST_READY_TO_RUN_STATE || - priority < SCHED_PRIORITY_MIN || +#if CONFIG_DEBUG /* We only check parameters when debug is enabled */ + if (priority < SCHED_PRIORITY_MIN || priority > SCHED_PRIORITY_MAX) { PANIC(OSERR_BADREPRIORITIZESTATE); } else +#endif + if (tcb->task_state < FIRST_READY_TO_RUN_STATE || + tcb->task_state > LAST_READY_TO_RUN_STATE) + { + /* This is a hack and needs to be fixed.. here some taks is reprioritizing + * another task that is not running. Here we just set the priority of + * the task -- BUT some of the other states are also prioritized and the + * waiting task should also be re-ordered in the prioritized wiating list. + * As a consequence, the other task is still waiting at the lower priority. + */ + + tcb->sched_priority = priority; + } + else { FAR _TCB *rtcb = (FAR _TCB*)g_readytorun.head; boolean switch_needed; @@ -114,6 +127,9 @@ void up_reprioritize_rtr(FAR _TCB *tcb, ubyte priority) /* Setup up the new task priority */ tcb->sched_priority = (ubyte)priority; +#ifdef CONFIG_PRIORITY_INHERITANCE + tcb->base_priority = (ubyte)priority; +#endif /* Return the task to the specified blocked task list. * sched_addreadytorun will return TRUE if the task was