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
|
b
|
void MythSystemManager::append(MythSystemUnix *ms)
|
| 441 | 441 | m_pMap.insert(ms->m_pid, ms); |
| 442 | 442 | m_mapLock.unlock(); |
| 443 | 443 | |
| 444 | | fdLock.lock(); |
| 445 | 444 | if( ms->GetSetting("UseStdin") ) |
| 446 | 445 | writeThread->insert(ms->m_stdpipe[0], ms->GetBuffer(0)); |
| 447 | 446 | |
| … |
… |
void MythSystemManager::append(MythSystemUnix *ms)
|
| 450 | 449 | FDType_t *fdType = new FDType_t; |
| 451 | 450 | fdType->ms = ms; |
| 452 | 451 | fdType->type = 1; |
| | 452 | fdLock.lock(); |
| 453 | 453 | fdMap.insert( ms->m_stdpipe[1], fdType ); |
| | 454 | fdLock.unlock(); |
| 454 | 455 | readThread->insert(ms->m_stdpipe[1], ms->GetBuffer(1)); |
| 455 | 456 | } |
| 456 | 457 | |
| … |
… |
void MythSystemManager::append(MythSystemUnix *ms)
|
| 459 | 460 | FDType_t *fdType = new FDType_t; |
| 460 | 461 | fdType->ms = ms; |
| 461 | 462 | fdType->type = 2; |
| | 463 | fdLock.lock(); |
| 462 | 464 | fdMap.insert( ms->m_stdpipe[2], fdType ); |
| 463 | 465 | readThread->insert(ms->m_stdpipe[2], ms->GetBuffer(2)); |
| | 466 | fdLock.unlock(); |
| 464 | 467 | } |
| 465 | | fdLock.unlock(); |
| 466 | 468 | } |
| 467 | 469 | |
| 468 | 470 | 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
|
b
|
void MythSystemManager::append(MythSystemWindows *ms)
|
| 399 | 399 | ChildListRebuild(); |
| 400 | 400 | m_mapLock.unlock(); |
| 401 | 401 | |
| 402 | | fdLock.lock(); |
| 403 | 402 | if( ms->GetSetting("UseStdin") ) |
| 404 | 403 | writeThread->insert(ms->m_stdpipe[0], ms->GetBuffer(0)); |
| 405 | 404 | |
| … |
… |
void MythSystemManager::append(MythSystemWindows *ms)
|
| 408 | 407 | FDType_t *fdType = new FDType_t; |
| 409 | 408 | fdType->ms = ms; |
| 410 | 409 | fdType->type = 1; |
| | 410 | fdLock.lock(); |
| 411 | 411 | fdMap.insert( ms->m_stdpipe[1], fdType ); |
| | 412 | fdLock.unlock(); |
| 412 | 413 | readThread->insert(ms->m_stdpipe[1], ms->GetBuffer(1)); |
| 413 | 414 | } |
| 414 | 415 | |
| … |
… |
void MythSystemManager::append(MythSystemWindows *ms)
|
| 417 | 418 | FDType_t *fdType = new FDType_t; |
| 418 | 419 | fdType->ms = ms; |
| 419 | 420 | fdType->type = 2; |
| | 421 | fdLock.lock(); |
| 420 | 422 | fdMap.insert( ms->m_stdpipe[2], fdType ); |
| | 423 | fdLock.unlock(); |
| 421 | 424 | readThread->insert(ms->m_stdpipe[2], ms->GetBuffer(2)); |
| 422 | 425 | } |
| 423 | | fdLock.unlock(); |
| 424 | 426 | } |
| 425 | 427 | |
| 426 | 428 | void MythSystemManager::jumpAbort(void) |