feat(library): add shared environment object
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
3726688711
commit
dd3edcb19f
3 changed files with 74 additions and 1 deletions
|
@ -1,6 +1,7 @@
|
|||
add_library(library deep_copy.cpp expr_lt.cpp io_state.cpp occurs.cpp
|
||||
kernel_bindings.cpp io_state_stream.cpp bin_app.cpp
|
||||
resolve_macro.cpp kernel_serializer.cpp max_sharing.cpp normalize.cpp)
|
||||
resolve_macro.cpp kernel_serializer.cpp max_sharing.cpp
|
||||
normalize.cpp shared_environment.cpp)
|
||||
# placeholder.cpp fo_unify.cpp hop_match.cpp)
|
||||
|
||||
target_link_libraries(library ${LEAN_LIBS})
|
||||
|
|
32
src/library/shared_environment.cpp
Normal file
32
src/library/shared_environment.cpp
Normal file
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
Copyright (c) 2014 Microsoft Corporation. All rights reserved.
|
||||
Released under Apache 2.0 license as described in the file LICENSE.
|
||||
|
||||
Author: Leonardo de Moura
|
||||
*/
|
||||
#include "library/shared_environment.h"
|
||||
|
||||
namespace lean {
|
||||
shared_environment::shared_environment() {}
|
||||
shared_environment::shared_environment(environment const & env):m_env(env) {}
|
||||
|
||||
environment shared_environment::get_environment() const {
|
||||
shared_lock l(m_mutex);
|
||||
return m_env;
|
||||
}
|
||||
|
||||
void shared_environment::add(certified_declaration const & d) {
|
||||
exclusive_lock l(m_mutex);
|
||||
m_env = m_env.add(d);
|
||||
}
|
||||
|
||||
void shared_environment::replace(certified_declaration const & t) {
|
||||
exclusive_lock l(m_mutex);
|
||||
m_env = m_env.replace(t);
|
||||
}
|
||||
|
||||
void shared_environment::update(std::function<environment(environment const &)> const & f) {
|
||||
exclusive_lock l(m_mutex);
|
||||
m_env = f(m_env);
|
||||
}
|
||||
}
|
40
src/library/shared_environment.h
Normal file
40
src/library/shared_environment.h
Normal file
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
Copyright (c) 2014 Microsoft Corporation. All rights reserved.
|
||||
Released under Apache 2.0 license as described in the file LICENSE.
|
||||
|
||||
Author: Leonardo de Moura
|
||||
*/
|
||||
#pragma once
|
||||
#include <functional>
|
||||
#include "util/shared_mutex.h"
|
||||
#include "kernel/environment.h"
|
||||
|
||||
namespace lean {
|
||||
/** \brief Auxiliary object used when multiple threads are trying to populate the same environment. */
|
||||
class shared_environment {
|
||||
environment m_env;
|
||||
mutable shared_mutex m_mutex;
|
||||
public:
|
||||
shared_environment();
|
||||
shared_environment(environment const & env);
|
||||
/** \brief Return a copy of the current environment. This is a constant time operation. */
|
||||
environment get_environment() const;
|
||||
/**
|
||||
\brief Add the given certified declaration to the environment.
|
||||
This is a constant time operation.
|
||||
It blocks this object for a small amount of time.
|
||||
*/
|
||||
void add(certified_declaration const & d);
|
||||
/**
|
||||
\brief Replace the axiom with name <tt>t.get_declaration().get_name()</tt> with the theorem t.get_declaration().
|
||||
This is a constant time operation.
|
||||
It blocks this object for a small amount of time.
|
||||
*/
|
||||
void replace(certified_declaration const & t);
|
||||
/**
|
||||
\brief Update the environment using the given function.
|
||||
This procedure blocks access to this object.
|
||||
*/
|
||||
void update(std::function<environment(environment const &)> const & f);
|
||||
};
|
||||
}
|
Loading…
Reference in a new issue