ChimeraTK-ApplicationCore 04.06.00
Loading...
Searching...
No Matches
CircularDependencyDetector.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Deutsches Elektronen-Synchrotron DESY, MSK, ChimeraTK Project <chimeratk-support@desy.de>
2// SPDX-License-Identifier: LGPL-3.0-or-later
3#pragma once
4
5#include "Module.h"
7
8#include <boost/noncopyable.hpp>
9#include <boost/thread.hpp>
10
11#include <map>
12#include <ostream>
13#include <unordered_set>
14
15namespace ChimeraTK::detail {
16
18 struct CircularDependencyDetector : boost::noncopyable {
19 CircularDependencyDetector() = default;
20 ~CircularDependencyDetector();
21
24 void registerDependencyWait(VariableNetworkNode& node);
25
28 void unregisterDependencyWait(VariableNetworkNode& node);
29
33 void printWaiters(std::ostream& stream = std::cout);
34
36 void terminate();
37
39 void startDetectBlockedModules();
40
42 void detectBlockedModules();
43
44 protected:
45 std::mutex _mutex;
46 std::map<Module*, Module*> _waitMap;
47 std::map<Module*, std::string> _awaitedVariables;
48 std::map<EntityOwner*, VariableNetworkNode> _awaitedNodes;
49 std::unordered_set<Module*> _modulesWeHaveWarnedAbout;
50 std::unordered_set<std::string> _devicesWeHaveWarnedAbout;
51 std::unordered_set<NodeType> _otherThingsWeHaveWarnedAbout;
52 boost::thread _thread;
53
54 private:
55 };
56} // namespace ChimeraTK::detail