/************************************************************
* MultiUser - MultiUser Task/File Support System				*
* ---------------------------------------------------------	*
* Task Management Routines												*
* ---------------------------------------------------------	*
* © Copyright 1993-1994 Geert Uytterhoeven						*
* All Rights Reserved.													*
************************************************************/


#include "multiuser.h"


	/*
	 *		Private Task Level Node
	 */

struct muTaskLevel {
	struct MinNode Node;
	struct MinList Tasks;			/* List of Tasks in this Level */
	struct MinList Children;		/* List of Child Levels */
	struct muTaskLevel *Parent;
	struct muExtOwner Owner;		/* This MUST be the last member!! */
};


	/*
	 *		Private Task Node
	 */

struct muTaskNode {
	struct MinNode LevelNode;		/* In Level */
	struct MinNode ListNode;		/* In Task List */
	struct Task *Task;
	ULONG DefProtection;				/* Default Protection Bits */
	struct muTaskLevel *Level;
};


	/*
	 *		Extended Owner Information Structure for root
	 */

extern struct muExtOwner RootExtOwner;


	/*
	 *		Function Prototypes
	 */


extern void InitTaskList(void);
extern struct muTaskNode *CreateOrphanTask(struct Task *task, ULONG defprotection);
extern void RemAllTaskNodes(void);
extern struct muExtOwner *PushTask(struct Task *task, struct muExtOwner *owner);
extern struct muExtOwner *PushTaskLevel(struct Task *task, struct muExtOwner *owner);
extern struct muExtOwner *PopTask(struct Task *task);
extern struct muExtOwner *PopTaskLevel(struct Task *task);
extern struct muExtOwner *GetTaskOwner(struct Task *task);
extern ULONG GetTaskDefProtect(struct Task *task);
extern BOOL SetTaskDefProtect(struct Task *task, ULONG defprotection);
extern BOOL SetLevelDefProtect(struct Task *task, ULONG defprotection);
extern APTR __asm __saveds NEWAddTask(register __a1 struct Task *task, register __a2 APTR initpc,
												  register __a3 APTR finalpc,
												  register __a6 struct ExecBase *sysbase);
extern void __asm __saveds NEWRemTask(register __a1 struct Task *task,
												  register __a6 struct ExecBase *sysbase);
extern ULONG __asm __saveds muGetTaskOwner(register __d0 struct Task *task);
extern struct muExtOwner __asm __saveds *muGetTaskExtOwner(register __d0 struct Task *task);
extern void __asm __saveds muFreeExtOwner(register __a0 struct muExtOwner *owner);
extern BOOL __asm __saveds muKill(register __d0 struct Task *task);
extern BOOL __asm __saveds muFreeze(register __d0 struct Task *task);
extern BOOL __asm __saveds muUnfreeze(register __d0 struct Task *task);
