Merge branch 'master' into tmbinc/FixTimingBugs
[enigma2.git] / lib / base / filepush.cpp
index 1e5685caed94448f29bc8d573c88d8315c51896f..e99e956c2a4a2cd0b3df5df7f0cb47796a74cfcb 100644 (file)
@@ -109,7 +109,7 @@ void eFilePushThread::thread()
 //                     eDebug("wrote %d bytes", w);
                        if (w <= 0)
                        {
-                               if (errno == EINTR)
+                               if (errno == EINTR || errno == EAGAIN || errno == EBUSY)
                                        continue;
                                eDebug("eFilePushThread WRITE ERROR");
                                sendEvent(evtWriteError);
@@ -165,7 +165,7 @@ void eFilePushThread::thread()
                if (m_buf_end < 0)
                {
                        m_buf_end = 0;
-                       if (errno == EINTR)
+                       if (errno == EINTR || errno == EBUSY || errno == EAGAIN)
                                continue;
                        if (errno == EOVERFLOW)
                        {
@@ -174,6 +174,15 @@ void eFilePushThread::thread()
                        }
                        eDebug("eFilePushThread *read error* (%m) - not yet handled");
                }
+
+                       /* a read might be mis-aligned in case of a short read. */
+               int d = m_buf_end % m_blocksize;
+               if (d)
+               {
+                       m_raw_source.lseek(-d, SEEK_CUR);
+                       m_buf_end -= d;
+               }
+
                if (m_buf_end == 0)
                {
                                /* on EOF, try COMMITting once. */
@@ -251,12 +260,9 @@ void eFilePushThread::stop()
        // 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();
+       eDebug("if enigma hangs here, the filepush thread is non-responsive. FIX THAT DAMN THREAD.");
+       sendSignal(SIGUSR1);
+       kill(0);
 }
 
 void eFilePushThread::pause()