Skip to content

Commit

Permalink
Merge pull request #11243 from panyx0718/scope
Browse files Browse the repository at this point in the history
small clean up and document pointer ownership.
  • Loading branch information
panyx0718 authored Jun 6, 2018
2 parents ea408d5 + 73aa5d2 commit 106ee9d
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 13 deletions.
18 changes: 6 additions & 12 deletions paddle/fluid/framework/scope.cc
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,7 @@ DEFINE_bool(
namespace paddle {
namespace framework {

Scope::~Scope() {
DropKids();
for (auto& kv : vars_) {
VLOG(3) << "Destroy variable " << kv.first;
delete kv.second;
}
}
Scope::~Scope() { DropKids(); }

Scope& Scope::NewScope() const {
std::unique_lock<std::mutex> lock(mutex_);
Expand All @@ -51,8 +45,9 @@ Scope& Scope::NewScope() const {
Variable* Scope::Var(const std::string& name) {
auto* v = FindVarLocally(name);
if (v != nullptr) return v;

v = new Variable();
vars_[name] = v;
vars_[name].reset(v);
VLOG(3) << "Create variable " << name;
v->name_ = &(vars_.find(name)->first);
return v;
Expand All @@ -76,7 +71,7 @@ Variable* Scope::FindVar(const std::string& name) const {

const Scope* Scope::FindScope(const Variable* var) const {
for (auto& kv : vars_) {
if (kv.second == var) {
if (kv.second.get() == var) {
return this;
}
}
Expand Down Expand Up @@ -113,7 +108,6 @@ void Scope::EraseVars(const std::vector<std::string>& var_names) {
std::set<std::string> var_set(var_names.begin(), var_names.end());
for (auto it = vars_.begin(); it != vars_.end();) {
if (var_set.find(it->first) != var_set.end()) {
delete it->second;
it = vars_.erase(it);
} else {
++it;
Expand All @@ -129,7 +123,7 @@ void Scope::Rename(const std::string& origin_name,
auto new_it = vars_.find(new_name);
PADDLE_ENFORCE(new_it == vars_.end(),
"The variable with name %s is already in the scope", new_name);
vars_[new_name] = origin_it->second;
vars_[new_name].reset(origin_it->second.release());
vars_.erase(origin_it);
}

Expand All @@ -141,7 +135,7 @@ std::string Scope::Rename(const std::string& origin_name) const {

Variable* Scope::FindVarLocally(const std::string& name) const {
auto it = vars_.find(name);
if (it != vars_.end()) return it->second;
if (it != vars_.end()) return it->second.get();
return nullptr;
}

Expand Down
7 changes: 6 additions & 1 deletion paddle/fluid/framework/scope.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,18 @@ class Scope {
Scope& NewScope() const;

/// Create a variable with given name if it doesn't exist.
/// Caller doesn't own the returned Variable.
Variable* Var(const std::string& name);

/// Create a variable with a scope-unique name.
/// Caller doesn't own the returned Variable.
Variable* Var(std::string* name = nullptr);

void EraseVars(const std::vector<std::string>& var_names);

/// Find a variable in the scope or any of its ancestors. Returns
/// nullptr if cannot find.
/// Caller doesn't own the returned Variable.
Variable* FindVar(const std::string& name) const;

const Scope* parent() const { return parent_; }
Expand All @@ -78,13 +81,15 @@ class Scope {
// Rename variable to a new name and return the new name
std::string Rename(const std::string& origin_name) const;

/// Caller doesn't own the returned Variable.
Variable* FindVarLocally(const std::string& name) const;

private:
// Call Scope::NewScope for a sub-scope.
explicit Scope(Scope const* parent) : parent_(parent) {}

mutable std::unordered_map<std::string, Variable*> vars_;
mutable std::unordered_map<std::string, std::unique_ptr<Variable>> vars_;
// Scope in `kids_` are owned by this class.
mutable std::list<Scope*> kids_;
Scope const* parent_{nullptr};

Expand Down

0 comments on commit 106ee9d

Please sign in to comment.