From 8fc0752931ad7a8efa802b0a0f0246a2b50eca6b Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Fri, 27 Jan 2006 01:05:05 +0000 Subject: [PATCH] fix locking in dvb file player --- lib/base/elock.h | 32 +++++++++++++++++++++++++- lib/dvb/dvb.cpp | 58 +++++++++++++++++++++++++++++------------------- lib/dvb/dvb.h | 3 +++ lib/dvb/idvb.h | 4 ++++ 4 files changed, 73 insertions(+), 24 deletions(-) diff --git a/lib/base/elock.h b/lib/base/elock.h index 6a47f8c9..f886473b 100644 --- a/lib/base/elock.h +++ b/lib/base/elock.h @@ -7,7 +7,7 @@ class singleLock { pthread_mutex_t &lock; public: - singleLock( pthread_mutex_t &m ) + singleLock(pthread_mutex_t &m ) :lock(m) { pthread_mutex_lock(&lock); @@ -18,6 +18,36 @@ public: } }; +class eSingleLock +{ + friend class eSingleLocker; + pthread_mutex_t m_lock; +public: + eSingleLock() + { + pthread_mutex_init(&m_lock, 0); + } + ~eSingleLock() + { + pthread_mutex_destroy(&m_lock); + } +}; + +class eSingleLocker +{ + eSingleLock &m_lock; +public: + eSingleLocker(eSingleLock &m) + : m_lock(m) + { + pthread_mutex_lock(&m_lock.m_lock); + } + ~eSingleLocker() + { + pthread_mutex_unlock(&m_lock.m_lock); + } +}; + class eLock { pthread_mutex_t mutex; diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index cac5a679..601e6279 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -630,9 +630,6 @@ void eDVBChannel::pvrEvent(int event) void eDVBChannel::cueSheetEvent(int event) { - /* we need proper locking here! */ - eDebug("CUE SHEET EVENT %d", event); - switch (event) { case eCueSheet::evtSeek: @@ -641,27 +638,30 @@ void eDVBChannel::cueSheetEvent(int event) break; case eCueSheet::evtSkipmode: { - m_cue->m_seek_requests.push_back(std::pair(1, 0)); /* resync */ - if (m_cue->m_skipmode_ratio) { - int bitrate = m_tstools.calcBitrate(); /* in bits/s */ - eDebug("skipmode ratio is %lld:90000, bitrate is %d bit/s", m_cue->m_skipmode_ratio, bitrate); - /* i agree that this might look a bit like black magic. */ - m_skipmode_n = 512*1024; /* must be 1 iframe at least. */ - m_skipmode_m = bitrate / 8 / 90000 * m_cue->m_skipmode_ratio; - - eDebug("resolved to: %d %d", m_skipmode_m, m_skipmode_n); - - if (abs(m_skipmode_m) < abs(m_skipmode_n)) + eSingleLocker l(m_cue->m_lock); + m_cue->m_seek_requests.push_back(std::pair(1, 0)); /* resync */ + if (m_cue->m_skipmode_ratio) { - eFatal("damn, something is wrong with this calculation"); + int bitrate = m_tstools.calcBitrate(); /* in bits/s */ + eDebug("skipmode ratio is %lld:90000, bitrate is %d bit/s", m_cue->m_skipmode_ratio, bitrate); + /* i agree that this might look a bit like black magic. */ + m_skipmode_n = 512*1024; /* must be 1 iframe at least. */ + m_skipmode_m = bitrate / 8 / 90000 * m_cue->m_skipmode_ratio; + + eDebug("resolved to: %d %d", m_skipmode_m, m_skipmode_n); + + if (abs(m_skipmode_m) < abs(m_skipmode_n)) + { + eFatal("damn, something is wrong with this calculation"); + m_skipmode_n = m_skipmode_m = 0; + } + + } else + { + eDebug("skipmode ratio is 0, normal play"); m_skipmode_n = m_skipmode_m = 0; } - - } else - { - eDebug("skipmode ratio is 0, normal play"); - m_skipmode_n = m_skipmode_m = 0; } flushPVR(m_cue->m_decoding_demux); break; @@ -685,6 +685,8 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off size = max; return; } + + eSingleLocker l(m_cue->m_lock); if (!m_cue->m_decoding_demux) { @@ -1021,24 +1023,34 @@ eCueSheet::eCueSheet() void eCueSheet::seekTo(int relative, const pts_t &pts) { - m_seek_requests.push_back(std::pair(relative, pts)); + { + eSingleLock l(m_lock); + m_seek_requests.push_back(std::pair(relative, pts)); + } m_event(evtSeek); } void eCueSheet::clear() { + eSingleLock l(m_lock); m_spans.clear(); } void eCueSheet::addSourceSpan(const pts_t &begin, const pts_t &end) { - m_spans.push_back(std::pair(begin, end)); + { + eSingleLock l(m_lock); + m_spans.push_back(std::pair(begin, end)); + } m_event(evtSpanChanged); } void eCueSheet::setSkipmode(const pts_t &ratio) { - m_skipmode_ratio = ratio; + { + eSingleLock l(m_lock); + m_skipmode_ratio = ratio; + } m_event(evtSkipmode); } diff --git a/lib/dvb/dvb.h b/lib/dvb/dvb.h index 0c652e35..0e449144 100644 --- a/lib/dvb/dvb.h +++ b/lib/dvb/dvb.h @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -256,6 +257,8 @@ private: std::list > m_source_span; void getNextSourceSpan(off_t current_offset, size_t bytes_read, off_t &start, size_t &size); void flushPVR(iDVBDemux *decoding_demux=0); + + eSingleLock m_cuesheet_lock; friend class eUsePtr; /* use count */ diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index 7dbad780..f20de190 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -444,6 +445,9 @@ public: void setSkipmode(const pts_t &ratio); /* 90000 is 1:1 */ void setDecodingDemux(iDVBDemux *demux); + /* frontend and backend */ + eSingleLock m_lock; + /* backend */ enum { evtSeek, evtSkipmode, evtSpanChanged }; RESULT connectEvent(const Slot1 &event, ePtr &connection); -- 2.30.2