diff options
| author | Felix Domke <tmbinc@elitedvb.net> | 2005-07-28 00:04:32 +0000 |
|---|---|---|
| committer | Felix Domke <tmbinc@elitedvb.net> | 2005-07-28 00:04:32 +0000 |
| commit | cb205396ae920ef813764de92bf5b686bb9d80f1 (patch) | |
| tree | 42035b815af506c3755d6d7c2ae0e43bedb0fbc1 /lib/base | |
| parent | 40253d1a081381a643b8841aeb2914f75211ddb9 (diff) | |
| download | enigma2-cb205396ae920ef813764de92bf5b686bb9d80f1.tar.gz enigma2-cb205396ae920ef813764de92bf5b686bb9d80f1.zip | |
- factor out the filepusher from ts recorder
Diffstat (limited to 'lib/base')
| -rw-r--r-- | lib/base/filepush.cpp | 75 | ||||
| -rw-r--r-- | lib/base/filepush.h | 20 |
2 files changed, 95 insertions, 0 deletions
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 <lib/base/filepush.h> +#include <lib/base/eerror.h> +#include <errno.h> + +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 <lib/base/thread.h> + +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 |
