From cb205396ae920ef813764de92bf5b686bb9d80f1 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Thu, 28 Jul 2005 00:04:32 +0000 Subject: [PATCH] - factor out the filepusher from ts recorder --- lib/base/filepush.cpp | 75 ++++++++++++++++++++++++++++++++++++ lib/base/filepush.h | 20 ++++++++++ lib/dvb/demux.cpp | 90 +------------------------------------------ lib/dvb/demux.h | 4 +- 4 files changed, 99 insertions(+), 90 deletions(-) create mode 100644 lib/base/filepush.cpp create mode 100644 lib/base/filepush.h diff --git a/lib/base/filepush.cpp b/lib/base/filepush.cpp new file mode 100644 index 00000000..b85edbc1 --- /dev/null +++ b/lib/base/filepush.cpp @@ -0,0 +1,75 @@ +#include +#include +#include + +eFilePushThread::eFilePushThread() +{ + m_stop = 0; + m_buf_start = m_buf_end = 0; +} + +static void signal_handler(int x) +{ +} + +void eFilePushThread::thread() +{ + eDebug("FILEPUSH THREAD START"); + // this is a race. FIXME. + + /* we set the signal to not restart syscalls, so we can detect our signal. */ + struct sigaction act; + act.sa_handler = signal_handler; // no, SIG_IGN doesn't do it. we want to receive the -EINTR + act.sa_flags = 0; + sigaction(SIGUSR1, &act, 0); + + /* m_stop must be evaluated after each syscall. */ + while (!m_stop) + { + /* first try flushing the bufptr */ + if (m_buf_start != m_buf_end) + { + // TODO: take care of boundaries. + int w = write(m_fd_dest, m_buffer + m_buf_start, m_buf_end - m_buf_start); + if (w <= 0) + { + if (errno == -EINTR) + continue; + eDebug("eFilePushThread *write error* - not yet handled"); + // ... we would stop the thread + } + printf("FILEPUSH: wrote %d bytes\n", w); + m_buf_start += w; + continue; + } + + /* now fill our buffer. */ + m_buf_start = 0; + m_buf_end = read(m_fd_source, m_buffer, sizeof(m_buffer)); + if (m_buf_end < 0) + { + m_buf_end = 0; + if (errno == EINTR) + continue; + eDebug("eFilePushThread *read error* - not yet handled"); + } + printf("FILEPUSH: read %d bytes\n", m_buf_end); + } + + eDebug("FILEPUSH THREAD STOP"); +} + +void eFilePushThread::start(int fd_source, int fd_dest) +{ + m_fd_source = fd_source; + m_fd_dest = fd_dest; + m_stop = 0; + run(); +} + +void eFilePushThread::stop() +{ + m_stop = 1; + sendSignal(SIGUSR1); + kill(); +} diff --git a/lib/base/filepush.h b/lib/base/filepush.h new file mode 100644 index 00000000..b8d9f221 --- /dev/null +++ b/lib/base/filepush.h @@ -0,0 +1,20 @@ +#ifndef __lib_base_filepush_h +#define __lib_base_filepush_h + +#include + +class eFilePushThread: public eThread +{ +public: + eFilePushThread(); + void thread(); + void stop(); + void start(int sourcefd, int destfd); +private: + int m_stop; + unsigned char m_buffer[65536]; + int m_buf_start, m_buf_end; + int m_fd_source, m_fd_dest; +}; + +#endif diff --git a/lib/dvb/demux.cpp b/lib/dvb/demux.cpp index f50f4bb2..c3383a7e 100644 --- a/lib/dvb/demux.cpp +++ b/lib/dvb/demux.cpp @@ -6,7 +6,6 @@ #include #include -#include #if HAVE_DVB_API_VERSION < 3 #include @@ -20,6 +19,7 @@ #include "crc32.h" #include +#include #include #include #include @@ -184,98 +184,12 @@ RESULT eDVBSectionReader::connectRead(const Slot1 &r, ePtrm_dvr_busy = 1; } diff --git a/lib/dvb/demux.h b/lib/dvb/demux.h index b07239be..fdec4177 100644 --- a/lib/dvb/demux.h +++ b/lib/dvb/demux.h @@ -43,7 +43,7 @@ public: RESULT connectRead(const Slot1 &read, ePtr &conn); }; -class eDVBTSRecorderThread; +class eFilePushThread; class eDVBTSRecorder: public iDVBTSRecorder, public Object { @@ -68,7 +68,7 @@ private: RESULT startPID(int pid); void stopPID(int pid); - eDVBTSRecorderThread *m_thread; + eFilePushThread *m_thread; std::map m_pids; Signal1 m_event; -- 2.30.2