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