1
0
mirror of https://github.com/deadw00d/AROS.git synced 2025-10-26 21:18:42 +00:00
Files
AROS-v0/compiler/include/exec/tasks.h
deadwood 1ebb5df920 Introduce EMERGENCY flag for ShutdownA
This flag indicates that something has already gone wrong and least
amount of code should be used to do reboot or shutdown. This means
not running non-critical reset handlers. Note that the handler itself
needs to decide whethere it is critical or not.
2022-01-16 10:28:06 +01:00

241 lines
7.8 KiB
C

#ifndef EXEC_TASKS_H
#define EXEC_TASKS_H
/*
Copyright © 1995-2020, The AROS Development Team. All rights reserved.
$Id$
Desc: Task structure and constants
Lang: english
*/
#ifndef EXEC_NODES_H
# include <exec/nodes.h>
#endif
#ifndef EXEC_LISTS_H
# include <exec/lists.h>
#endif
#ifndef EXEC_PORTS_H
# include <exec/ports.h>
#endif
#ifndef UTILITY_TAGITEM_H
# include <utility/tagitem.h>
#endif
struct ETask;
/* You must use Exec functions to modify task structure fields. */
struct Task
{
struct Node tc_Node;
UBYTE tc_Flags;
UBYTE tc_State;
BYTE tc_IDNestCnt; /* Interrupt disabled nesting */
BYTE tc_TDNestCnt; /* Task disabled nesting */
ULONG tc_SigAlloc; /* Allocated signals */
ULONG tc_SigWait; /* Signals we are waiting for */
ULONG tc_SigRecvd; /* Received signals */
ULONG tc_SigExcept; /* Signals we will take exceptions for */
union
{
struct
{
UWORD tc_ETrapAlloc; /* Allocated traps */
UWORD tc_ETrapAble; /* Enabled traps */
} tc_ETrap;
struct ETask *tc_ETask; /* Valid if TF_ETASK is set */
} tc_UnionETask;
APTR tc_ExceptData; /* Exception data */
APTR tc_ExceptCode; /* Exception code */
APTR tc_TrapData; /* Trap data */
APTR tc_TrapCode; /* Trap code */
APTR tc_SPReg; /* Stack pointer */
APTR tc_SPLower; /* Stack lower bound */
APTR tc_SPUpper; /* Stack upper bound */
VOID (* tc_Switch)(); /* Task loses CPU */
VOID (* tc_Launch)(); /* Task gets CPU */
struct List tc_MemEntry; /* Allocated memory. Freed by RemTask(). */
APTR tc_UserData; /* For use by the task; no restrictions! */
};
#define tc_TrapAlloc tc_UnionETask.tc_ETrap.tc_ETrapAlloc
#define tc_TrapAble tc_UnionETask.tc_ETrap.tc_ETrapAble
/* Macros */
#define GetTrapAlloc(t) \
({struct Task *_t = (struct Task *)t;\
(_t->tc_Flags & TF_ETASK) ? _t->tc_UnionETask.tc_ETask->et_TrapAlloc : \
_t->tc_UnionETask.tc_ETrap.tc_ETrapAlloc; \
})
#define GetTrapAble(t) \
({struct Task *_t = (struct Task *)t;\
(_t->tc_Flags & TF_ETASK) ? _t->tc_UnionETask.tc_ETask->et_TrapAble : \
_t->tc_UnionETask.tc_ETrap.tc_ETrapAble;\
})
#define GetETask(t) \
({struct Task *_t = (struct Task *)t;\
(_t->tc_Flags & TF_ETASK) ? _t->tc_UnionETask.tc_ETask : NULL; \
})
#define GetETaskID(t) \
({struct Task *_t = (struct Task *)t;\
(_t->tc_Flags & TF_ETASK) ? _t->tc_UnionETask.tc_ETask->et_UniqueID: 0UL; \
})
/* Stack swap structure as passed to StackSwap() */
struct StackSwapStruct
{
APTR stk_Lower; /* Lowest byte of stack */
APTR stk_Upper; /* Upper end of stack (size + Lowest) */
APTR stk_Pointer; /* Stack pointer at switch point */
};
struct StackSwapArgs
{
IPTR Args[8]; /* The C function arguments */
};
/* tc_Flags Bits */
#define TB_PROCTIME 0
#define TB_ETASK 3
#define TB_STACKCHK 4
#define TB_EXCEPT 5
#define TB_SWITCH 6
#define TB_LAUNCH 7
#define TF_PROCTIME (1L<<0)
#define TF_ETASK (1L<<3)
#define TF_STACKCHK (1L<<4)
#define TF_EXCEPT (1L<<5)
#define TF_SWITCH (1L<<6)
#define TF_LAUNCH (1L<<7)
/* Task States (tc_State) */
#define TS_INVALID 0
#define TS_ADDED 1
#define TS_RUN 2
#define TS_READY 3
#define TS_WAIT 4
#define TS_EXCEPT 5
#define TS_REMOVED 6
/* AROS specific */
#define TS_TOMBSTONED 7
#define TS_SPIN 8
/* Predefined Signals */
#define SIGB_ABORT 0
#define SIGB_CHILD 1
#define SIGB_BLIT 4 /* Note: same as SIGB_SINGLE */
#define SIGB_SINGLE 4 /* Note: same as SIGB_BLIT */
#define SIGB_INTUITION 5
#define SIGB_NET 7
#define SIGB_DOS 8
#define SIGF_ABORT (1L<<0)
#define SIGF_CHILD (1L<<1)
#define SIGF_BLIT (1L<<4)
#define SIGF_SINGLE (1L<<4)
#define SIGF_INTUITION (1L<<5)
#define SIGF_NET (1L<<7)
#define SIGF_DOS (1L<<8)
/* Define this when compiling MorphOS-compatible source */
#ifdef AROS_MORPHOS_COMPATIBLE
#define tc_ETask tc_UnionETask.tc_ETask
struct ETask
{
struct Message Message;
struct Task *Parent; /* Pointer to task */
ULONG UniqueID;
struct MinList Children; /* List of children */
UWORD TrapAlloc;
UWORD TrapAble;
ULONG Result1; /* First result */
APTR Result2; /* Result data pointer (AllocVec) */
struct MsgPort MsgPort;
void *MemPool;
void *Reserved[2];
void *RegFrame;
/* Internal fields follow */
};
#else
/* Extended Task structure */
struct ETask
{
struct Message et_Message;
APTR et_Parent; /* Pointer to parent task */
ULONG et_UniqueID;
struct MinList et_Children; /* List of children */
UWORD et_TrapAlloc;
UWORD et_TrapAble;
ULONG et_Result1; /* First result */
APTR et_Result2; /* Result data pointer (AllocVec) */
struct MsgPort et_TaskMsgPort;
void *et_MemPool; /* Task's private memory pool */
#ifdef __AROS__
IPTR et_Reserved[1]; /* MorphOS Private */
IPTR *et_TaskStorage; /* Task Storage Slots */
#else
IPTR et_Reserved[2]; /* MorphOS Private */
#endif
void *et_RegFrame;
/* Internal fields follow */
};
#endif
/* Return codes from new child functions */
#define CHILD_NOTNEW 1 /* Function not called from a new style task */
#define CHILD_NOTFOUND 2 /* Child not found */
#define CHILD_EXITED 3 /* Child has exited */
#define CHILD_ACTIVE 4 /* Child is currently active and running */
/* Tags for NewCreateTaskA() and NewAddTask() */
#define TASKTAG_Dummy (TAG_USER + 0x100000)
#define TASKTAG_ERROR (TASKTAG_Dummy + 0)
#define TASKTAG_CODETYPE (TASKTAG_Dummy + 1)
#define TASKTAG_PC (TASKTAG_Dummy + 2)
#define TASKTAG_FINALPC (TASKTAG_Dummy + 3)
#define TASKTAG_STACKSIZE (TASKTAG_Dummy + 4)
#define TASKTAG_NAME (TASKTAG_Dummy + 6)
#define TASKTAG_USERDATA (TASKTAG_Dummy + 7)
#define TASKTAG_PRI (TASKTAG_Dummy + 8)
#define TASKTAG_POOLPUDDLE (TASKTAG_Dummy + 9)
#define TASKTAG_POOLTHRESH (TASKTAG_Dummy + 10)
#define TASKTAG_ARG1 (TASKTAG_Dummy + 16)
#define TASKTAG_ARG2 (TASKTAG_Dummy + 17)
#define TASKTAG_ARG3 (TASKTAG_Dummy + 18)
#define TASKTAG_ARG4 (TASKTAG_Dummy + 19)
#define TASKTAG_ARG5 (TASKTAG_Dummy + 20)
#define TASKTAG_ARG6 (TASKTAG_Dummy + 21)
#define TASKTAG_ARG7 (TASKTAG_Dummy + 22)
#define TASKTAG_ARG8 (TASKTAG_Dummy + 23)
#define TASKTAG_STARTUPMSG (TASKTAG_Dummy + 24)
#define TASKTAG_TASKMSGPORT (TASKTAG_Dummy + 25)
#define TASKTAG_FLAGS (TASKTAG_Dummy + 26)
#define TASKTAG_TCBEXTRASIZE (TASKTAG_Dummy + 28)
#define TASKTAG_AFFINITY (TASKTAG_Dummy + 29)
#define TASKAFFINITY_BOOT 0
#define TASKAFFINITY_ANY ((IPTR)-1)
#define TASKAFFINITY_ALL_BUT_SELF ((IPTR)-2)
#define TASKERROR_OK 0
#define TASKERROR_NOMEMORY 1
/* Actions for ShutdownA() */
#define SD_ACTION_POWEROFF 0
#define SD_ACTION_COLDREBOOT 1
#define SD_ACTION_WARMREBOOT 2
#define SD_ACTION_MASK 0x00000007
#define SD_FLAG_EMERGENCY 0x00000008 /* Only the most basic/essential code should be executed */
#endif /* EXEC_TASKS_H */