Unit CreateAndDeleteTask; { Jens Gelhar 25.01.91 - Von C nach Pascal umgeschrieben - Die beiden Exec-Support-Funktionen "CreateTask" und "DeleteTask" sind im Unit "ExecSupport" nicht enthalten. Dieses Unit stellt sie zur Verfügung. WARNUNG: Kickpascal-Code ist absolut nicht re-entrant! Es ist deshalb völlig unmöglich, einen Bestandteil eines Pascal-Programms mit CreateTask zu starten! Als Code für CreateTask muß deshalb eine in Assembler oder C geschriebene Routine dienen, oder ein (ggf. auch mit Kickpascal erstelltes) mit "LoadSeg" aus einer Datei geladenes Programm- Segment (in diesem Fall wäre aber die Verwendung von "CreateProc" wesentlich klüger). } Interface Uses Exec1, ExecSupport; Function CreateTask (name: Str; pri: Byte; initPC: Ptr; stacksize: Long) : p_Task; Procedure DeleteTask (tc: p_Task); Implementation {$incl 'exec/memory.h' } Const ME_TASK = 0; ME_STACK = 1; NUMENTRIES = 2; Type FakeMemEntry = Record fme_Regs, fme_Length: Long End; FakeMemList = Record fml_Node: Node; fml_NumEntries: Word; fml_ME: Array[0..NUMENTRIES-1] of FakeMemEntry End; Var TaskMemTemplate: FakeMemList; Function CreateTask; Var newTask: p_Task; memSize: Long; fmlist: FakeMemList; ml: p_MemList; Begin stackSize := (stacksize+3) and Long(not 3); fmlist := TaskMemTemplate; fmlist.fml_ME[ME_STACK].fme_Length := stackSize; ml := Ptr (AllocEntry (^fmList)); If ml=Nil then begin CreateTask := Nil; Exit End; newTask := p_Task(ml^.ml_ME[ME_TASK].meu_Addr); With NewTask^, tc_Node Begin tc_SPLower := ml^.ml_ME[ME_TASK].meu_Addr; tc_SPUpper := Ptr(Long(tc_SPLower) + stacksize); tc_SPReg := tc_SPUpper; ln_Type := NT_TASK; ln_Pri := pri; ln_Name := name End; NewList (^newTask^.tc_MemEntry); AddHead (^newTask^.tc_MemEntry, ^ml^.ml_Node); AddTask (newTask, Long(initPC), 0); CreateTask := newTask; End; Procedure DeleteTask; Begin RemTask(tc) End; Begin { Init } TaskMemTemplate := FakeMemList ( (Nil, Nil, 0, 0, Nil), NUMENTRIES, ((MEMF_PUBLIC or MEMF_CLEAR, SizeOf(Task)), (MEMF_CLEAR, 0)) ); End.