add stream-mode to filepush, which will retry on eof until stream grows
[enigma2.git] / lib / base / filepush.cpp
index 554c7845c1d830c3e63c778a02f6ec7bfbf3006c..92c580c22d43c22cb6c05ce2915b507ce6a8cc69 100644 (file)
@@ -11,6 +11,8 @@ eFilePushThread::eFilePushThread(int io_prio_class, int io_prio_level)
 {
        m_stop = 0;
        m_sg = 0;
+       m_send_pvr_commit = 0;
+       m_stream_mode = 0;
        flush();
        enablePVRCommit(0);
        CONNECT(m_messagepump.recv_msg, eFilePushThread::recvEvent);
@@ -128,7 +130,19 @@ void eFilePushThread::thread()
                                                /* well check again */
                                continue;
                        }
+                       
+                               /* in stream_mode, we are sending EOF events 
+                                  over and over until somebody responds.
+                                  
+                                  in stream_mode, think of evtEOF as "buffer underrun occured". */
                        sendEvent(evtEOF);
+
+                       if (m_stream_mode)
+                       {
+                               eDebug("reached EOF, but we are in stream mode. delaying 1 second.");
+                               sleep(1);
+                               continue;
+                       }
 #if 0
                        eDebug("FILEPUSH: end-of-file! (currently unhandled)");
                        if (!m_raw_source.lseek(0, SEEK_SET))
@@ -176,7 +190,15 @@ void eFilePushThread::stop()
                return;
 
        m_stop = 1;
-       sendSignal(SIGUSR1);
+
+       // fixmee.. here we need a better solution to ensure
+       // that the thread context take notice of the signal
+       // even when no syscall is in progress
+       while(!sendSignal(SIGUSR1))
+       {
+               eDebug("send SIGUSR1 to thread context");
+               usleep(5000); // wait msek
+       }
        kill();
 }
 
@@ -206,6 +228,11 @@ void eFilePushThread::enablePVRCommit(int s)
        m_send_pvr_commit = s;
 }
 
+void eFilePushThread::setStreamMode(int s)
+{
+       m_stream_mode = s;
+}
+
 void eFilePushThread::setScatterGather(iFilePushScatterGather *sg)
 {
        m_sg = sg;