scope.cc 3.4 KB
Newer Older
Y
Yan Chunwei 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "lite/core/scope.h"
16 17 18 19
#define SCOPE_KIDS_READER_LOCK lite::fluid::AutoRDLock auto_lock(kids_lock_);
#define SCOPE_KIDS_WRITER_LOCK lite::fluid::AutoWRLock auto_lock(kids_lock_);
#define SCOPE_VARS_READER_LOCK lite::fluid::AutoRDLock auto_lock(vars_lock_);
#define SCOPE_VARS_WRITER_LOCK lite::fluid::AutoWRLock auto_lock(vars_lock_);
Y
Yan Chunwei 已提交
20 21 22 23 24

namespace paddle {
namespace lite {

Scope::~Scope() {
25
  SCOPE_KIDS_WRITER_LOCK
Y
Yan Chunwei 已提交
26 27 28 29 30 31 32 33
  for (auto *x : kids_) {
    if (x) {
      delete x;
    }
  }
}

Scope &Scope::NewScope() const {
34
  SCOPE_KIDS_WRITER_LOCK
Y
Yan Chunwei 已提交
35 36 37 38 39 40
  kids_.push_back(new Scope);
  kids_.back()->parent_ = this;
  return *kids_.back();
}

Variable *Scope::Var(const std::string &name) {
41
  SCOPE_VARS_WRITER_LOCK
Y
Yan Chunwei 已提交
42 43
  auto *var = FindVar(name);
  if (var) return var;
44 45 46 47
  // create a new variable.
  vars_.emplace(name, std::unique_ptr<Variable>(new Variable));
  return vars_[name].get();
}
Y
Yan Chunwei 已提交
48

49 50 51 52
Variable *Scope::LocalVar(const std::string &name) {
  SCOPE_VARS_WRITER_LOCK
  auto *var = FindLocalVar(name);
  if (var) return var;
Y
Yan Chunwei 已提交
53 54 55 56 57 58 59 60 61
  // create a new variable.
  vars_.emplace(name, std::unique_ptr<Variable>(new Variable));
  return vars_[name].get();
}

Variable *Scope::FindVar(const std::string &name) const {
  Variable *var{nullptr};
  var = FindLocalVar(name);
  const Scope *cur_scope = this;
62
  rwlock_->RDLock();
Y
Yan Chunwei 已提交
63 64 65 66
  while (!var && cur_scope->parent()) {
    cur_scope = cur_scope->parent();
    var = cur_scope->FindLocalVar(name);
  }
67
  rwlock_->UNLock();
Y
Yan Chunwei 已提交
68 69 70 71
  return var;
}

Variable *Scope::FindLocalVar(const std::string &name) const {
72
  rwlock_->RDLock();
Y
Yan Chunwei 已提交
73 74
  auto it = vars_.find(name);
  if (it != vars_.end()) {
75
    rwlock_->UNLock();
Y
Yan Chunwei 已提交
76 77
    return it->second.get();
  }
78
  rwlock_->UNLock();
Y
Yan Chunwei 已提交
79 80 81
  return nullptr;
}

82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
// AttributeVarNames will get persistive attribute names stored in parent scope
std::vector<std::string> Scope::AttributeVarNames() const {
  std::vector<std::string> resulted_keys;
  const Scope *cur_scope = this;
  while (cur_scope->parent()) {
    cur_scope = cur_scope->parent();
    auto keys = cur_scope->LocalVarNames();
    resulted_keys.insert(resulted_keys.end(), keys.begin(), keys.end());
  }
  // remove feed and fetch
  std::vector<std::string> skiped_vars = {"feed", "fetch"};
  for (int i = 0; i < skiped_vars.size(); i++) {
    auto iter =
        std::find(resulted_keys.begin(), resulted_keys.end(), skiped_vars[i]);
    while (iter != resulted_keys.end()) {
      resulted_keys.erase(iter);
      iter =
          std::find(resulted_keys.begin(), resulted_keys.end(), skiped_vars[i]);
    }
  }
  return resulted_keys;
}

Y
Yan Chunwei 已提交
105 106
std::vector<std::string> Scope::LocalVarNames() const {
  std::vector<std::string> keys;
107 108 109 110 111 112
  {
    rwlock_->RDLock();
    for (const auto &item : vars_) {
      keys.push_back(item.first);
    }
    rwlock_->UNLock();
Y
Yan Chunwei 已提交
113 114 115 116 117 118
  }
  return keys;
}

}  // namespace lite
}  // namespace paddle