aboutsummaryrefslogtreecommitdiff
path: root/nuttx/include/nuttx/sched.h
diff options
context:
space:
mode:
Diffstat (limited to 'nuttx/include/nuttx/sched.h')
-rw-r--r--nuttx/include/nuttx/sched.h382
1 files changed, 382 insertions, 0 deletions
diff --git a/nuttx/include/nuttx/sched.h b/nuttx/include/nuttx/sched.h
new file mode 100644
index 000000000..241af6210
--- /dev/null
+++ b/nuttx/include/nuttx/sched.h
@@ -0,0 +1,382 @@
+/********************************************************************************
+ * include/nuttx/sched.h
+ *
+ * Copyright (C) 2007-2012 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <gnutt@nuttx.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ********************************************************************************/
+
+#ifndef __INCLUDE_NUTTX_SCHED_H
+#define __INCLUDE_NUTTX_SCHED_H
+
+/********************************************************************************
+ * Included Files
+ ********************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/types.h>
+#include <stdint.h>
+#include <queue.h>
+#include <signal.h>
+#include <semaphore.h>
+#include <pthread.h>
+#include <mqueue.h>
+#include <time.h>
+
+#include <nuttx/irq.h>
+#include <nuttx/net/net.h>
+
+/********************************************************************************
+ * Pre-processor Definitions
+ ********************************************************************************/
+
+/* Task Management Definitins ***************************************************/
+
+/* This is the maximum number of times that a lock can be set */
+
+#define MAX_LOCK_COUNT 127
+
+/* Values for the _TCB flags flag bits */
+
+#define TCB_FLAG_TTYPE_SHIFT (0) /* Bits 0-1: thread type */
+#define TCB_FLAG_TTYPE_MASK (3 << TCB_FLAG_TTYPE_SHIFT)
+# define TCB_FLAG_TTYPE_TASK (0 << TCB_FLAG_TTYPE_SHIFT) /* Normal user task */
+# define TCB_FLAG_TTYPE_PTHREAD (1 << TCB_FLAG_TTYPE_SHIFT) /* User pthread */
+# define TCB_FLAG_TTYPE_KERNEL (2 << TCB_FLAG_TTYPE_SHIFT) /* Kernel thread */
+#define TCB_FLAG_NONCANCELABLE (1 << 2) /* Bit 2: Pthread is non-cancelable */
+#define TCB_FLAG_CANCEL_PENDING (1 << 3) /* Bit 3: Pthread cancel is pending */
+#define TCB_FLAG_ROUND_ROBIN (1 << 4) /* Bit 4: Round robin sched enabled */
+
+/********************************************************************************
+ * Global Type Definitions
+ ********************************************************************************/
+
+#ifndef __ASSEMBLY__
+
+/* General Task Management Types ************************************************/
+
+/* This is the type of the task_state field of the TCB. NOTE: the order and
+ * content of this enumeration is critical since there are some OS tables indexed
+ * by these values. The range of values is assumed to fit into a uint8_t in _TCB.
+ */
+
+enum tstate_e
+{
+ TSTATE_TASK_INVALID = 0, /* INVALID - The TCB is uninitialized */
+ TSTATE_TASK_PENDING, /* READY_TO_RUN - Pending preemption unlock */
+ TSTATE_TASK_READYTORUN, /* READY-TO-RUN - But not running */
+ TSTATE_TASK_RUNNING, /* READY_TO_RUN - And running */
+
+ TSTATE_TASK_INACTIVE, /* BLOCKED - Initialized but not yet activated */
+ TSTATE_WAIT_SEM, /* BLOCKED - Waiting for a semaphore */
+#ifndef CONFIG_DISABLE_SIGNALS
+ TSTATE_WAIT_SIG, /* BLOCKED - Waiting for a signal */
+#endif
+#ifndef CONFIG_DISABLE_MQUEUE
+ TSTATE_WAIT_MQNOTEMPTY, /* BLOCKED - Waiting for a MQ to become not empty. */
+ TSTATE_WAIT_MQNOTFULL, /* BLOCKED - Waiting for a MQ to become not full. */
+#endif
+#ifdef CONFIG_PAGING
+ TSTATE_WAIT_PAGEFILL, /* BLOCKED - Waiting for page fill */
+#endif
+ NUM_TASK_STATES /* Must be last */
+};
+typedef enum tstate_e tstate_t;
+
+/* The following definitions are determined by tstate_t */
+
+#define FIRST_READY_TO_RUN_STATE TSTATE_TASK_READYTORUN
+#define LAST_READY_TO_RUN_STATE TSTATE_TASK_RUNNING
+#define FIRST_BLOCKED_STATE TSTATE_TASK_INACTIVE
+#define LAST_BLOCKED_STATE (NUM_TASK_STATES-1)
+
+/* The following is the form of a thread start-up function */
+
+typedef void (*start_t)(void);
+
+/* This is the entry point into the main thread of the task or into a created
+ * pthread within the task.
+ */
+
+union entry_u
+{
+ pthread_startroutine_t pthread;
+ main_t main;
+};
+typedef union entry_u entry_t;
+
+/* These is the types of the functions that are executed with exit() is called
+ * (if registered via atexit() on on_exit()).
+ */
+
+#ifdef CONFIG_SCHED_ATEXIT
+typedef void (*atexitfunc_t)(void);
+#endif
+
+#ifdef CONFIG_SCHED_ONEXIT
+typedef void (*onexitfunc_t)(int exitcode, FAR void *arg);
+#endif
+
+/* POSIX Message queue */
+
+typedef struct msgq_s msgq_t;
+
+/* The structure used to maintain environment variables */
+
+#ifndef CONFIG_DISABLE_ENVIRON
+struct environ_s
+{
+ unsigned int ev_crefs; /* Reference count used when environment
+ * is shared by threads */
+ size_t ev_alloc; /* Number of bytes allocated in environment */
+ char ev_env[1]; /* Environment strings */
+};
+typedef struct environ_s environ_t;
+# define SIZEOF_ENVIRON_T(alloc) (sizeof(environ_t) + alloc - 1)
+#endif
+
+/* This structure describes a reference counted D-Space region */
+
+struct dspace_s
+{
+ uint32_t crefs; /* This is the number of pthreads that shared the
+ * the same D-Space */
+ uint8_t region[1]; /* Beginning of the allocated region */
+};
+
+#define SIZEOF_DSPACE_S(n) (sizeof(struct dspace_s) - 1 + (n))
+
+/* This is the task control block (TCB) */
+
+struct _TCB
+{
+ /* Fields used to support list management *************************************/
+
+ FAR struct _TCB *flink; /* link in DQ of TCBs */
+ FAR struct _TCB *blink;
+
+ /* Task Management Fields *****************************************************/
+
+ pid_t pid; /* This is the ID of the thread */
+ start_t start; /* Thread start function */
+ entry_t entry; /* Entry Point into the thread */
+
+#ifdef CONFIG_SCHED_ATEXIT
+# if defined(CONFIG_SCHED_ATEXIT_MAX) && CONFIG_SCHED_ATEXIT_MAX > 1
+ atexitfunc_t atexitfunc[CONFIG_SCHED_ATEXIT_MAX];
+# else
+ atexitfunc_t atexitfunc; /* Called when exit is called. */
+# endif
+#endif
+
+#ifdef CONFIG_SCHED_ONEXIT
+# if defined(CONFIG_SCHED_ONEXIT_MAX) && CONFIG_SCHED_ONEXIT_MAX > 1
+ onexitfunc_t onexitfunc[CONFIG_SCHED_ONEXIT_MAX];
+ FAR void *onexitarg[CONFIG_SCHED_ONEXIT_MAX];
+# else
+ onexitfunc_t onexitfunc; /* Called when exit is called. */
+ FAR void *onexitarg; /* The argument passed to the function */
+# endif
+#endif
+
+#ifdef CONFIG_SCHED_WAITPID
+ sem_t exitsem; /* Support for waitpid */
+ int *stat_loc; /* Location to return exit status */
+#endif
+
+ uint8_t sched_priority; /* Current priority of the thread */
+
+#ifdef CONFIG_PRIORITY_INHERITANCE
+# if CONFIG_SEM_NNESTPRIO > 0
+ uint8_t npend_reprio; /* Number of nested reprioritizations */
+ uint8_t pend_reprios[CONFIG_SEM_NNESTPRIO];
+# endif
+ uint8_t base_priority; /* "Normal" priority of the thread */
+#endif
+
+ uint8_t task_state; /* Current state of the thread */
+ uint16_t flags; /* Misc. general status flags */
+ int16_t lockcount; /* 0=preemptable (not-locked) */
+
+#ifndef CONFIG_DISABLE_PTHREAD
+ FAR void *joininfo; /* Detach-able info to support join */
+#endif
+
+#if CONFIG_RR_INTERVAL > 0
+ int timeslice; /* RR timeslice interval remaining */
+#endif
+
+ /* Values needed to restart a task ********************************************/
+
+ uint8_t init_priority; /* Initial priority of the task */
+ char *argv[CONFIG_MAX_TASK_ARGS+1]; /* Name+start-up parameters */
+
+#ifndef CONFIG_DISABLE_ENVIRON
+ FAR environ_t *envp; /* Environment variables */
+#endif
+
+ /* Stack-Related Fields *******************************************************/
+
+#ifndef CONFIG_CUSTOM_STACK
+ size_t adj_stack_size; /* Stack size after adjustment */
+ /* for hardware, processor, etc. */
+ /* (for debug purposes only) */
+ FAR void *stack_alloc_ptr; /* Pointer to allocated stack */
+ /* Need to deallocate stack */
+ FAR void *adj_stack_ptr; /* Adjusted stack_alloc_ptr for HW */
+ /* The initial stack pointer value */
+#endif
+
+ /* External Module Support ****************************************************/
+
+#ifdef CONFIG_PIC
+ FAR struct dspace_s *dspace; /* Allocated area for .bss and .data */
+#endif
+
+ /* POSIX Thread Specific Data *************************************************/
+
+#if !defined(CONFIG_DISABLE_PTHREAD) && CONFIG_NPTHREAD_KEYS > 0
+ FAR void *pthread_data[CONFIG_NPTHREAD_KEYS];
+#endif
+
+ /* POSIX Semaphore Control Fields *********************************************/
+
+ sem_t *waitsem; /* Semaphore ID waiting on */
+
+ /* POSIX Signal Control Fields ************************************************/
+
+#ifndef CONFIG_DISABLE_SIGNALS
+ sigset_t sigprocmask; /* Signals that are blocked */
+ sigset_t sigwaitmask; /* Waiting for pending signals */
+ sq_queue_t sigactionq; /* List of actions for signals */
+ sq_queue_t sigpendingq; /* List of Pending Signals */
+ sq_queue_t sigpendactionq; /* List of pending signal actions */
+ sq_queue_t sigpostedq; /* List of posted signals */
+ siginfo_t sigunbinfo; /* Signal info when task unblocked */
+#endif
+
+ /* POSIX Named Message Queue Fields *******************************************/
+
+#ifndef CONFIG_DISABLE_MQUEUE
+ sq_queue_t msgdesq; /* List of opened message queues */
+ FAR msgq_t *msgwaitq; /* Waiting for this message queue */
+#endif
+
+ /* Library related fields *****************************************************/
+
+ int pterrno; /* Current per-thread errno */
+
+ /* File system support ********************************************************/
+
+#if CONFIG_NFILE_DESCRIPTORS > 0
+ FAR struct filelist *filelist; /* Maps file descriptor to file */
+#endif
+
+#if CONFIG_NFILE_STREAMS > 0
+ FAR struct streamlist *streams; /* Holds C buffered I/O info */
+#endif
+
+ /* Network socket *************************************************************/
+
+#if CONFIG_NSOCKET_DESCRIPTORS > 0
+ FAR struct socketlist *sockets; /* Maps file descriptor to file */
+#endif
+
+ /* State save areas ***********************************************************/
+ /* The form and content of these fields are processor-specific. */
+
+ struct xcptcontext xcp; /* Interrupt register save area */
+
+#if CONFIG_TASK_NAME_SIZE > 0
+ char name[CONFIG_TASK_NAME_SIZE]; /* Task name */
+#endif
+
+};
+
+/* Certain other header files may also define this time to avoid circular header
+ * file inclusion issues.
+ */
+
+#ifndef __TCB_DEFINED__
+typedef struct _TCB _TCB;
+#define __TCB_DEFINED__
+#endif
+
+/* This is the callback type used by sched_foreach() */
+
+typedef void (*sched_foreach_t)(FAR _TCB *tcb, FAR void *arg);
+
+#endif /* __ASSEMBLY__ */
+
+/********************************************************************************
+ * Global Function Prototypes
+ ********************************************************************************/
+
+#ifndef __ASSEMBLY__
+#undef EXTERN
+#if defined(__cplusplus)
+#define EXTERN extern "C"
+extern "C" {
+#else
+#define EXTERN extern
+#endif
+
+/* TCB helpers */
+
+EXTERN FAR _TCB *sched_self(void);
+
+/* File system helpers */
+
+#if CONFIG_NFILE_DESCRIPTORS > 0
+EXTERN FAR struct filelist *sched_getfiles(void);
+#if CONFIG_NFILE_STREAMS > 0
+EXTERN FAR struct streamlist *sched_getstreams(void);
+#endif /* CONFIG_NFILE_STREAMS */
+#endif /* CONFIG_NFILE_DESCRIPTORS */
+
+#if CONFIG_NSOCKET_DESCRIPTORS > 0
+EXTERN FAR struct socketlist *sched_getsockets(void);
+#endif /* CONFIG_NSOCKET_DESCRIPTORS */
+
+/* sched_foreach will enumerate over each task and provide the
+ * TCB of each task to a user callback functions. Interrupts
+ * will be disabled throughout this enumeration!
+ */
+
+EXTERN void sched_foreach(sched_foreach_t handler, FAR void *arg);
+
+#undef EXTERN
+#if defined(__cplusplus)
+}
+#endif
+#endif /* __ASSEMBLY__ */
+
+#endif /* __INCLUDE_NUTTX_SCHED_H */