xref: /haiku/src/apps/haikudepot/process/AbstractProcessNode.h (revision 7323d0a21daaded71c6231c5b7bcba9db4024a40)
1 /*
2  * Copyright 2018-2021, Andrew Lindesay <apl@lindesay.co.nz>.
3  * All rights reserved. Distributed under the terms of the MIT License.
4  */
5 #ifndef ABSTRACT_PROCESS_NODE_H
6 #define ABSTRACT_PROCESS_NODE_H
7 
8 
9 #include <ObjectList.h>
10 #include <OS.h>
11 
12 
13 class AbstractProcess;
14 
15 
16 /*! This class is designed to be used by the ProcessCoordinator class.  The
17     purpose of the class is to hold a process and also any dependent processes
18     of this one.  This effectively creates a dependency tree of processes.
19 */
20 
21 class AbstractProcessNode {
22 public:
23 								AbstractProcessNode(AbstractProcess* process);
24 	virtual						~AbstractProcessNode();
25 
26 			AbstractProcess*	Process() const;
27 	virtual	status_t			Start() = 0;
28 	virtual	status_t			RequestStop() = 0;
29 
30 			void				AddPredecessor(AbstractProcessNode* node);
31 			int32				CountPredecessors() const;
32 			AbstractProcessNode*
33 								PredecessorAt(int32 index) const;
34 			bool				AllPredecessorsComplete() const;
35 
36 			int32				CountSuccessors() const;
37 			AbstractProcessNode*
38 								SuccessorAt(int32 index) const;
39 
40 protected:
41 			status_t			_SpinUntilProcessState(
42 									uint32 desiredStatesMask,
43 									int32 timeoutSeconds);
44 
45 private:
46 			void				_AddSuccessor(AbstractProcessNode* node);
47 
48 			AbstractProcess*	fProcess;
49 			BObjectList<AbstractProcessNode>
50 								fPredecessorNodes;
51 			BObjectList<AbstractProcessNode>
52 								fSuccessorNodes;
53 };
54 
55 
56 #endif // ABSTRACT_PROCESS_NODE_H
57