Merge pull request #4751 from fritsch/pvr-fix
authorjmarshallnz <jcmarsha@gmail.com>
Tue, 20 May 2014 19:42:54 +0000 (07:42 +1200)
committerTrent Nelson <trent.nelson@pivosgroup.com>
Sat, 7 Jun 2014 05:27:40 +0000 (13:27 +0800)
EpgContainer: Fix Deadlock when calling Observer with lock

xbmc/epg/EpgContainer.cpp

index 68d23c9..d2bc48f 100644 (file)
@@ -670,32 +670,31 @@ bool CEpgContainer::CheckPlayingEvents(void)
 {
   bool bReturn(false);
   time_t iNow;
-  CSingleLock lock(m_critSection);
+  bool bFoundChanges(false);
 
-  CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(iNow);
-  if (iNow >= m_iNextEpgActiveTagCheck)
   {
-    bool bFoundChanges(false);
     CSingleLock lock(m_critSection);
-
-    for (map<unsigned int, CEpg *>::iterator it = m_epgs.begin(); it != m_epgs.end(); it++)
-      bFoundChanges = it->second->CheckPlayingEvent() || bFoundChanges;
-    CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(m_iNextEpgActiveTagCheck);
-    m_iNextEpgActiveTagCheck += g_advancedSettings.m_iEpgActiveTagCheckInterval;
-
-    if (bFoundChanges)
+    CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(iNow);
+    if (iNow >= m_iNextEpgActiveTagCheck)
     {
-      SetChanged();
-      NotifyObservers(ObservableMessageEpgActiveItem);
-    }
+      for (map<unsigned int, CEpg *>::iterator it = m_epgs.begin(); it != m_epgs.end(); it++)
+        bFoundChanges = it->second->CheckPlayingEvent() || bFoundChanges;
+      CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(m_iNextEpgActiveTagCheck);
+      m_iNextEpgActiveTagCheck += g_advancedSettings.m_iEpgActiveTagCheckInterval;
 
-    /* pvr tags always start on the full minute */
-    if (g_PVRManager.IsStarted())
-      m_iNextEpgActiveTagCheck -= m_iNextEpgActiveTagCheck % 60;
+      /* pvr tags always start on the full minute */
+      if (g_PVRManager.IsStarted())
+        m_iNextEpgActiveTagCheck -= m_iNextEpgActiveTagCheck % 60;
 
-    bReturn = true;
+      bReturn = true;
+    }
   }
 
+  if (bFoundChanges)
+  {
+    SetChanged();
+    NotifyObservers(ObservableMessageEpgActiveItem);
+  }
   return bReturn;
 }