#define PVR_COMMIT 1
-eFilePushThread::eFilePushThread(): m_messagepump(eApp, 0)
+eFilePushThread::eFilePushThread(int io_prio_class, int io_prio_level)
+ :prio_class(io_prio_class), prio(io_prio_level), m_messagepump(eApp, 0)
{
m_stop = 0;
m_sg = 0;
void eFilePushThread::thread()
{
+ setIoPrio(prio_class, prio);
+
off_t dest_pos = 0, source_pos = 0;
size_t bytes_read = 0;
size_t current_span_remaining = 0;
size_t written_since_last_sync = 0;
-
+
int already_empty = 0;
eDebug("FILEPUSH THREAD START");
- // this is a race. FIXME.
- dest_pos = lseek(m_fd_dest, 0, SEEK_CUR);
+ /* 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);
+
+ hasStarted();
+
source_pos = m_raw_source.lseek(0, SEEK_CUR);
/* m_stop must be evaluated after each syscall. */
// ... we would stop the thread
}
-// posix_fadvise(m_fd_dest, dest_pos, w, POSIX_FADV_DONTNEED);
-
- dest_pos += w;
written_since_last_sync += w;
-
- if (written_since_last_sync >= 2048*1024)
+
+ if (written_since_last_sync >= 512*1024)
{
- fdatasync(m_fd_dest);
- written_since_last_sync = 0;
+ int toflush = written_since_last_sync > 2*1024*1024 ?
+ 2*1024*1024 : written_since_last_sync &~ 4095; // write max 2MB at once
+ dest_pos = lseek(m_fd_dest, 0, SEEK_CUR);
+ dest_pos -= toflush;
+ posix_fadvise(m_fd_dest, dest_pos, toflush, POSIX_FADV_DONTNEED);
+ written_since_last_sync -= toflush;
}
// printf("FILEPUSH: wrote %d bytes\n", w);
}
// printf("FILEPUSH: read %d bytes\n", m_buf_end);
}
-
+ fdatasync(m_fd_dest);
+
eDebug("FILEPUSH THREAD STOP");
}
return 0;
}
-void eFilePushThread::installSigUSR1Handler()
-{
- /* 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);
-}
-
-// called from thread before alive is set to 1
-void eFilePushThread::before_set_thread_alive()
-{
- installSigUSR1Handler();
-}
-
void eFilePushThread::stop()
{
- if (!thread_running()) /* FIXME: races */
+ /* if we aren't running, don't bother stopping. */
+ if (!sync())
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();
}