From 6bae400b0bbeb539e6e9390517e1a90f8f6f13d4 Mon Sep 17 00:00:00 2001 From: John Poet Date: Tue, 5 Feb 2013 13:56:45 -0700 Subject: [PATCH] SignalMonitor: Timeout if we don't get a lock in a reasonable amount of time. --- mythtv/libs/libmythtv/recorders/analogsignalmonitor.cpp | 6 +++++- mythtv/libs/libmythtv/recorders/analogsignalmonitor.h | 1 + mythtv/libs/libmythtv/recorders/asisignalmonitor.cpp | 6 +++++- mythtv/libs/libmythtv/recorders/asisignalmonitor.h | 1 + mythtv/libs/libmythtv/recorders/cetonsignalmonitor.cpp | 6 +++++- mythtv/libs/libmythtv/recorders/cetonsignalmonitor.h | 1 + mythtv/libs/libmythtv/recorders/dvbsignalmonitor.cpp | 6 +++++- mythtv/libs/libmythtv/recorders/dvbsignalmonitor.h | 1 + mythtv/libs/libmythtv/recorders/firewiresignalmonitor.cpp | 6 +++++- mythtv/libs/libmythtv/recorders/firewiresignalmonitor.h | 1 + mythtv/libs/libmythtv/recorders/hdhrsignalmonitor.cpp | 6 +++++- mythtv/libs/libmythtv/recorders/hdhrsignalmonitor.h | 1 + mythtv/libs/libmythtv/recorders/iptvsignalmonitor.cpp | 6 +++++- mythtv/libs/libmythtv/recorders/iptvsignalmonitor.h | 1 + mythtv/libs/libmythtv/recorders/signalmonitor.cpp | 1 + mythtv/libs/libmythtv/recorders/signalmonitor.h | 1 + 16 files changed, 44 insertions(+), 7 deletions(-) diff --git a/mythtv/libs/libmythtv/recorders/analogsignalmonitor.cpp b/mythtv/libs/libmythtv/recorders/analogsignalmonitor.cpp index 0237ccbb2b3..3bd94c84479 100644 --- a/mythtv/libs/libmythtv/recorders/analogsignalmonitor.cpp +++ b/mythtv/libs/libmythtv/recorders/analogsignalmonitor.cpp @@ -20,7 +20,8 @@ AnalogSignalMonitor::AnalogSignalMonitor( int db_cardnum, V4LChannel *_channel, uint64_t _flags) : SignalMonitor(db_cardnum, _channel, _flags), - m_usingv4l2(false), m_width(0), m_stable_time(2000), m_lock_cnt(0) + m_usingv4l2(false), m_width(0), m_stable_time(2000), m_lock_cnt(0), + m_lock_timeout(1000 * 30 /* 30 seconds */) { int videofd = channel->GetFd(); if (videofd >= 0) @@ -166,6 +167,9 @@ void AnalogSignalMonitor::UpdateValues(void) return; } + if (lock_timer.elapsed() > m_lock_timeout) + error = "Timed out."; + if (!running || exit) return; diff --git a/mythtv/libs/libmythtv/recorders/analogsignalmonitor.h b/mythtv/libs/libmythtv/recorders/analogsignalmonitor.h index 84d3e500980..dccbb8d0909 100644 --- a/mythtv/libs/libmythtv/recorders/analogsignalmonitor.h +++ b/mythtv/libs/libmythtv/recorders/analogsignalmonitor.h @@ -30,6 +30,7 @@ class AnalogSignalMonitor : public SignalMonitor int m_stable_time; uint m_lock_cnt; MythTimer m_timer; + int m_lock_timeout; }; #endif // _ANALOG_SIGNAL_MONITOR_H_ diff --git a/mythtv/libs/libmythtv/recorders/asisignalmonitor.cpp b/mythtv/libs/libmythtv/recorders/asisignalmonitor.cpp index 29a4c8d5961..2ec74db8971 100644 --- a/mythtv/libs/libmythtv/recorders/asisignalmonitor.cpp +++ b/mythtv/libs/libmythtv/recorders/asisignalmonitor.cpp @@ -41,7 +41,8 @@ ASISignalMonitor::ASISignalMonitor( int db_cardnum, ASIChannel *_channel, uint64_t _flags) : DTVSignalMonitor(db_cardnum, _channel, _flags), - streamHandlerStarted(false), streamHandler(NULL) + streamHandlerStarted(false), streamHandler(NULL), + lock_timeout(1000 * 30 /* 30 seconds */ ) { LOG(VB_CHANNEL, LOG_INFO, LOC + "ctor"); streamHandler = ASIStreamHandler::Get(_channel->GetDevice()); @@ -84,6 +85,9 @@ ASIChannel *ASISignalMonitor::GetASIChannel(void) */ void ASISignalMonitor::UpdateValues(void) { + if (lock_timer.elapsed() > lock_timeout) + error = "Timed out."; + if (!running || exit) return; diff --git a/mythtv/libs/libmythtv/recorders/asisignalmonitor.h b/mythtv/libs/libmythtv/recorders/asisignalmonitor.h index 17c95422c85..a9f4b6450ec 100644 --- a/mythtv/libs/libmythtv/recorders/asisignalmonitor.h +++ b/mythtv/libs/libmythtv/recorders/asisignalmonitor.h @@ -29,6 +29,7 @@ class ASISignalMonitor: public DTVSignalMonitor protected: bool streamHandlerStarted; ASIStreamHandler *streamHandler; + int lock_timeout; }; #endif // ASISIGNALMONITOR_H diff --git a/mythtv/libs/libmythtv/recorders/cetonsignalmonitor.cpp b/mythtv/libs/libmythtv/recorders/cetonsignalmonitor.cpp index 4e168aa1ddc..07b18152e06 100644 --- a/mythtv/libs/libmythtv/recorders/cetonsignalmonitor.cpp +++ b/mythtv/libs/libmythtv/recorders/cetonsignalmonitor.cpp @@ -33,7 +33,8 @@ CetonSignalMonitor::CetonSignalMonitor( int db_cardnum, CetonChannel* _channel, uint64_t _flags) : DTVSignalMonitor(db_cardnum, _channel, _flags), - streamHandlerStarted(false), streamHandler(NULL) + streamHandlerStarted(false), streamHandler(NULL), + lock_timeout(1000 * 30 /* 30 seconds */) { LOG(VB_CHANNEL, LOG_INFO, LOC + "ctor"); @@ -81,6 +82,9 @@ CetonChannel *CetonSignalMonitor::GetCetonChannel(void) */ void CetonSignalMonitor::UpdateValues(void) { + if (lock_timer.elapsed() > lock_timeout) + error = "Timed out."; + if (!running || exit) return; diff --git a/mythtv/libs/libmythtv/recorders/cetonsignalmonitor.h b/mythtv/libs/libmythtv/recorders/cetonsignalmonitor.h index c865b75d763..3d7827a5629 100644 --- a/mythtv/libs/libmythtv/recorders/cetonsignalmonitor.h +++ b/mythtv/libs/libmythtv/recorders/cetonsignalmonitor.h @@ -34,6 +34,7 @@ class CetonSignalMonitor: public DTVSignalMonitor protected: bool streamHandlerStarted; CetonStreamHandler *streamHandler; + int lock_timeout; }; #endif // CETONSIGNALMONITOR_H diff --git a/mythtv/libs/libmythtv/recorders/dvbsignalmonitor.cpp b/mythtv/libs/libmythtv/recorders/dvbsignalmonitor.cpp index 51d28b8f34a..1ccc03f3096 100644 --- a/mythtv/libs/libmythtv/recorders/dvbsignalmonitor.cpp +++ b/mythtv/libs/libmythtv/recorders/dvbsignalmonitor.cpp @@ -53,7 +53,8 @@ DVBSignalMonitor::DVBSignalMonitor(int db_cardnum, DVBChannel* _channel, rotorPosition (QObject::tr("Rotor Progress"), "pos", 100, true, 0, 100, 0), streamHandlerStarted(false), - streamHandler(NULL) + streamHandler(NULL), + lock_timeout(1000 * 60 * 2 /* 2 minutes */) { // These two values should probably come from the database... int wait = 3000; // timeout when waiting on signal @@ -209,6 +210,9 @@ DVBChannel *DVBSignalMonitor::GetDVBChannel(void) */ void DVBSignalMonitor::UpdateValues(void) { + if (lock_timer.elapsed() > lock_timeout) + error = "Timed out."; + if (!running || exit) return; diff --git a/mythtv/libs/libmythtv/recorders/dvbsignalmonitor.h b/mythtv/libs/libmythtv/recorders/dvbsignalmonitor.h index 4181aea2916..2b8bd662785 100644 --- a/mythtv/libs/libmythtv/recorders/dvbsignalmonitor.h +++ b/mythtv/libs/libmythtv/recorders/dvbsignalmonitor.h @@ -59,6 +59,7 @@ class DVBSignalMonitor: public DTVSignalMonitor bool streamHandlerStarted; DVBStreamHandler *streamHandler; + int lock_timeout; }; #endif // DVBSIGNALMONITOR_H diff --git a/mythtv/libs/libmythtv/recorders/firewiresignalmonitor.cpp b/mythtv/libs/libmythtv/recorders/firewiresignalmonitor.cpp index a7939f8dfc3..f6754c88a80 100644 --- a/mythtv/libs/libmythtv/recorders/firewiresignalmonitor.cpp +++ b/mythtv/libs/libmythtv/recorders/firewiresignalmonitor.cpp @@ -52,7 +52,8 @@ FirewireSignalMonitor::FirewireSignalMonitor( tableMonitorThread(NULL), stb_needs_retune(true), stb_needs_to_wait_for_pat(false), - stb_needs_to_wait_for_power(false) + stb_needs_to_wait_for_power(false), + lock_timeout(1000 * 30 /* 30 seconds */) { LOG(VB_CHANNEL, LOG_INFO, LOC + "ctor"); @@ -191,6 +192,9 @@ void FirewireSignalMonitor::AddData(const unsigned char *data, uint len) */ void FirewireSignalMonitor::UpdateValues(void) { + if (lock_timer.elapsed() > lock_timeout) + error = "Timed out."; + if (!running || exit) return; diff --git a/mythtv/libs/libmythtv/recorders/firewiresignalmonitor.h b/mythtv/libs/libmythtv/recorders/firewiresignalmonitor.h index f51984229b4..94c34853ca5 100644 --- a/mythtv/libs/libmythtv/recorders/firewiresignalmonitor.h +++ b/mythtv/libs/libmythtv/recorders/firewiresignalmonitor.h @@ -74,6 +74,7 @@ class FirewireSignalMonitor : public DTVSignalMonitor, public TSDataListener static QMap pat_keys; static QMutex pat_keys_lock; + int lock_timeout; }; #endif // _FIREWIRESIGNALMONITOR_H_ diff --git a/mythtv/libs/libmythtv/recorders/hdhrsignalmonitor.cpp b/mythtv/libs/libmythtv/recorders/hdhrsignalmonitor.cpp index 93b6a612908..2c02b5472cc 100644 --- a/mythtv/libs/libmythtv/recorders/hdhrsignalmonitor.cpp +++ b/mythtv/libs/libmythtv/recorders/hdhrsignalmonitor.cpp @@ -41,7 +41,8 @@ HDHRSignalMonitor::HDHRSignalMonitor( int db_cardnum, HDHRChannel* _channel, uint64_t _flags) : DTVSignalMonitor(db_cardnum, _channel, _flags), - streamHandlerStarted(false), streamHandler(NULL) + streamHandlerStarted(false), streamHandler(NULL), + lock_timeout(1000 * 30 /* 30 seconds */) { LOG(VB_CHANNEL, LOG_INFO, LOC + "ctor"); @@ -89,6 +90,9 @@ HDHRChannel *HDHRSignalMonitor::GetHDHRChannel(void) */ void HDHRSignalMonitor::UpdateValues(void) { + if (lock_timer.elapsed() > lock_timeout) + error = "Timed out."; + if (!running || exit) return; diff --git a/mythtv/libs/libmythtv/recorders/hdhrsignalmonitor.h b/mythtv/libs/libmythtv/recorders/hdhrsignalmonitor.h index 016632f6e58..b285b8f8edb 100644 --- a/mythtv/libs/libmythtv/recorders/hdhrsignalmonitor.h +++ b/mythtv/libs/libmythtv/recorders/hdhrsignalmonitor.h @@ -29,6 +29,7 @@ class HDHRSignalMonitor: public DTVSignalMonitor protected: bool streamHandlerStarted; HDHRStreamHandler *streamHandler; + int lock_timeout; }; #endif // HDHRSIGNALMONITOR_H diff --git a/mythtv/libs/libmythtv/recorders/iptvsignalmonitor.cpp b/mythtv/libs/libmythtv/recorders/iptvsignalmonitor.cpp index 87d49404a6e..d200260f72b 100644 --- a/mythtv/libs/libmythtv/recorders/iptvsignalmonitor.cpp +++ b/mythtv/libs/libmythtv/recorders/iptvsignalmonitor.cpp @@ -25,7 +25,8 @@ IPTVSignalMonitor::IPTVSignalMonitor(int db_cardnum, IPTVChannel *_channel, uint64_t _flags) : - DTVSignalMonitor(db_cardnum, _channel, _flags) + DTVSignalMonitor(db_cardnum, _channel, _flags), + m_lock_timeout(1000 * 60 /* 1 minute */) { LOG(VB_CHANNEL, LOG_INFO, LOC + "ctor"); @@ -84,6 +85,9 @@ void IPTVSignalMonitor::HandlePAT(const ProgramAssociationTable *pat) */ void IPTVSignalMonitor::UpdateValues(void) { + if (lock_timer.elapsed() > m_lock_timeout) + error = "Timed out."; + if (!running || exit) return; diff --git a/mythtv/libs/libmythtv/recorders/iptvsignalmonitor.h b/mythtv/libs/libmythtv/recorders/iptvsignalmonitor.h index 1bd6a8a0dd9..47506d42473 100644 --- a/mythtv/libs/libmythtv/recorders/iptvsignalmonitor.h +++ b/mythtv/libs/libmythtv/recorders/iptvsignalmonitor.h @@ -33,6 +33,7 @@ class IPTVSignalMonitor : public DTVSignalMonitor protected: bool m_streamHandlerStarted; + int m_lock_timeout; }; #endif // _IPTVSIGNALMONITOR_H_ diff --git a/mythtv/libs/libmythtv/recorders/signalmonitor.cpp b/mythtv/libs/libmythtv/recorders/signalmonitor.cpp index fee25b509f9..80b5eeb158c 100644 --- a/mythtv/libs/libmythtv/recorders/signalmonitor.cpp +++ b/mythtv/libs/libmythtv/recorders/signalmonitor.cpp @@ -302,6 +302,7 @@ void SignalMonitor::run(void) running = true; startStopWait.wakeAll(); + lock_timer.start(); while (!exit) { locker.unlock(); diff --git a/mythtv/libs/libmythtv/recorders/signalmonitor.h b/mythtv/libs/libmythtv/recorders/signalmonitor.h index 3f94e73d184..bcdcdbd36ab 100644 --- a/mythtv/libs/libmythtv/recorders/signalmonitor.h +++ b/mythtv/libs/libmythtv/recorders/signalmonitor.h @@ -215,6 +215,7 @@ class SignalMonitor : protected MThread mutable QMutex statusLock; mutable QMutex listenerLock; + MythTimer lock_timer; }; inline QString sm_flags_to_string(uint64_t flags)