return Object::GetField(id);
}
+std::vector<String> Type::GetLoadDependencies(void) const
+{
+ return std::vector<String>();
+}
+
String TypeType::GetName(void) const
{
return "Type";
virtual void SetField(int id, const Value& value);
virtual Value GetField(int id) const;
+ virtual std::vector<String> GetLoadDependencies(void) const;
+
protected:
virtual ObjectFactory GetFactory(void) const = 0;
new_items.swap(m_CommittedItems);
}
+ std::set<String> types;
+
BOOST_FOREACH(const ConfigItem::Ptr& item, new_items) {
- upq.Enqueue(boost::bind(&DynamicObject::OnAllConfigLoaded, item->m_Object));
+ types.insert(item->m_Type);
}
- upq.Join();
+ std::set<String> completed_types;
+
+ while (types.size() != completed_types.size()) {
+ std::set<String> current_types;
+
+ BOOST_FOREACH(const String& type, types) {
+ if (completed_types.find(type) != completed_types.end())
+ continue;
+
+ Type::Ptr ptype = Type::GetByName(type);
+ bool unresolved_dep = false;
+
+ BOOST_FOREACH(const String& loadDep, ptype->GetLoadDependencies()) {
+ if (types.find(loadDep) != types.end() && completed_types.find(loadDep) == completed_types.end()) {
+ unresolved_dep = true;
+ break;
+ }
+ }
+
+ if (!unresolved_dep) {
+ BOOST_FOREACH(const ConfigItem::Ptr& item, new_items) {
+ if (item->m_Type == type)
+ upq.Enqueue(boost::bind(&DynamicObject::OnAllConfigLoaded, item->m_Object));
+ }
+
+ completed_types.insert(type);
+ }
+ }
+
+ upq.Join();
+ }
} while (!items.empty());
return true;
class Dependency : CustomVarObject < DependencyNameComposer
{
+ load_after Host;
+ load_after Service;
+
[config] String child_host_name;
[config] String child_service_name;
class Notification : CustomVarObject < NotificationNameComposer
{
+ load_after Host;
+ load_after Service;
+
[config, protected] String command (CommandRaw);
[config] double interval {
default {{{ return 1800; }}}
class ScheduledDowntime : CustomVarObject < ScheduledDowntimeNameComposer
{
+ load_after Host;
+ load_after Service;
+
[config, protected] String host_name;
[config, protected] String service_name;
class Service : Checkable < ServiceNameComposer
{
+ load_after Host;
+
[config] String display_name {
get {{{
if (m_DisplayName.IsEmpty())
class { return T_CLASS; }
namespace { return T_NAMESPACE; }
code { return T_CODE; }
+load_after { return T_LOAD_AFTER; }
abstract { yylval->num = TAAbstract; return T_CLASS_ATTRIBUTE; }
config { yylval->num = FAConfig; return T_FIELD_ATTRIBUTE; }
state { yylval->num = FAState; return T_FIELD_ATTRIBUTE; }
%token T_INCLUDE "include (T_INCLUDE)"
%token T_CLASS "class (T_CLASS)"
%token T_CODE "code (T_CODE)"
+%token T_LOAD_AFTER "load_after (T_LOAD_AFTER)"
%token T_NAMESPACE "namespace (T_NAMESPACE)"
%token T_STRING "string (T_STRING)"
%token T_ANGLE_STRING "angle_string (T_ANGLE_STRING)"
$$->Attributes = $1;
- $$->Fields = *$7;
+ for (std::vector<Field>::iterator it = $7->begin(); it != $7->end(); it++) {
+ if (it->Attributes & FALoadDependency) {
+ $$->LoadDependencies.push_back(it->Name);
+ } else
+ $$->Fields.push_back(*it);
+ }
+
delete $7;
ClassCompiler::OptimizeStructLayout($$->Fields);
$$ = field;
}
+ | T_LOAD_AFTER identifier ';'
+ {
+ Field *field = new Field();
+ field->Attributes = FALoadDependency;
+ field->Name = $2;
+ std::free($2);
+ $$ = field;
+ }
;
alternative_name_specifier: /* empty */
<< "\t\t" << "return TypeHelper<" << klass.Name << ">::GetFactory();" << std::endl
<< "\t" << "}" << std::endl << std::endl;
+ /* GetLoadDependencies */
+ std::cout << "\t" << "virtual std::vector<String> GetLoadDependencies(void) const" << std::endl
+ << "\t" << "{" << std::endl
+ << "\t\t" << "std::vector<String> deps;" << std::endl;
+
+ for (std::vector<std::string>::const_iterator itd = klass.LoadDependencies.begin(); itd != klass.LoadDependencies.end(); itd++)
+ std::cout << "\t\t" << "deps.push_back(\"" << *itd << "\");" << std::endl;
+
+ std::cout << "\t\t" << "return deps;" << std::endl
+ << "\t" << "}" << std::endl;
+
std::cout << "};" << std::endl << std::endl;
/* ObjectImpl */
FAGetProtected = 8,
FASetProtected = 16,
FAInternal = 32,
- FANoStorage = 64
+ FANoStorage = 64,
+ FALoadDependency = 128
};
struct Field
std::string TypeBase;
int Attributes;
std::vector<Field> Fields;
+ std::vector<std::string> LoadDependencies;
};
class ClassCompiler