From: Felix Domke Date: Thu, 28 Jul 2005 00:04:32 +0000 (+0000) Subject: - factor out the filepusher from ts recorder X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=commitdiff_plain;h=cb205396ae920ef813764de92bf5b686bb9d80f1 - factor out the filepusher from ts recorder --- diff --git a/lib/base/filepush.cpp b/lib/base/filepush.cpp new file mode 100644 index 0000000..b85edbc --- /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 0000000..b8d9f22 --- /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 f50f4bb..c3383a7 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 b07239b..fdec417 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;