diff --git a/arch/arm/src/common/up_exit.c b/arch/arm/src/common/up_exit.c index e760b00cf6..2660ed80bb 100644 --- a/arch/arm/src/common/up_exit.c +++ b/arch/arm/src/common/up_exit.c @@ -58,17 +58,16 @@ ****************************************************************************/ /**************************************************************************** - * Private Funtions + * Private Functions ****************************************************************************/ /**************************************************************************** * Name: _up_dumponexit * * Description: - * Dump the state of all tasks whenever on task exits. This - * is debug instrumentation that was added to check file- - * related reference counting but could be useful again - * sometime in the future. + * Dump the state of all tasks whenever on task exits. This is debug + * instrumentation that was added to check file-related reference counting + * but could be useful again sometime in the future. * ****************************************************************************/ @@ -133,13 +132,15 @@ static void _up_dumponexit(FAR _TCB *tcb, FAR void *arg) * * Description: * This function causes the currently executing task to cease - * to exist. This is a special case of task_delete(). + * to exist. This is a special case of task_delete() where the task to + * be deleted is the currently executing task. It is more complex because + * a context switch must be perform to the the next ready to run task. * ****************************************************************************/ void _exit(int status) { - _TCB* tcb = (_TCB*)g_readytorun.head; + _TCB* tcb; /* Disable interrupts. They will be restored when the next * task is started. @@ -150,41 +151,13 @@ void _exit(int status) lldbg("TCB=%p exitting\n", tcb); #if defined(CONFIG_DUMP_ON_EXIT) && defined(CONFIG_DEBUG) - dbg("Other tasks:\n"); + lldbg("Other tasks:\n"); sched_foreach(_up_dumponexit, NULL); #endif - /* Remove the tcb task from the ready-to-run list. We can - * ignore the return value because we know that a context - * switch is needed. - */ + /* Destroy the task at the head of the ready to run list. */ - (void)sched_removereadytorun(tcb); - - /* We are not in a bad stack-- the head of the ready to run task list - * does not correspond to the thread that is running. Disabling pre- - * emption on this TCB should be enough to keep things stable. - */ - - sched_lock(); - - /* Move the TCB to the specified blocked task list and delete it */ - - sched_addblocked(tcb, TSTATE_TASK_INACTIVE); - task_delete(tcb->pid); - - /* If there are any pending tasks, then add them to the g_readytorun - * task list now - */ - - if (g_pendingtasks.head) - { - (void)sched_mergepending(); - } - - /* Now calling sched_unlock() should have no effect */ - - sched_unlock(); + (void)task_deletecurrent(); /* Now, perform the context switch to the new ready-to-run task at the * head of the list. diff --git a/arch/c5471/src/up_exit.c b/arch/c5471/src/up_exit.c index 2ef47bdfbc..4d117fce4b 100644 --- a/arch/c5471/src/up_exit.c +++ b/arch/c5471/src/up_exit.c @@ -1,7 +1,7 @@ -/************************************************************ +/**************************************************************************** * up_exit.c * - * Copyright (C) 2007 Gregory Nutt. All rights reserved. + * Copyright (C) 2007, 2008 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 @@ -49,28 +49,27 @@ #include #endif -/************************************************************ +/**************************************************************************** * Private Definitions - ************************************************************/ + ****************************************************************************/ -/************************************************************ +/**************************************************************************** * Private Data - ************************************************************/ + ****************************************************************************/ -/************************************************************ - * Private Funtions - ************************************************************/ +/**************************************************************************** + * Private Functions + ****************************************************************************/ -/************************************************************ +/**************************************************************************** * Name: _up_dumponexit * * Description: - * Dump the state of all tasks whenever on task exits. This - * is debug instrumentation that was added to check file- - * related reference counting but could be useful again - * sometime in the future. + * Dump the state of all tasks whenever on task exits. This is debug + * instrumentation that was added to check file-related reference counting + * but could be useful again sometime in the future. * - ************************************************************/ + ****************************************************************************/ #if defined(CONFIG_DUMP_ON_EXIT) && defined(CONFIG_DEBUG) static void _up_dumponexit(FAR _TCB *tcb, FAR void *arg) @@ -113,23 +112,30 @@ static void _up_dumponexit(FAR _TCB *tcb, FAR void *arg) } #endif -/************************************************************ - * Public Funtions - ************************************************************/ +/**************************************************************************** + * Public Functions + ****************************************************************************/ -/************************************************************ +/**************************************************************************** * Name: _exit * * Description: * This function causes the currently executing task to cease - * to exist. This is a special case of task_delete(). + * to exist. This is a special case of task_delete() where the task to + * be deleted is the currently executing task. It is more complex because + * a context switch must be perform to the the next ready to run task. * - ************************************************************/ + ****************************************************************************/ void _exit(int status) { - _TCB* tcb = (_TCB*)g_readytorun.head; - irqstate_t flags = irqsave(); + _TCB* tcb; + + /* Disable interrupts. They will be restored when the next + * task is started. + */ + + (void)irqsave(); lldbg("TCB=%p exitting\n", tcb); @@ -138,37 +144,9 @@ void _exit(int status) sched_foreach(_up_dumponexit, NULL); #endif - /* Remove the tcb task from the ready-to-run list. We can - * ignore the return value because we know that a context - * switch is needed. - */ + /* Destroy the task at the head of the ready to run list. */ - (void)sched_removereadytorun(tcb); - - /* We are not in a bad stack-- the head of the ready to run task list - * does not correspond to the thread that is running. Disabling pre- - * emption on this TCB should be enough to keep things stable. - */ - - sched_lock(); - - /* Move the TCB to the specified blocked task list and delete it */ - - sched_addblocked(tcb, TSTATE_TASK_INACTIVE); - task_delete(tcb->pid); - - /* If there are any pending tasks, then add them to the g_readytorun - * task list now - */ - - if (g_pendingtasks.head) - { - (void)sched_mergepending(); - } - - /* Now calling sched_unlock() should have no effect */ - - sched_unlock(); + (void)task_deletecurrent(); /* Now, perform the context switch to the new ready-to-run task at the * head of the list. diff --git a/arch/dm320/src/up_exit.c b/arch/dm320/src/up_exit.c index bb05b1c533..a95b8855b4 100644 --- a/arch/dm320/src/up_exit.c +++ b/arch/dm320/src/up_exit.c @@ -1,7 +1,7 @@ -/************************************************************ +/**************************************************************************** * up_exit.c * - * Copyright (C) 2007 Gregory Nutt. All rights reserved. + * Copyright (C) 2007, 2008 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 @@ -49,28 +49,27 @@ #include #endif -/************************************************************ +/**************************************************************************** * Private Definitions - ************************************************************/ + ****************************************************************************/ -/************************************************************ +/**************************************************************************** * Private Data - ************************************************************/ + ****************************************************************************/ -/************************************************************ - * Private Funtions - ************************************************************/ +/**************************************************************************** + * Private Functions + ****************************************************************************/ -/************************************************************ +/**************************************************************************** * Name: _up_dumponexit * * Description: - * Dump the state of all tasks whenever on task exits. This - * is debug instrumentation that was added to check file- - * related reference counting but could be useful again - * sometime in the future. + * Dump the state of all tasks whenever on task exits. This is debug + * instrumentation that was added to check file-related reference counting + * but could be useful again sometime in the future. * - ************************************************************/ + ****************************************************************************/ #if defined(CONFIG_DUMP_ON_EXIT) && defined(CONFIG_DEBUG) static void _up_dumponexit(FAR _TCB *tcb, FAR void *arg) @@ -112,22 +111,24 @@ static void _up_dumponexit(FAR _TCB *tcb, FAR void *arg) } #endif -/************************************************************ - * Public Funtions - ************************************************************/ +/**************************************************************************** + * Public Functions + ****************************************************************************/ -/************************************************************ +/**************************************************************************** * Name: _exit * * Description: * This function causes the currently executing task to cease - * to exist. This is a special case of task_delete(). + * to exist. This is a special case of task_delete() where the task to + * be deleted is the currently executing task. It is more complex because + * a context switch must be perform to the the next ready to run task. * - ************************************************************/ + ****************************************************************************/ void _exit(int status) { - _TCB* tcb = (_TCB*)g_readytorun.head; + _TCB* tcb; /* Disable interrupts. They will be restored when the next * task is started. @@ -138,41 +139,13 @@ void _exit(int status) lldbg("TCB=%p exitting\n", tcb); #if defined(CONFIG_DUMP_ON_EXIT) && defined(CONFIG_DEBUG) - dbg("Other tasks:\n"); + lldbg("Other tasks:\n"); sched_foreach(_up_dumponexit, NULL); #endif - /* Remove the tcb task from the ready-to-run list. We can - * ignore the return value because we know that a context - * switch is needed. - */ + /* Destroy the task at the head of the ready to run list. */ - (void)sched_removereadytorun(tcb); - - /* We are not in a bad stack-- the head of the ready to run task list - * does not correspond to the thread that is running. Disabling pre- - * emption on this TCB should be enough to keep things stable. - */ - - sched_lock(); - - /* Move the TCB to the specified blocked task list and delete it */ - - sched_addblocked(tcb, TSTATE_TASK_INACTIVE); - task_delete(tcb->pid); - - /* If there are any pending tasks, then add them to the g_readytorun - * task list now - */ - - if (g_pendingtasks.head) - { - (void)sched_mergepending(); - } - - /* Now calling sched_unlock() should have no effect */ - - sched_unlock(); + (void)task_deletecurrent(); /* Now, perform the context switch to the new ready-to-run task at the * head of the list. diff --git a/arch/pjrc-8051/src/up_exit.c b/arch/pjrc-8051/src/up_exit.c index b938d93047..227225596c 100644 --- a/arch/pjrc-8051/src/up_exit.c +++ b/arch/pjrc-8051/src/up_exit.c @@ -1,7 +1,7 @@ -/************************************************************ +/**************************************************************************** * up_exit.c * - * Copyright (C) 2007 Gregory Nutt. All rights reserved. + * Copyright (C) 2007, 2008 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 @@ -46,34 +46,36 @@ #include "os_internal.h" #include "up_internal.h" -/************************************************************ +/**************************************************************************** * Private Definitions - ************************************************************/ + ****************************************************************************/ -/************************************************************ +/**************************************************************************** * Private Data - ************************************************************/ + ****************************************************************************/ -/************************************************************ - * Private Funtions - ************************************************************/ +/**************************************************************************** + * Private Functions + ****************************************************************************/ -/************************************************************ - * Public Funtions - ************************************************************/ +/**************************************************************************** + * Public Functions + ****************************************************************************/ -/************************************************************ +/**************************************************************************** * Name: _exit * * Description: * This function causes the currently executing task to cease - * to exist. This is a special case of task_delete(). + * to exist. This is a special case of task_delete() where the task to + * be deleted is the currently executing task. It is more complex because + * a context switch must be perform to the the next ready to run task. * - ************************************************************/ + ****************************************************************************/ void _exit(int status) { - FAR _TCB* tcb = (FAR _TCB*)g_readytorun.head; + FAR _TCB* tcb; dbg("TCB=%p exitting\n", tcb); @@ -83,37 +85,9 @@ void _exit(int status) EA = 0; - /* Remove the tcb task from the ready-to-run list. We can - * ignore the return value because we know that a context - * switch is needed. - */ + /* Destroy the task at the head of the ready to run list. */ - (void)sched_removereadytorun(tcb); - - /* We are not in a bad stack-- the head of the ready to run task list - * does not correspond to the thread that is running. Disabling pre- - * emption on this TCB should be enough to keep things stable. - */ - - sched_lock(); - - /* Move the TCB to the specified blocked task list and delete it */ - - sched_addblocked(tcb, TSTATE_TASK_INACTIVE); - task_delete(tcb->pid); - - /* If there are any pending tasks, then add them to the g_readytorun - * task list now - */ - - if (g_pendingtasks.head) - { - (void)sched_mergepending(); - } - - /* Now calling sched_unlock() should have no effect */ - - sched_unlock(); + (void)task_deletecurrent(); /* Now, perform the context switch to the new ready-to-run task at the * head of the list. diff --git a/arch/sim/src/up_exit.c b/arch/sim/src/up_exit.c index 8ab8f92cf4..5c2cd3dc42 100644 --- a/arch/sim/src/up_exit.c +++ b/arch/sim/src/up_exit.c @@ -1,7 +1,7 @@ -/************************************************************ +/**************************************************************************** * up_exit.c * - * Copyright (C) 2007 Gregory Nutt. All rights reserved. + * Copyright (C) 2007, 2008 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,68 +45,42 @@ #include "os_internal.h" #include "up_internal.h" -/************************************************************ +/**************************************************************************** * Private Definitions - ************************************************************/ + ****************************************************************************/ -/************************************************************ +/**************************************************************************** * Private Data - ************************************************************/ + ****************************************************************************/ -/************************************************************ - * Private Funtions - ************************************************************/ +/**************************************************************************** + * Private Functions + ****************************************************************************/ -/************************************************************ - * Public Funtions - ************************************************************/ +/**************************************************************************** + * Public Functions + ****************************************************************************/ -/************************************************************ +/**************************************************************************** * Name: _exit * * Description: * This function causes the currently executing task to cease - * to exist. This is a special case of task_delete(). + * to exist. This is a special case of task_delete() where the task to + * be deleted is the currently executing task. It is more complex because + * a context switch must be perform to the the next ready to run task. * - ************************************************************/ + ****************************************************************************/ void _exit(int status) { - _TCB* tcb = (_TCB*)g_readytorun.head; + _TCB* tcb; sdbg("TCB=%p exitting\n", tcb); - /* Remove the tcb task from the ready-to-run list. We can - * ignore the return value because we know that a context - * switch is needed. - */ + /* Destroy the task at the head of the ready to run list. */ - (void)sched_removereadytorun(tcb); - - /* We are not in a bad stack-- the head of the ready to run task list - * does not correspond to the thread that is running. Disabling pre- - * emption on this TCB should be enough to keep things stable. - */ - - sched_lock(); - - /* Move the TCB to the specified blocked task list and delete it */ - - sched_addblocked(tcb, TSTATE_TASK_INACTIVE); - task_delete(tcb->pid); - - /* If there are any pending tasks, then add them to the g_readytorun - * task list now. - */ - - if (g_pendingtasks.head) - { - (void)sched_mergepending(); - } - - /* Now calling sched_unlock() should have no effect */ - - sched_unlock(); + (void)task_deletecurrent(); /* Now, perform the context switch to the new ready-to-run task at the * head of the list. diff --git a/arch/z16/src/common/up_exit.c b/arch/z16/src/common/up_exit.c index 52a9b148b2..b2e18e22bb 100644 --- a/arch/z16/src/common/up_exit.c +++ b/arch/z16/src/common/up_exit.c @@ -69,10 +69,9 @@ * Name: _up_dumponexit * * Description: - * Dump the state of all tasks whenever on task exits. This - * is debug instrumentation that was added to check file- - * related reference counting but could be useful again - * sometime in the future. + * Dump the state of all tasks whenever on task exits. This is debug + * instrumentation that was added to check file-related reference counting + * but could be useful again sometime in the future. * ****************************************************************************/ @@ -137,13 +136,15 @@ static void _up_dumponexit(FAR _TCB *tcb, FAR void *arg) * * Description: * This function causes the currently executing task to cease - * to exist. This is a special case of task_delete(). + * to exist. This is a special case of task_delete() where the task to + * be deleted is the currently executing task. It is more complex because + * a context switch must be perform to the the next ready to run task. * ****************************************************************************/ void _exit(int status) { - FAR _TCB* tcb = (FAR _TCB*)g_readytorun.head; + FAR _TCB* tcb; /* Disable interrupts. Interrupts will remain disabled until * the new task is resumed below. @@ -158,37 +159,9 @@ void _exit(int status) sched_foreach(_up_dumponexit, NULL); #endif - /* Remove the tcb task from the ready-to-run list. We can - * ignore the return value because we know that a context - * switch is needed. - */ + /* Destroy the task at the head of the ready to run list. */ - (void)sched_removereadytorun(tcb); - - /* We are not in a bad stack-- the head of the ready to run task list - * does not correspond to the thread that is running. Disabling pre- - * emption on this TCB should be enough to keep things stable. - */ - - sched_lock(); - - /* Move the TCB to the specified blocked task list and delete it */ - - sched_addblocked(tcb, TSTATE_TASK_INACTIVE); - task_delete(tcb->pid); - - /* If there are any pending tasks, then add them to the g_readytorun - * task list now - */ - - if (g_pendingtasks.head) - { - (void)sched_mergepending(); - } - - /* Now calling sched_unlock() should have no effect */ - - sched_unlock(); + (void)task_deletecurrent(); /* Now, perform the context switch to the new ready-to-run task at the * head of the list. diff --git a/arch/z80/src/common/up_exit.c b/arch/z80/src/common/up_exit.c index b7f5e62433..d8c94fece9 100644 --- a/arch/z80/src/common/up_exit.c +++ b/arch/z80/src/common/up_exit.c @@ -69,10 +69,9 @@ * Name: _up_dumponexit * * Description: - * Dump the state of all tasks whenever on task exits. This - * is debug instrumentation that was added to check file- - * related reference counting but could be useful again - * sometime in the future. + * Dump the state of all tasks whenever on task exits. This is debug + * instrumentation that was added to check file-related reference counting + * but could be useful again sometime in the future. * ****************************************************************************/ @@ -137,13 +136,15 @@ static void _up_dumponexit(FAR _TCB *tcb, FAR void *arg) * * Description: * This function causes the currently executing task to cease - * to exist. This is a special case of task_delete(). + * to exist. This is a special case of task_delete() where the task to + * be deleted is the currently executing task. It is more complex because + * a context switch must be perform to the the next ready to run task. * ****************************************************************************/ void _exit(int status) { - FAR _TCB* tcb = (FAR _TCB*)g_readytorun.head; + FAR _TCB* tcb; /* Disable interrupts. Interrupts will remain disabled until * the new task is resumed below. @@ -158,37 +159,9 @@ void _exit(int status) sched_foreach(_up_dumponexit, NULL); #endif - /* Remove the tcb task from the ready-to-run list. We can - * ignore the return value because we know that a context - * switch is needed. - */ + /* Destroy the task at the head of the ready to run list. */ - (void)sched_removereadytorun(tcb); - - /* We are not in a bad stack-- the head of the ready to run task list - * does not correspond to the thread that is running. Disabling pre- - * emption on this TCB should be enough to keep things stable. - */ - - sched_lock(); - - /* Move the TCB to the specified blocked task list and delete it */ - - sched_addblocked(tcb, TSTATE_TASK_INACTIVE); - task_delete(tcb->pid); - - /* If there are any pending tasks, then add them to the g_readytorun - * task list now - */ - - if (g_pendingtasks.head) - { - (void)sched_mergepending(); - } - - /* Now calling sched_unlock() should have no effect */ - - sched_unlock(); + (void)task_deletecurrent(); /* Now, perform the context switch to the new ready-to-run task at the * head of the list.