/* Create & DeleteTask nach James M. Synge! */

 struct Task *CreateTask(Task_Name,Priority,Startup_Routine,Cleanup_Routine,Stack_Size)
  char	*Task_Name;
  int 	 Priority;
  void (*Startup_Routine)(),(*Cleanup_Routine)();
  int 	 Stack_Size;
  {
  register struct Task *Child;
  register APTR Child_Stack;

	 /* Speicher für Stack und Strucktur festlegen */
  if (!(Child_Stack = AllocMem(Stack_Size , MEMF_CLEAR)))
	{ return(NULL) ; }

  if(!(Child=(struct Task *)
		 AllocMem(sizeof(struct Task),MEMF_CLEAR|MEMF_PUBLIC)))
	 { FreeMem(Child_Stack, Stack_Size) ; return(NULL) ; }

	 /* Taskstruktur intialisieren und den Task starten */
  Child>tc_SPLower = Child_Stack;
  Child>tc_SPReg	 =
  Child>tc_SPUpper = (APTR)((ULONG)Child_Stack+(ULONG)Stack_Size);
  Child>tc_Node.ln_Type = NT_TASK;
  Child>tc_Node.ln_Pri = Priority;
  Child>tc_Node.ln_Name = Task_Name;
  AddTask(Child, Startup_Routine, Cleanup_Routine);
  return(Child);
  }

 void DeleteTask(Child)
  register struct Task *Child ;
  {
	register ULONG Stack_Size;
	if (Child == NULL) return ; Forbid();
  if (Child>tc_Node.ln_Type!= NT_TASK)
	{ Permit() ; return ; }
  /* Stackgröße bestimmen, Stack und Taskstruktur freigeben */
	  Stack_Size =(ULONG)(Child>tc_SPUpper)(ULONG)(Child>tc_SPLower);
	  FreeMem(Child>tc_SPLower, Stack_Size);
	  FreeMem(Child, sizeof(struct Task));

  /* Den Task aus der Liste entfernen */
	 RemTask(Child); Permit();
	 return;
  }

 char  *ChangeTaskName(Name)
  char  *Name				;
  {
	register 		 char *OldName  ;
	register struct Task *ThisTask ;
	Forbid() ;
	ThisTask = FindTask(0l) ;
	OldName = ThisTask>tc_Node.ln_Name ;
	ThisTask>tc_Node.ln_Name = Name;
	Permit() ;
	return(OldName) ;
  }
/* LISTING Ende */
