From 54a63ae8e408d36c057aba7fb509c6ba652b0f77 Mon Sep 17 00:00:00 2001
From: Jack Thomasson <jkt@moonlitsw.com>
Date: Mon, 3 Sep 2012 09:21:54 -0600
Subject: [PATCH] avoid deadlock in MythSystem

in MythSystemManager::append do not hold fdLock while calling
MythSystemIOHandler::insert which locks m_pLock

avoids deadlock in MythSystemIOHandler::run which holds m_pLock while calling
MythSystemIOHandler::HandleRead which locks fdLock
---
 mythtv/libs/libmythbase/system-unix.cpp    |    6 ++++--
 mythtv/libs/libmythbase/system-windows.cpp |    6 ++++--
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/mythtv/libs/libmythbase/system-unix.cpp b/mythtv/libs/libmythbase/system-unix.cpp
index a7a24c9..c11be24 100644
--- a/mythtv/libs/libmythbase/system-unix.cpp
+++ b/mythtv/libs/libmythbase/system-unix.cpp
@@ -441,7 +441,6 @@ void MythSystemManager::append(MythSystemUnix *ms)
     m_pMap.insert(ms->m_pid, ms);
     m_mapLock.unlock();
 
-    fdLock.lock();
     if( ms->GetSetting("UseStdin") )
         writeThread->insert(ms->m_stdpipe[0], ms->GetBuffer(0));
 
@@ -450,7 +449,9 @@ void MythSystemManager::append(MythSystemUnix *ms)
         FDType_t *fdType = new FDType_t;
         fdType->ms = ms;
         fdType->type = 1;
+	fdLock.lock();
         fdMap.insert( ms->m_stdpipe[1], fdType );
+	fdLock.unlock();
         readThread->insert(ms->m_stdpipe[1], ms->GetBuffer(1));
     }
 
@@ -459,10 +460,11 @@ void MythSystemManager::append(MythSystemUnix *ms)
         FDType_t *fdType = new FDType_t;
         fdType->ms = ms;
         fdType->type = 2;
+	fdLock.lock();
         fdMap.insert( ms->m_stdpipe[2], fdType );
         readThread->insert(ms->m_stdpipe[2], ms->GetBuffer(2));
+	fdLock.unlock();
     }
-    fdLock.unlock();
 }
 
 void MythSystemManager::jumpAbort(void)
diff --git a/mythtv/libs/libmythbase/system-windows.cpp b/mythtv/libs/libmythbase/system-windows.cpp
index 71832ff..063f3b4 100644
--- a/mythtv/libs/libmythbase/system-windows.cpp
+++ b/mythtv/libs/libmythbase/system-windows.cpp
@@ -399,7 +399,6 @@ void MythSystemManager::append(MythSystemWindows *ms)
     ChildListRebuild();
     m_mapLock.unlock();
 
-    fdLock.lock();
     if( ms->GetSetting("UseStdin") )
         writeThread->insert(ms->m_stdpipe[0], ms->GetBuffer(0));
 
@@ -408,7 +407,9 @@ void MythSystemManager::append(MythSystemWindows *ms)
         FDType_t *fdType = new FDType_t;
         fdType->ms = ms;
         fdType->type = 1;
+	fdLock.lock();
         fdMap.insert( ms->m_stdpipe[1], fdType );
+	fdLock.unlock();
         readThread->insert(ms->m_stdpipe[1], ms->GetBuffer(1));
     }
 
@@ -417,10 +418,11 @@ void MythSystemManager::append(MythSystemWindows *ms)
         FDType_t *fdType = new FDType_t;
         fdType->ms = ms;
         fdType->type = 2;
+	fdLock.lock();
         fdMap.insert( ms->m_stdpipe[2], fdType );
+	fdLock.unlock();
         readThread->insert(ms->m_stdpipe[2], ms->GetBuffer(2));
     }
-    fdLock.unlock();
 }
 
 void MythSystemManager::jumpAbort(void)
-- 
1.7.7

