void DynamicObject::Start(void)
{
ASSERT(!OwnsLock());
+ ObjectLock olock(this);
- ASSERT(!IsActive());
- SetActive(true);
+ SetStartCalled(true);
+}
+
+void DynamicObject::Activate(void)
+{
+ ASSERT(!OwnsLock());
+
+ Start();
+
+ ASSERT(GetStartCalled());
+
+ {
+ ObjectLock olock(this);
+ ASSERT(!IsActive());
+ SetActive(true);
+ }
OnStarted(GetSelf());
}
void DynamicObject::Stop(void)
{
ASSERT(!OwnsLock());
+ ObjectLock olock(this);
+
+ SetStopCalled(true);
+}
+
+void DynamicObject::Deactivate(void)
+{
+ ASSERT(!OwnsLock());
+
+ {
+ ObjectLock olock(this);
+
+ if (!IsActive())
+ return;
+
+ SetActive(false);
+ }
+
+ Stop();
- ASSERT(IsActive());
- SetActive(false);
+ ASSERT(GetStopCalled());
OnStopped(GetSelf());
}
{
BOOST_FOREACH(const DynamicType::Ptr& dt, DynamicType::GetTypes()) {
BOOST_FOREACH(const DynamicObject::Ptr& object, dt->GetObjects()) {
- if (object->IsActive())
- object->Stop();
+ object->Deactivate();
}
}
}
[config] Array::Ptr domains;
[config] Array::Ptr authorities;
[get_protected] bool active;
+ [get_protected] bool start_called;
+ [get_protected] bool stop_called;
Dictionary::Ptr authority_info;
[protected] Dictionary::Ptr extensions;
};
#ifdef _DEBUG
Log(LogDebug, "config", "Activating object '" + object->GetName() + "' of type '" + object->GetType()->GetName() + "'");
#endif /* _DEBUG */
- upq.Enqueue(boost::bind(&DynamicObject::Start, object));
+ upq.Enqueue(boost::bind(&DynamicObject::Activate, object));
}
}