use GET_THIS_TASK internally throughout exec - since it will result in faster/smaller...
[AROS.git] / rom / exec / childstatus.c
blob5bfd1d1248ff80ad8d7985a4b59ef859ad32ac7a
1 /*
2 Copyright © 1995-2015, The AROS Development Team. All rights reserved.
3 $Id$
5 Find out the status of a child task.
6 */
7 #include "exec_intern.h"
8 #include <proto/exec.h>
10 /*****************************************************************************
12 NAME */
14 AROS_LH1(ULONG, ChildStatus,
16 /* SYNOPSIS */
17 AROS_LHA(ULONG, tid, D0),
19 /* LOCATION */
20 struct ExecBase *, SysBase, 125, Exec)
22 /* FUNCTION
23 Return the status of a child task. This allows the Task to
24 determine whether a particular child task is still running or not.
26 INPUTS
27 tid -- The ID of the task to examine. Note that ThisTask is _NOT_
28 a task pointer.
30 RESULT
31 One of the CHILD_* values.
33 NOTES
34 This function will work correctly only for child tasks that are
35 processes created with NP_NotifyOnDeath set to TRUE. Otherwise
36 it may report CHILD_NOTFOUND even if child already exited.
38 EXAMPLE
40 BUGS
42 SEE ALSO
44 INTERNALS
46 *****************************************************************************/
48 AROS_LIBFUNC_INIT
50 struct Task *ThisTask = GET_THIS_TASK;
51 struct ETask *et;
52 struct ETask *child;
53 ULONG status = CHILD_NOTFOUND;
55 if ((ThisTask->tc_Flags & TF_ETASK) == 0)
56 return CHILD_NOTNEW;
58 et = ThisTask->tc_UnionETask.tc_ETask;
60 /* Sigh... */
61 Forbid();
63 /* Search through the running tasks list */
64 ForeachNode(&et->et_Children, child)
66 if (child->et_UniqueID == tid)
68 status = CHILD_ACTIVE;
69 break;
73 ForeachNode(&et->et_TaskMsgPort.mp_MsgList, child)
75 if (child->et_UniqueID == tid)
77 status = CHILD_EXITED;
78 break;
82 Permit();
83 return status;
85 AROS_LIBFUNC_EXIT
86 } /* ChildStatus */