From 3f299333ccfd4124746ce87e763679d7698c0434 Mon Sep 17 00:00:00 2001 From: Stephen Berry Date: Tue, 5 Sep 2017 12:01:37 -0500 Subject: [PATCH] Switched to recursive mutex Removed namespaces_nested_ref.chai --- include/chaiscript/language/chaiscript_engine.hpp | 13 ++++++++++++- unittests/namespaces_nested_ref.chai | 9 --------- 2 files changed, 12 insertions(+), 10 deletions(-) delete mode 100644 unittests/namespaces_nested_ref.chai diff --git a/include/chaiscript/language/chaiscript_engine.hpp b/include/chaiscript/language/chaiscript_engine.hpp index fe484ca8..6a96f132 100644 --- a/include/chaiscript/language/chaiscript_engine.hpp +++ b/include/chaiscript/language/chaiscript_engine.hpp @@ -718,7 +718,7 @@ namespace chaiscript /// \throw std::runtime_error In the case that the namespace name was never registered. void import(const std::string& t_namespace_name) { - chaiscript::detail::threading::shared_lock l(m_mutex); + chaiscript::detail::threading::unique_lock l(m_use_mutex); if (m_namespaces.count(t_namespace_name)) { add_namespace(t_namespace_name); @@ -737,6 +737,8 @@ namespace chaiscript /// \throw std::runtime_error In the case that the namespace name was already registered. void register_namespace(const std::string& t_namespace_name) { + chaiscript::detail::threading::unique_lock l(m_use_mutex); + if (!m_namespaces.count(t_namespace_name)) { m_namespaces.emplace(std::make_pair(t_namespace_name, dispatch::Dynamic_Object())); } @@ -751,6 +753,8 @@ namespace chaiscript /// \throw std::runtime_error In the case that the namespace name was already registered. void register_namespace(const dispatch::Dynamic_Object& t_namespace_object, const std::string& t_namespace_name) { + chaiscript::detail::threading::unique_lock l(m_use_mutex); + if (!m_namespaces.count(t_namespace_name)) { m_namespaces.emplace(std::make_pair(t_namespace_name, t_namespace_object)); } @@ -765,9 +769,14 @@ namespace chaiscript /// \throw std::runtime_error In the case that the namespace name was already registered. void register_namespace(dispatch::Dynamic_Object&& t_namespace_object, const std::string& t_namespace_name) { + chaiscript::detail::threading::unique_lock l(m_use_mutex); + if (!m_namespaces.count(t_namespace_name)) { m_namespaces.emplace(std::make_pair(t_namespace_name, t_namespace_object)); } + else { + throw std::runtime_error("Namespace: " + t_namespace_name + " was already registered."); + } } /// \brief Registers a namespace generator, which delays generation of the namespace until it is imported, saving memory if it is never used. @@ -776,6 +785,8 @@ namespace chaiscript /// \throw std::runtime_error In the case that the namespace name was already registered. void register_namespace(const std::function& t_namespace_generator, const std::string& t_namespace_name) { + chaiscript::detail::threading::unique_lock l(m_use_mutex); + if (!m_namespaces.count(t_namespace_name)) { std::function namespace_generator = [=]() { register_namespace(t_namespace_generator(), t_namespace_name); }; m_namespace_generators.emplace(std::make_pair(t_namespace_name, namespace_generator)); diff --git a/unittests/namespaces_nested_ref.chai b/unittests/namespaces_nested_ref.chai deleted file mode 100644 index 5be991cb..00000000 --- a/unittests/namespaces_nested_ref.chai +++ /dev/null @@ -1,9 +0,0 @@ -namespace("parent") -namespace("child") - -child.x = 3.0 -parent.child := child -parent.child.x = 5.0 - -assert_equal(5.0, child.x) -assert_equal(5.0, parent.child.x) \ No newline at end of file