#ifndef __INC_POS_PEXEC_TASK_H
#define __INC_POS_PEXEC_TASK_H
/*******************************************************************
 Includes Release 24
 (C) Copyright 1995-1997 proDAD
     All Rights Reserved

 $AUT Holger Burkarth
 $DAT >>Task.h<<   13 Feb 1997    09:53:18 - (C) ProDAD
*******************************************************************/
#ifndef __INC_POS_PEXEC_NODE_H
#include <pExec/Node.h>
#endif


/*----------------------------------
-----------------------------------*/
struct pOS_Task
{
  struct pOS_ExNode tc_Node;
  UBYTE             tc_Flags;
  UBYTE             tc_State;          /* (enum pOS_TaskStates) */
  SBYTE             tc_IDNestCnt;      /* intr disabled nesting*/
  SBYTE             tc_TDNestCnt;      /* task disabled nesting*/
  ULONG             tc_SigAlloc;       /* sigs allocated */
  ULONG             tc_SigWait;        /* sigs we are waiting for */
  ULONG             tc_SigRecvd;       /* sigs we have received */
  ULONG             tc_SigExcept;      /* sigs we will take excepts for */
  UWORD             tc_TrapAlloc;      /* traps allocated */
  UWORD             tc_TrapAble;       /* traps enabled */
  APTR              tc_ExceptData;     /* points to except data */
  APTR              tc_ExceptCode;     /* points to except code */
  APTR              tc_TrapData;       /* points to trap data */
  APTR              tc_TrapCode;       /* points to trap code */
  APTR              tc_SPReg;          /* stack pointer        */
  APTR              tc_SPLower;        /* stack lower bound    */
  APTR              tc_SPUpper;        /* stack upper bound + 2*/
  VOID            (*tc_Switch)(VOID);  /* task losing CPU    */
  VOID            (*tc_Launch)(VOID);  /* task getting CPU  */
  struct pOS_ExList tc_MemEntry;       /* Allocated memory. Freed by RemTask() */
  UWORD             tc_NestSemCnt;     /* Semaphore nesting */
  SBYTE             tc_SysTcPri;
  UBYTE             tc_Pad;
  UBYTE tc_Reserved[20];

  struct pOS_TaskInfo    *tc_Info;
  struct pOS_TaskControl *tc_Control;
  struct pOS_Task        *tc_FriendTask;  /* For friend talk (will be set in pOS_CreateTask() */
  ULONG                   tc_UserData[2]; /* For use by the task; no restrictions! */
};



enum pOS_TaskStates
{
  TKSTA_INVALID=0,
  TKSTA_ADDED,
  TKSTA_RUN,
  TKSTA_READY,
  TKSTA_WAIT,
  TKSTA_EXCEPT,
  TKSTA_REMOVED
};


enum pOS_TaskSignal
{
  SIGB_AllocAny=-1,  /* pOS_AllocSignal(,SIGB_AllocAny) => nächstes freies Signal */
  SIGB_NoSignal=-1,  /* return from pOS_AllocSignal() => kein freies Signal gefunden */

  SIGB_Semaphore = 4,
  SIGB_Internal  = 4, /** Achtung: wie Semaphore **/
  SIGB_Signal    = 5,
  SIGB_Dos       = 8,

  SIGF_Semaphore = 0x0010,
  SIGF_Internal  = 0x0010,
  SIGF_Signal    = 0x0020, /* Public-User - Signal, system do not use this */
  SIGF_Dos       = 0x0100
};




/*----------------------------------
-----------------------------------*/
struct pOS_StackSwapData
{
  APTR  stk_Lower;    /* Lowest byte of stack */
  APTR  stk_Upper;    /* Upper end of stack (size + Lowest) */
  APTR  stk_Pointer;  /* Stack pointer at switch point */
};



/** pOS_SetTaskXPri() **/
enum pOS_SetTaskXPriMode
{
  TKXPDMD_None          = 0x0000,
  TKXPDMD_UseSPri       = 0x0001,       /* SysPri setzen */
  TKXPDMD_IgnoreSPri    = 0x0000,

  TKXPDMD_NoSem         = 0x0080        /* Speziallfall nur intern */
};




#endif
