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