]> granicus.if.org Git - icinga2/commitdiff
Checker: Use weak_ptrs to keep track of services.
authorGunnar Beutner <gunnar.beutner@netways.de>
Mon, 11 Feb 2013 12:05:08 +0000 (13:05 +0100)
committerGunnar Beutner <gunnar.beutner@netways.de>
Mon, 11 Feb 2013 12:05:08 +0000 (13:05 +0100)
components/checker/checkercomponent.cpp
components/checker/checkercomponent.h

index 3c731f34a0a81a45e978bc77bf02bd1be69d93bc..12b3bad69d7f51a53a759b85162a3ef31c14ec4a 100644 (file)
@@ -63,7 +63,12 @@ void CheckerComponent::CheckTimerHandler(void)
                CheckTimeView& idx = boost::get<1>(m_IdleServices);
 
                CheckTimeView::iterator it = idx.begin();
-               Service::Ptr service = *it;
+               Service::Ptr service = it->lock();
+
+               if (!service) {
+                       idx.erase(it);
+                       continue;
+               }
 
                if (service->GetNextCheck() > now)
                        break;
@@ -206,8 +211,19 @@ void CheckerComponent::RescheduleCheckTimer(void)
        typedef nth_index<ServiceSet, 1>::type CheckTimeView;
        CheckTimeView& idx = boost::get<1>(m_IdleServices);
 
-       CheckTimeView::iterator it = idx.begin();
-       Service::Ptr service = *it;
+       Service::Ptr service;
+
+       do {
+               CheckTimeView::iterator it = idx.begin();
+
+               if (it == idx.end())
+                       return;
+
+               service = it->lock();
+
+               if (!service)
+                       idx.erase(it);
+       } while (!service);
 
        m_CheckTimer->Reschedule(service->GetNextCheck());
 }
index a6f6527792429eca00028e69acb62043477e2e5c..f930fa04bd9b8c61ca13e9923379ca985f11e935 100644 (file)
@@ -30,8 +30,13 @@ struct ServiceNextCheckExtractor
 {
        typedef double result_type;
 
-       double operator()(const Service::Ptr& service)
+       double operator()(const Service::WeakPtr& wservice)
        {
+               Service::Ptr service = wservice.lock();
+
+               if (!service)
+                       return 0;
+
                return service->GetNextCheck();
        }
 };
@@ -46,9 +51,9 @@ public:
        typedef weak_ptr<CheckerComponent> WeakPtr;
 
        typedef multi_index_container<
-               Service::Ptr,
+               Service::WeakPtr,
                indexed_by<
-                       ordered_unique<identity<Service::Ptr> >,
+                       ordered_unique<identity<Service::WeakPtr> >,
                        ordered_non_unique<ServiceNextCheckExtractor>
                >
        > ServiceSet;