Dictionary::Ptr locals = new Dictionary();
locals->Set("__parent", m_Scope);
m_Scope.reset();
- locals->Set("name", m_Name);
dobj->SetParentScope(locals);
locals.reset();
+ dobj->SetName(m_Name);
+
DebugHint debugHints;
try {
return ConfigItem::Ptr();
}
-bool ConfigItem::ValidateItems(void)
+bool ConfigItem::CommitNewItems(void)
{
- if (ConfigCompilerContext::GetInstance()->HasErrors())
- return false;
+ std::vector<ConfigItem::Ptr> items;
- ParallelWorkQueue upq;
+ do {
+ ParallelWorkQueue upq;
- Log(LogInformation, "ConfigItem", "Committing config items");
+ items.clear();
- BOOST_FOREACH(const ItemMap::value_type& kv, m_Items) {
- upq.Enqueue(boost::bind(&ConfigItem::Commit, kv.second, false));
- }
+ {
+ boost::mutex::scoped_lock lock(m_Mutex);
- BOOST_FOREACH(const ConfigItem::Ptr& item, m_UnnamedItems) {
- upq.Enqueue(boost::bind(&ConfigItem::Commit, item, true));
- }
+ BOOST_FOREACH(const ItemMap::value_type& kv, m_Items) {
+ if (!kv.second->m_Abstract && !kv.second->m_Object) {
+ upq.Enqueue(boost::bind(&ConfigItem::Commit, kv.second, false));
+ items.push_back(kv.second);
+ }
+ }
- upq.Join();
+ BOOST_FOREACH(const ConfigItem::Ptr& item, m_UnnamedItems) {
+ if (!item->m_Abstract && !item->m_Object) {
+ upq.Enqueue(boost::bind(&ConfigItem::Commit, item, true));
+ items.push_back(item);
+ }
+ }
- if (ConfigCompilerContext::GetInstance()->HasErrors())
- return false;
+ m_UnnamedItems.clear();
+ }
- std::vector<DynamicObject::Ptr> objects;
- BOOST_FOREACH(const ItemMap::value_type& kv, m_Items) {
- DynamicObject::Ptr object = kv.second->m_Object;
+ upq.Join();
- if (object)
- objects.push_back(object);
- }
+ if (ConfigCompilerContext::GetInstance()->HasErrors())
+ return false;
- BOOST_FOREACH(const ConfigItem::Ptr& item, m_UnnamedItems) {
- DynamicObject::Ptr object = item->m_Object;
+ BOOST_FOREACH(const ConfigItem::Ptr& item, items) {
+ upq.Enqueue(boost::bind(&DynamicObject::OnConfigLoaded, item->m_Object));
+ }
- if (object)
- objects.push_back(object);
- }
+ upq.Join();
+ } while (!items.empty());
- m_UnnamedItems.clear();
+ return true;
+}
- Log(LogInformation, "ConfigItem", "Triggering OnConfigLoaded signal for config items");
+bool ConfigItem::ValidateItems(void)
+{
+ if (ConfigCompilerContext::GetInstance()->HasErrors())
+ return false;
- BOOST_FOREACH(const DynamicObject::Ptr& object, objects) {
- upq.Enqueue(boost::bind(&DynamicObject::OnConfigLoaded, object));
- }
+ Log(LogInformation, "ConfigItem", "Committing config items");
- upq.Join();
+ if (!CommitNewItems())
+ return false;
Log(LogInformation, "ConfigItem", "Evaluating 'object' rules (step 1)...");
ObjectRule::EvaluateRules(false);
Log(LogInformation, "ConfigItem", "Evaluating 'apply' rules...");
ApplyRule::EvaluateRules(true);
+ if (!CommitNewItems())
+ return false;
+
Log(LogInformation, "ConfigItem", "Evaluating 'object' rules (step 2)...");
ObjectRule::EvaluateRules(true);
- upq.Join();
-
ConfigItem::DiscardItems();
ConfigType::DiscardTypes();