2
3
5#include <so_5/impl/layer_core.hpp>
7#include <so_5/details/rollback_on_exception.hpp>
29 const layer_map_t::value_type & v )
37 const std::type_index & type,
38 const layer_ref_t & layer )
48 return m_true_type < tl.m_true_type;
57 layer_map_t && so_layers )
62 std::for_each( m_default_layers.begin(), m_default_layers.end(),
63 [
this]( so_layer_list_t::value_type & item )
65 item.m_layer->bind_to_environment( &m_env );
78 auto search_result = std::lower_bound( layers.begin(), layers.end(),
80 [](
const so_layer_list_t::value_type & a,
const std::type_index & b )
82 return a.m_true_type < b;
84 if( search_result != layers.end() && search_result->m_true_type == type )
92 const std::type_index & type )
const
95 so_layer_list_t::const_iterator layer_it = search_for_layer(
99 if( m_default_layers.end() != layer_it )
100 return layer_it->m_layer.get();
103 std::lock_guard< std::mutex > lock( m_extra_layers_lock );
105 layer_it = search_for_layer(
109 if( m_extra_layers.end() != layer_it )
110 return layer_it->m_layer.get();
118 so_layer_list_t::iterator
119 it = m_default_layers.begin(),
120 it_end = m_default_layers.end();
122 for(; it != it_end; ++it )
124 so_5::details::do_with_rollback_on_exception(
125 [&] { it->m_layer->start(); },
128 m_default_layers.begin(),
130 []( typed_layer_ref_t & l ) { l.m_layer->shutdown(); } );
133 m_default_layers.begin(),
135 []( typed_layer_ref_t & l ) { l.m_layer->wait(); } );
154 const std::type_index & type,
155 const layer_ref_t & layer )
157 if(
nullptr == layer.get() )
159 rc_trying_to_add_nullptr_extra_layer,
160 "trying to add nullptr extra layer" );
162 if( m_default_layers.end() != search_for_layer( m_default_layers, type ) )
164 rc_trying_to_add_extra_layer_that_already_exists_in_default_list,
165 "trying to add extra layer that already exists in default list" );
167 std::lock_guard< std::mutex > lock( m_extra_layers_lock );
169 if( m_extra_layers.end() != search_for_layer( m_extra_layers, type ) )
171 rc_trying_to_add_extra_layer_that_already_exists_in_extra_list,
172 "trying to add extra layer that already exists in extra list" );
174 layer->bind_to_environment( &m_env );
180 catch(
const std::exception & x )
183 rc_unable_to_start_extra_layer,
184 std::string(
"layer raised an exception: " ) + x.what() );
191 m_extra_layers.insert(
193 m_extra_layers.begin(),
194 m_extra_layers.end(),
198 catch(
const std::exception & x )
206 rc_unable_to_start_extra_layer,
207 std::string(
"unable to store pointer to layer, exception: " ) +
212#if defined(__clang__
)
213#pragma clang diagnostic push
214#pragma clang diagnostic ignored "-Wmissing-prototypes"
220 tl.m_layer->shutdown();
228#if defined(__clang__
)
229#pragma clang diagnostic pop
236 m_extra_layers.begin(),
237 m_extra_layers.end(),
245 m_extra_layers.begin(),
246 m_extra_layers.end(),
249 m_extra_layers.clear();
256 m_default_layers.begin(),
257 m_default_layers.end(),
265 m_default_layers.begin(),
266 m_default_layers.end(),
An utility class for working with layers.
void shutdown_default_layers()
Shutdown default layers.
environment_t & m_env
SObjectizer Environment to work with.
layer_t * query_layer(const std::type_index &type) const
Get a layer.
void shutdown_extra_layers()
Shutdown extra layers.
void add_extra_layer(const std::type_index &type, const layer_ref_t &layer)
Add an extra layer.
void start()
Start all layers.
layer_core_t(environment_t &env, layer_map_t &&so_layers)
void wait_extra_layers()
Blocking wait for the complete shutdown of all extra layers.
void wait_default_layers()
Blocking wait for the complete shutdown of all default layers.
void finish()
Shutdown all layers and wait for full stop of them.
An interface of the additional SObjectizer Environment layer.
#define SO_5_THROW_EXCEPTION(error_code, desc)
Details of SObjectizer run-time implementations.
so_layer_list_t::const_iterator search_for_layer(const so_layer_list_t &layers, const std::type_index &type)
Find layer in container.
void call_shutdown(typed_layer_ref_t &tl)
void call_wait(typed_layer_ref_t &tl)
Private part of message limit implementation.
A special wrapper to store a layer with its type.
bool operator<(const typed_layer_ref_t &tl) const
typed_layer_ref_t(const std::type_index &type, const layer_ref_t &layer)
typed_layer_ref_t(const layer_map_t::value_type &v)