summaryrefslogtreecommitdiff
path: root/nuttx/sched/task_delete.c
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2013-04-25 16:23:30 -0600
committerGregory Nutt <gnutt@nuttx.org>2013-04-25 16:23:30 -0600
commitfd1e0a17e27b59cc236394c0766feea7278e1d00 (patch)
tree94a82f0c869cd5c5c81c41c00d707f63208c52e5 /nuttx/sched/task_delete.c
parentbbf5ee648636273bf194f5e9a8004ea45d4cb009 (diff)
downloadpx4-nuttx-fd1e0a17e27b59cc236394c0766feea7278e1d00.tar.gz
px4-nuttx-fd1e0a17e27b59cc236394c0766feea7278e1d00.tar.bz2
px4-nuttx-fd1e0a17e27b59cc236394c0766feea7278e1d00.zip
Move task_terminate to its own C file to prevent drawing task_delete into the link
Diffstat (limited to 'nuttx/sched/task_delete.c')
-rw-r--r--nuttx/sched/task_delete.c116
1 files changed, 2 insertions, 114 deletions
diff --git a/nuttx/sched/task_delete.c b/nuttx/sched/task_delete.c
index 1cf9f97e5..ead1811c3 100644
--- a/nuttx/sched/task_delete.c
+++ b/nuttx/sched/task_delete.c
@@ -39,14 +39,11 @@
#include <nuttx/config.h>
-#include <sys/types.h>
#include <stdlib.h>
-#include <sched.h>
+
+#include <nuttx/sched.h>
#include "os_internal.h"
-#ifndef CONFIG_DISABLE_SIGNALS
-# include "sig_internal.h"
-#endif
/****************************************************************************
* Definitions
@@ -77,115 +74,6 @@
****************************************************************************/
/****************************************************************************
- * Name: task_terminate
- *
- * Description:
- * This function causes a specified task to cease to exist. Its stack and
- * TCB will be deallocated. This function is the internal implementation
- * of the task_delete() function. It includes and additional parameter
- * to determine if blocking is permitted or not.
- *
- * This function is the final function called all task termination
- * sequences. task_terminate() is called only from task_delete() (with
- * nonblocking == false) and from task_exit() (with nonblocking == true).
- *
- * The path through task_exit() supports the final stops of the exit(),
- * _exit(), and pthread_exit
- *
- * - pthread_exit(). Calls _exit()
- * - exit(). Calls _exit()
- * - _exit(). Calls task_exit() making the currently running task
- * non-running. task_exit then calls task_terminate() (with nonblocking
- * == true) to terminate the non-running task.
- *
- * NOTE: that the state of non-blocking is irrelevant when called through
- * exit() and pthread_exit(). In those cases task_exithook() has already
- * been called with nonblocking == false;
- *
- * Inputs:
- * pid - The task ID of the task to delete. A pid of zero
- * signifies the calling task.
- * nonblocking - True: The task is an unhealthy, partially torn down
- * state and is not permitted to block.
- *
- * Return Value:
- * OK on success; or ERROR on failure
- *
- * This function can fail if the provided pid does not correspond to a
- * task (errno is not set)
- *
- ****************************************************************************/
-
-int task_terminate(pid_t pid, bool nonblocking)
-{
- FAR struct tcb_s *dtcb;
- irqstate_t saved_state;
- int ret = ERROR;
-
- /* Make sure the task does not become ready-to-run while we are futzing with
- * its TCB by locking ourselves as the executing task.
- */
-
- sched_lock();
-
- /* Find for the TCB associated with matching pid */
-
- dtcb = sched_gettcb(pid);
- if (!dtcb)
- {
- /* This pid does not correspond to any known task */
-
- sched_unlock();
- return ERROR;
- }
-
- /* Verify our internal sanity */
-
- if (dtcb->task_state == TSTATE_TASK_RUNNING ||
- dtcb->task_state >= NUM_TASK_STATES)
- {
- sched_unlock();
- PANIC();
- }
-
- /* Perform common task termination logic (flushing streams, calling
- * functions registered by at_exit/on_exit, etc.). We need to do
- * this as early as possible so that higher level clean-up logic
- * can run in a healthy tasking environment.
- *
- * In the case where the task exits via exit(), task_exithook()
- * may be called twice.
- *
- * I suppose EXIT_SUCCESS is an appropriate return value???
- */
-
- task_exithook(dtcb, EXIT_SUCCESS, nonblocking);
-
- /* Remove the task from the OS's tasks lists. */
-
- saved_state = irqsave();
- dq_rem((FAR dq_entry_t*)dtcb, (dq_queue_t*)g_tasklisttable[dtcb->task_state].list);
- dtcb->task_state = TSTATE_TASK_INVALID;
- irqrestore(saved_state);
-
- /* At this point, the TCB should no longer be accessible to the system */
-
- sched_unlock();
-
- /* Since all tasks pass through this function as the final step in their
- * exit sequence, this is an appropriate place to inform any instrumentation
- * layer that the task no longer exists.
- */
-
- sched_note_stop(dtcb);
-
- /* Deallocate its TCB */
-
- sched_releasetcb(dtcb, dtcb->flags & TCB_FLAG_TTYPE_MASK);
- return ret;
-}
-
-/****************************************************************************
* Name: task_delete
*
* Description: