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