1 /*
2 * kernel_manager.cpp
3 *
4 * This file is part of NEST.
5 *
6 * Copyright (C) 2004 The NEST Initiative
7 *
8 * NEST is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * NEST is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with NEST. If not, see <http://www.gnu.org/licenses/>.
20 *
21 */
22
23 #include "kernel_manager.h"
24
25 nest::KernelManager* nest::KernelManager::kernel_manager_instance_ = 0;
26
27 void
create_kernel_manager()28 nest::KernelManager::create_kernel_manager()
29 {
30 #pragma omp critical( create_kernel_manager )
31 {
32 if ( kernel_manager_instance_ == 0 )
33 {
34 kernel_manager_instance_ = new KernelManager();
35 assert( kernel_manager_instance_ );
36 }
37 }
38 }
39
40 void
destroy_kernel_manager()41 nest::KernelManager::destroy_kernel_manager()
42 {
43 kernel_manager_instance_->logging_manager.set_logging_level( M_QUIET );
44 delete kernel_manager_instance_;
45 }
46
KernelManager()47 nest::KernelManager::KernelManager()
48 : fingerprint_( 0 )
49 , logging_manager()
50 , mpi_manager()
51 , vp_manager()
52 , random_manager()
53 , simulation_manager()
54 , modelrange_manager()
55 , connection_manager()
56 , sp_manager()
57 , event_delivery_manager()
58 , model_manager()
59 , music_manager()
60 , node_manager()
61 , io_manager()
62 , managers( { &logging_manager,
63 &mpi_manager,
64 &vp_manager,
65 &random_manager,
66 &simulation_manager,
67 &modelrange_manager,
68 &model_manager,
69 &connection_manager,
70 &sp_manager,
71 &event_delivery_manager,
72 &music_manager,
73 &io_manager,
74 &node_manager } )
75 , initialized_( false )
76 {
77 }
78
~KernelManager()79 nest::KernelManager::~KernelManager()
80 {
81 }
82
83 void
initialize()84 nest::KernelManager::initialize()
85 {
86 for ( auto& m : managers )
87 {
88 m->initialize();
89 }
90
91 ++fingerprint_;
92
93 initialized_ = true;
94 }
95
96 void
prepare()97 nest::KernelManager::prepare()
98 {
99 for ( auto& m : managers )
100 {
101 m->prepare();
102 }
103 }
104
105 void
cleanup()106 nest::KernelManager::cleanup()
107 {
108 for ( auto&& m_it = managers.rbegin(); m_it != managers.rend(); ++m_it )
109 {
110 ( *m_it )->cleanup();
111 }
112 }
113
114 void
finalize()115 nest::KernelManager::finalize()
116 {
117 initialized_ = false;
118
119 for ( auto&& m_it = managers.rbegin(); m_it != managers.rend(); ++m_it )
120 {
121 ( *m_it )->finalize();
122 }
123 }
124
125 void
reset()126 nest::KernelManager::reset()
127 {
128 finalize();
129 initialize();
130 }
131
132 void
change_number_of_threads(thread new_num_threads)133 nest::KernelManager::change_number_of_threads( thread new_num_threads )
134 {
135 node_manager.finalize();
136 connection_manager.finalize();
137 model_manager.finalize();
138 modelrange_manager.finalize();
139 random_manager.finalize();
140
141 vp_manager.set_num_threads( new_num_threads );
142
143 random_manager.initialize();
144 modelrange_manager.initialize();
145 model_manager.initialize();
146 connection_manager.initialize();
147 event_delivery_manager.initialize();
148 music_manager.initialize();
149 node_manager.initialize();
150
151 for ( auto& manager : managers )
152 {
153 manager->change_num_threads( new_num_threads );
154 }
155 }
156
157 void
set_status(const DictionaryDatum & dict)158 nest::KernelManager::set_status( const DictionaryDatum& dict )
159 {
160 assert( is_initialized() );
161
162 for ( auto& manager : managers )
163 {
164 manager->set_status( dict );
165 }
166 }
167
168 void
get_status(DictionaryDatum & dict)169 nest::KernelManager::get_status( DictionaryDatum& dict )
170 {
171 assert( is_initialized() );
172
173 for ( auto& manager : managers )
174 {
175 manager->get_status( dict );
176 }
177 }
178