add lock_guard to protect against data races in initialization of scripting environment
rename function names to reduce camel case noise
This commit is contained in:
		
							parent
							
								
									3dddd16ec7
								
							
						
					
					
						commit
						2e5876d488
					
				| @ -155,7 +155,7 @@ int Extractor::Run(int argc, char *argv[]) | |||||||
|             resulting_restrictions; |             resulting_restrictions; | ||||||
| 
 | 
 | ||||||
|         // setup restriction parser
 |         // setup restriction parser
 | ||||||
|         const RestrictionParser restriction_parser(scripting_environment.getLuaState()); |         const RestrictionParser restriction_parser(scripting_environment.get_lua_state()); | ||||||
| 
 | 
 | ||||||
|         while (const osmium::memory::Buffer buffer = reader.read()) |         while (const osmium::memory::Buffer buffer = reader.read()) | ||||||
|         { |         { | ||||||
| @ -181,12 +181,14 @@ int Extractor::Run(int argc, char *argv[]) | |||||||
|                     ExtractionNode result_node; |                     ExtractionNode result_node; | ||||||
|                     ExtractionWay result_way; |                     ExtractionWay result_way; | ||||||
| 
 | 
 | ||||||
|  |                     lua_State * local_state = scripting_environment.get_lua_state();  | ||||||
|  | 
 | ||||||
|                     switch (entity->type()) |                     switch (entity->type()) | ||||||
|                     { |                     { | ||||||
|                     case osmium::item_type::node: |                     case osmium::item_type::node: | ||||||
|                         ++number_of_nodes; |                         ++number_of_nodes; | ||||||
|                         luabind::call_function<void>( |                         luabind::call_function<void>( | ||||||
|                             scripting_environment.getLuaState(), |                             local_state, | ||||||
|                             "node_function", |                             "node_function", | ||||||
|                             boost::cref(static_cast<const osmium::Node &>(*entity)), |                             boost::cref(static_cast<const osmium::Node &>(*entity)), | ||||||
|                             boost::ref(result_node)); |                             boost::ref(result_node)); | ||||||
| @ -195,7 +197,7 @@ int Extractor::Run(int argc, char *argv[]) | |||||||
|                     case osmium::item_type::way: |                     case osmium::item_type::way: | ||||||
|                         ++number_of_ways; |                         ++number_of_ways; | ||||||
|                         luabind::call_function<void>( |                         luabind::call_function<void>( | ||||||
|                             scripting_environment.getLuaState(), |                             local_state, | ||||||
|                             "way_function", |                             "way_function", | ||||||
|                             boost::cref(static_cast<const osmium::Way &>(*entity)), |                             boost::cref(static_cast<const osmium::Way &>(*entity)), | ||||||
|                             boost::ref(result_way)); |                             boost::ref(result_way)); | ||||||
|  | |||||||
| @ -60,13 +60,13 @@ int lua_error_callback(lua_State *L) // This is so I can use my own function as | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ScriptingEnvironment::ScriptingEnvironment(const char *file_name) | ScriptingEnvironment::ScriptingEnvironment(const std::string &file_name) | ||||||
| : file_name(file_name) | : file_name(file_name) | ||||||
| { | { | ||||||
|     SimpleLogger().Write() << "Using script " << file_name; |     SimpleLogger().Write() << "Using script " << file_name; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ScriptingEnvironment::initLuaState(lua_State* lua_state) | void ScriptingEnvironment::init_lua_state(lua_State* lua_state) | ||||||
| { | { | ||||||
|     typedef double (osmium::Location::* location_member_ptr_type)() const; |     typedef double (osmium::Location::* location_member_ptr_type)() const; | ||||||
| 
 | 
 | ||||||
| @ -129,18 +129,18 @@ void ScriptingEnvironment::initLuaState(lua_State* lua_state) | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| lua_State *ScriptingEnvironment::getLuaState() | lua_State *ScriptingEnvironment::get_lua_state() | ||||||
| { | { | ||||||
|  |     std::lock_guard<std::mutex> lock(init_mutex); | ||||||
|     bool initialized = false; |     bool initialized = false; | ||||||
|     auto& ref = script_contexts.local(initialized); |     auto& ref = script_contexts.local(initialized); | ||||||
|     if (!initialized) |     if (!initialized) | ||||||
|     { |     { | ||||||
|         std::shared_ptr<lua_State> state(luaL_newstate(), lua_close); |         std::shared_ptr<lua_State> state(luaL_newstate(), lua_close); | ||||||
|         ref = state; |         ref = state; | ||||||
|         initLuaState(ref.get()); |         init_lua_state(ref.get()); | ||||||
|     } |     } | ||||||
|     luabind::set_pcall_callback(&lua_error_callback); |     luabind::set_pcall_callback(&lua_error_callback); | ||||||
| 
 | 
 | ||||||
|     return ref.get(); |     return ref.get(); | ||||||
| } | } | ||||||
| 
 |  | ||||||
|  | |||||||
| @ -30,6 +30,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||||
| 
 | 
 | ||||||
| #include <string> | #include <string> | ||||||
| #include <memory> | #include <memory> | ||||||
|  | #include <mutex> | ||||||
| #include <tbb/enumerable_thread_specific.h> | #include <tbb/enumerable_thread_specific.h> | ||||||
| 
 | 
 | ||||||
| struct lua_State; | struct lua_State; | ||||||
| @ -38,13 +39,13 @@ class ScriptingEnvironment | |||||||
| { | { | ||||||
|   public: |   public: | ||||||
|     ScriptingEnvironment() = delete; |     ScriptingEnvironment() = delete; | ||||||
|     explicit ScriptingEnvironment(const char *file_name); |     explicit ScriptingEnvironment(const std::string &file_name); | ||||||
| 
 | 
 | ||||||
|     lua_State *getLuaState(); |     lua_State *get_lua_state(); | ||||||
| 
 | 
 | ||||||
|   private: |   private: | ||||||
|     void initLuaState(lua_State* lua_state); |     void init_lua_state(lua_State* lua_state); | ||||||
| 
 |     std::mutex init_mutex;  | ||||||
|     std::string file_name; |     std::string file_name; | ||||||
|     tbb::enumerable_thread_specific<std::shared_ptr<lua_State>> script_contexts; |     tbb::enumerable_thread_specific<std::shared_ptr<lua_State>> script_contexts; | ||||||
| }; | }; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user