From df88846fa78ebe40f935e0486462af0fc0ea81e9 Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Mon, 3 Apr 2006 10:47:52 +0000 Subject: [PATCH] add possibility to do things after thread start.. but before setting the thread to alive --- acinclude.m4 | 2 +- lib/base/filepush.cpp | 21 +++++++++++++++------ lib/base/filepush.h | 5 ++++- lib/base/thread.cpp | 1 + lib/base/thread.h | 1 + 5 files changed, 22 insertions(+), 8 deletions(-) diff --git a/acinclude.m4 b/acinclude.m4 index d1a5a04d..8999c441 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -247,7 +247,7 @@ AC_SUBST($1_LIBS) ]) 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 diff --git a/lib/base/filepush.cpp b/lib/base/filepush.cpp index 8aed99fa..bbce531d 100644 --- a/lib/base/filepush.cpp +++ b/lib/base/filepush.cpp @@ -33,12 +33,6 @@ 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); - 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; } +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 */ diff --git a/lib/base/filepush.h b/lib/base/filepush.h index 25257880..35671cd6 100644 --- a/lib/base/filepush.h +++ b/lib/base/filepush.h @@ -35,7 +35,10 @@ public: enum { evtEOF, evtReadError, evtWriteError, evtUser }; Signal1 m_event; - + + void installSigUSR1Handler(); + void before_set_thread_alive(); + /* you can send private events if you want */ void sendEvent(int evt); protected: diff --git a/lib/base/thread.cpp b/lib/base/thread.cpp index 7a43a7bb..b64ba136 100644 --- a/lib/base/thread.cpp +++ b/lib/base/thread.cpp @@ -15,6 +15,7 @@ void eThread::thread_completed(void *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(); diff --git a/lib/base/thread.h b/lib/base/thread.h index f6c750af..94cdd47e 100644 --- a/lib/base/thread.h +++ b/lib/base/thread.h @@ -18,6 +18,7 @@ public: 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); -- 2.30.2