add possibility to do things after thread start.. but before setting the thread to...
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Mon, 3 Apr 2006 10:47:52 +0000 (10:47 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Mon, 3 Apr 2006 10:47:52 +0000 (10:47 +0000)
acinclude.m4
lib/base/filepush.cpp
lib/base/filepush.h
lib/base/thread.cpp
lib/base/thread.h

index d1a5a04d0a6b6daa09561f8c863b3fa323254d8f..8999c44118b48cca745e5eea5606c960b6f572ea 100644 (file)
@@ -247,7 +247,7 @@ AC_SUBST($1_LIBS)
 ])
 
 AC_DEFUN(_TUXBOX_APPS_LIB_PKGCONFIG_OPTIONAL,[
 ])
 
 AC_DEFUN(_TUXBOX_APPS_LIB_PKGCONFIG_OPTIONAL,[
-PKG_CHECK_MODULES($1,$2,$3="yes",$3="no")
+PKG_CHECK_MODULES($1,$2,$3="no",$3="yes")
 if test "$$3" = "yes"; then
        AC_DEFINE($3, 1, [$2 available])
 else
 if test "$$3" = "yes"; then
        AC_DEFINE($3, 1, [$2 available])
 else
index 8aed99fa3b611eeb14d1d43f3372c85b9d430dc6..bbce531dd56f1a03e2d7fa669193f7a7938e81bb 100644 (file)
@@ -33,12 +33,6 @@ void eFilePushThread::thread()
        eDebug("FILEPUSH THREAD START");
                // this is a race. FIXME.
        
        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);
-       
        dest_pos = lseek(m_fd_dest, 0, SEEK_CUR);
        source_pos = m_raw_source.lseek(0, SEEK_CUR);
        
        dest_pos = lseek(m_fd_dest, 0, SEEK_CUR);
        source_pos = m_raw_source.lseek(0, SEEK_CUR);
        
@@ -164,6 +158,21 @@ int eFilePushThread::start(const char *filename, int fd_dest)
        return 0;
 }
 
        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 */
 void eFilePushThread::stop()
 {
        if (!thread_running()) /* FIXME: races */
index 25257880d4056c28c00f3b59ffcbda2f87f92b35..35671cd6ef23146d3fb638018265bb0bb23241a0 100644 (file)
@@ -35,7 +35,10 @@ public:
        
        enum { evtEOF, evtReadError, evtWriteError, evtUser };
        Signal1<void,int> m_event;
        
        enum { evtEOF, evtReadError, evtWriteError, evtUser };
        Signal1<void,int> m_event;
-       
+
+       void installSigUSR1Handler();
+       void before_set_thread_alive();
+
                /* you can send private events if you want */
        void sendEvent(int evt);
 protected:
                /* you can send private events if you want */
        void sendEvent(int evt);
 protected:
index 7a43a7bb22bf43548caa3b164a0c91edb7402539..b64ba1365bfb2376e69e36ce1da73ffb1614c4bc 100644 (file)
@@ -15,6 +15,7 @@ void eThread::thread_completed(void *ptr)
 void *eThread::wrapper(void *ptr)
 {
        eThread *p = (eThread*)ptr;
 void *eThread::wrapper(void *ptr)
 {
        eThread *p = (eThread*)ptr;
+       p->before_set_thread_alive();
        p->alive=1;
        pthread_cleanup_push( thread_completed, (void*)p );
        p->thread();
        p->alive=1;
        pthread_cleanup_push( thread_completed, (void*)p );
        p->thread();
index f6c750aff53894aabac7578042ff463437e7facd..94cdd47e66c3721c43b27ec0146b8cbad6fff231 100644 (file)
@@ -18,6 +18,7 @@ public:
        void run(int prio=0, int policy=0);
 
        virtual void thread()=0;
        void run(int prio=0, int policy=0);
 
        virtual void thread()=0;
+       virtual void before_set_thread_alive() { }
        virtual void thread_finished() { }
        void sendSignal(int sig);
 
        virtual void thread_finished() { }
        void sendSignal(int sig);