From 8b5911a98340b9e7cb5f6df64dd25ec0c9ae91df Mon Sep 17 00:00:00 2001 From: sletz Date: Fri, 20 Jun 2008 14:00:38 +0000 Subject: [PATCH] Add new jack_client_stop_thread and jack_client_kill_thread API. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2548 0c269be4-1314-0410-8aa9-9f06e86f4224 --- ChangeLog | 4 ++++ common/JackAPI.cpp | 21 +++++++++++++++++++++ common/JackPosixThread.cpp | 25 +++++++++++++++++++++++++ common/JackPosixThread.h | 2 ++ common/jack/thread.h | 18 ++++++++++++++++++ windows/JackWinThread.cpp | 23 +++++++++++++++++++++++ windows/JackWinThread.h | 2 ++ 7 files changed, 95 insertions(+) diff --git a/ChangeLog b/ChangeLog index 46b2d6ac..987c4dfa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -21,6 +21,10 @@ Romain Moret Jackdmp changes log --------------------------- +2008-06-20 Stephane Letz + + * Add new jack_client_stop_thread and jack_client_kill_thread API. + 2008-06-19 Stephane Letz * Embed JackEngineControl in JackDriver (starting from Tim Blechmann idea). diff --git a/common/JackAPI.cpp b/common/JackAPI.cpp index 0ee47199..8f372d69 100644 --- a/common/JackAPI.cpp +++ b/common/JackAPI.cpp @@ -222,6 +222,9 @@ extern "C" void *(*start_routine)(void*), void *arg); EXPORT int jack_drop_real_time_scheduling (pthread_t thread); + + EXPORT int jack_client_stop_thread(jack_client_t* client, pthread_t thread); + EXPORT int jack_client_kill_thread(jack_client_t* client, pthread_t thread); EXPORT char * jack_get_internal_client_name (jack_client_t *client, jack_intclient_t intclient); @@ -1613,6 +1616,24 @@ EXPORT int jack_drop_real_time_scheduling(pthread_t thread) #endif } +EXPORT int jack_client_stop_thread(jack_client_t* client, pthread_t thread) +{ +#ifdef WIN32 + return JackWinThread::StopImp(thread); +#else + return JackPosixThread::StopImp(thread); +#endif +} + +EXPORT int jack_client_kill_thread(jack_client_t* client, pthread_t thread) +{ +#ifdef WIN32 + return JackWinThread::KillImp(thread); +#else + return JackPosixThread::KillImp(thread); +#endif +} + // intclient.h EXPORT int jack_internal_client_new (const char *client_name, const char *load_name, diff --git a/common/JackPosixThread.cpp b/common/JackPosixThread.cpp index 3a58bb02..0427b059 100644 --- a/common/JackPosixThread.cpp +++ b/common/JackPosixThread.cpp @@ -177,6 +177,31 @@ int JackPosixThread::Stop() } } +int JackPosixThread::KillImp(pthread_t thread) +{ + if (thread != (pthread_t)NULL) { // If thread has been started + jack_log("JackPosixThread::Kill"); + void* status; + pthread_cancel(thread); + pthread_join(thread, &status); + return 0; + } else { + return -1; + } +} + +int JackPosixThread::StopImp(pthread_t thread) +{ + if (thread != (pthread_t)NULL) { // If thread has been started + jack_log("JackPosixThread::Stop"); + void* status; + pthread_join(thread, &status); + return 0; + } else { + return -1; + } +} + int JackPosixThread::AcquireRealTime() { return (fThread != (pthread_t)NULL) ? AcquireRealTimeImp(fThread, fPriority) : -1; diff --git a/common/JackPosixThread.h b/common/JackPosixThread.h index 515f83bd..bb7a39bc 100644 --- a/common/JackPosixThread.h +++ b/common/JackPosixThread.h @@ -67,6 +67,8 @@ class EXPORT JackPosixThread : public detail::JackThread static int AcquireRealTimeImp(pthread_t thread, int priority); static int DropRealTimeImp(pthread_t thread); static int StartImp(pthread_t* thread, int priority, int realtime, void*(*start_routine)(void*), void* arg); + static int StopImp(pthread_t thread); + static int KillImp(pthread_t thread); }; diff --git a/common/jack/thread.h b/common/jack/thread.h index 6b4a00e4..f04fb24b 100644 --- a/common/jack/thread.h +++ b/common/jack/thread.h @@ -83,6 +83,24 @@ extern "C" * @returns 0, if successful; otherwise an error number. */ int jack_drop_real_time_scheduling (pthread_t thread); + + /** + * Stop the thread, waiting for the thread handler to terminate. + * + * @param thread POSIX thread ID. + * + * @returns 0, if successful; otherwise an error number. + */ + int jack_client_stop_thread(jack_client_t* client, pthread_t thread); + + /** + * Cancel the thread then waits for the thread handler to terminate. + * + * @param thread POSIX thread ID. + * + * @returns 0, if successful; otherwise an error number. + */ + int jack_client_kill_thread(jack_client_t* client, pthread_t thread); #ifdef __cplusplus } diff --git a/windows/JackWinThread.cpp b/windows/JackWinThread.cpp index 2436a1b8..2704fa88 100644 --- a/windows/JackWinThread.cpp +++ b/windows/JackWinThread.cpp @@ -157,6 +157,29 @@ int JackWinThread::Stop() } } +int JackWinThread::KillImp(pthread_t thread) +{ + if (thread) { // If thread has been started + TerminateThread(thread, 0); + WaitForSingleObject(thread, INFINITE); + CloseHandle(thread); + return 0; + } else { + return -1; + } +} + +int JackWinThread::StopImp(pthread_t thread) +{ + if (thread) { // If thread has been started + WaitForSingleObject(thread, INFINITE); + CloseHandle(thread); + return 0; + } else { + return -1; + } +} + int JackWinThread::AcquireRealTime() { return (fThread) ? AcquireRealTimeImp(fThread, fPriority) : -1; diff --git a/windows/JackWinThread.h b/windows/JackWinThread.h index a51d0c3b..5322f34f 100644 --- a/windows/JackWinThread.h +++ b/windows/JackWinThread.h @@ -65,6 +65,8 @@ class EXPORT JackWinThread : public detail::JackThread static int AcquireRealTimeImp(pthread_t thread, int priority); static int DropRealTimeImp(pthread_t thread); static int StartImp(pthread_t* thread, int priority, int realtime, ThreadCallback start_routine, void* arg); + static int StopImp(pthread_t thread); + static int KillImp(pthread_t thread); };