diff options
| author | ghost <andreas.monzner@multimedia-labs.de> | 2009-12-23 16:22:45 +0100 |
|---|---|---|
| committer | ghost <andreas.monzner@multimedia-labs.de> | 2009-12-23 16:22:45 +0100 |
| commit | bba4dec6bbe08a1f0c0c2b73c4b8e62aa8ded2df (patch) | |
| tree | 8fa18140ea0a4cd6a7d73c64e24dd2e42ea3d600 | |
| parent | a95987bbd88eb84db03a431826d4b21cb7725a0f (diff) | |
| parent | b64b791cb481944585fceaf5bcac9e2c699dbeb0 (diff) | |
| download | enigma2-bba4dec6bbe08a1f0c0c2b73c4b8e62aa8ded2df.tar.gz enigma2-bba4dec6bbe08a1f0c0c2b73c4b8e62aa8ded2df.zip | |
Merge branch 'bug_355_seek_fixes'
| -rw-r--r-- | lib/base/elock.h | 13 | ||||
| -rw-r--r-- | lib/dvb/tstools.cpp | 10 | ||||
| -rw-r--r-- | lib/dvb/tstools.h | 6 |
3 files changed, 23 insertions, 6 deletions
diff --git a/lib/base/elock.h b/lib/base/elock.h index 51582e67..01757182 100644 --- a/lib/base/elock.h +++ b/lib/base/elock.h @@ -83,9 +83,18 @@ class eSingleLock pthread_mutex_t m_lock; eSingleLock(eSingleLock &); public: - eSingleLock() + eSingleLock(bool recursive=false) { - pthread_mutex_init(&m_lock, 0); + if (recursive) + { + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&m_lock, &attr); + pthread_mutexattr_destroy(&attr); + } + else + pthread_mutex_init(&m_lock, 0); } ~eSingleLock() { diff --git a/lib/dvb/tstools.cpp b/lib/dvb/tstools.cpp index 649f66bb..d5ad2494 100644 --- a/lib/dvb/tstools.cpp +++ b/lib/dvb/tstools.cpp @@ -7,6 +7,7 @@ #include <stdio.h> eDVBTSTools::eDVBTSTools() + :m_file_lock(true) { m_pid = -1; m_maxrange = 256*1024; @@ -47,6 +48,7 @@ int eDVBTSTools::openFile(const char *filename, int nostreaminfo) m_samples_taken = 0; + eSingleLocker l(m_file_lock); if (m_file.open(filename, 1) < 0) return -1; return 0; @@ -54,6 +56,7 @@ int eDVBTSTools::openFile(const char *filename, int nostreaminfo) void eDVBTSTools::closeFile() { + eSingleLocker l(m_file_lock); m_file.close(); } @@ -78,7 +81,8 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed) return -1; offset -= offset % 188; - + + eSingleLocker l(m_file_lock); if (m_file.lseek(offset, SEEK_SET) < 0) { eDebug("lseek failed"); @@ -417,7 +421,8 @@ void eDVBTSTools::calcEnd() { if (!m_file.valid()) return; - + + eSingleLocker l(m_file_lock); off_t end = m_file.lseek(0, SEEK_END); if (llabs(end - m_last_filelength) > 1*1024*1024) @@ -574,6 +579,7 @@ int eDVBTSTools::findPMT(int &pmt_pid, int &service_id) return -1; } + eSingleLocker l(m_file_lock); if (m_file.lseek(0, SEEK_SET) < 0) { eDebug("seek failed"); diff --git a/lib/dvb/tstools.h b/lib/dvb/tstools.h index c230a341..ed8b9241 100644 --- a/lib/dvb/tstools.h +++ b/lib/dvb/tstools.h @@ -4,6 +4,7 @@ #include <sys/types.h> #include <lib/dvb/pvrparse.h> #include <lib/base/rawfile.h> +#include <lib/base/elock.h> /* * Note: we're interested in PTS values, not STC values. @@ -75,9 +76,10 @@ public: private: int m_pid; int m_maxrange; - + + eSingleLock m_file_lock; eRawFile m_file; - + int m_begin_valid, m_end_valid; pts_t m_pts_begin, m_pts_end; off_t m_offset_begin, m_offset_end; |
