Switched to recursive mutex

Removed namespaces_nested_ref.chai
This commit is contained in:
Stephen Berry 2017-09-05 12:01:37 -05:00
parent 08abf41dfb
commit 3f299333cc
2 changed files with 12 additions and 10 deletions

View File

@ -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<chaiscript::detail::threading::shared_mutex> l(m_mutex);
chaiscript::detail::threading::unique_lock<chaiscript::detail::threading::recursive_mutex> 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<chaiscript::detail::threading::recursive_mutex> 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<chaiscript::detail::threading::recursive_mutex> 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<chaiscript::detail::threading::recursive_mutex> 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<dispatch::Dynamic_Object()>& t_namespace_generator, const std::string& t_namespace_name)
{
chaiscript::detail::threading::unique_lock<chaiscript::detail::threading::recursive_mutex> l(m_use_mutex);
if (!m_namespaces.count(t_namespace_name)) {
std::function<void()> namespace_generator = [=]() { register_namespace(t_namespace_generator(), t_namespace_name); };
m_namespace_generators.emplace(std::make_pair(t_namespace_name, namespace_generator));

View File

@ -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)