diff --git a/ChangeLog b/ChangeLog index ab305b04..56975341 100644 --- a/ChangeLog +++ b/ChangeLog @@ -20,10 +20,14 @@ Fernando Lopez-Lezcano Jackdmp changes log --------------------------- +2008-05-06 Stephane Letz + + * Fix JackPosixThread::StartImp and JackWinThread::StartImp. + 2008-05-05 Stephane Letz * Fix JackClient::Close : notification channel is stopped first to avoid receiving notifications while closing and Close is again a synchronous call. - * No more client close in JackEngine::Close(). + * No more remaining client close in JackEngine::Close(). 2008-05-01 Stephane Letz diff --git a/common/JackPosixThread.cpp b/common/JackPosixThread.cpp index 704105ad..758e6bf9 100644 --- a/common/JackPosixThread.cpp +++ b/common/JackPosixThread.cpp @@ -69,69 +69,58 @@ int JackPosixThread::Start() int JackPosixThread::StartImp(pthread_t* thread, int priority, int realtime, void*(*start_routine)(void*), void* arg) { + pthread_attr_t attributes; + struct sched_param rt_param; + pthread_attr_init(&attributes); int res; - if (realtime) { - - jack_log("Create RT thread"); - - /* Get the client thread to run as an RT-FIFO - scheduled thread of appropriate priority. - */ - pthread_attr_t attributes; - struct sched_param rt_param; - pthread_attr_init(&attributes); - - if ((res = pthread_attr_setinheritsched(&attributes, PTHREAD_EXPLICIT_SCHED))) { - jack_error("Cannot request explicit scheduling for RT thread %d %s", res, strerror(errno)); - return -1; - } + if ((res = pthread_attr_setinheritsched(&attributes, PTHREAD_EXPLICIT_SCHED))) { + jack_error("Cannot request explicit scheduling for RT thread %d %s", res, strerror(errno)); + return -1; + } - if ((res = pthread_attr_setdetachstate(&attributes, PTHREAD_CREATE_JOINABLE))) { - jack_error("Cannot request joinable thread creation for RT thread %d %s", res, strerror(errno)); - return -1; - } + if ((res = pthread_attr_setdetachstate(&attributes, PTHREAD_CREATE_JOINABLE))) { + jack_error("Cannot request joinable thread creation for RT thread %d %s", res, strerror(errno)); + return -1; + } - if ((res = pthread_attr_setscope(&attributes, PTHREAD_SCOPE_SYSTEM))) { - jack_error("Cannot set scheduling scope for RT thread %d %s", res, strerror(errno)); - return -1; - } + if ((res = pthread_attr_setscope(&attributes, PTHREAD_SCOPE_SYSTEM))) { + jack_error("Cannot set scheduling scope for RT thread %d %s", res, strerror(errno)); + return -1; + } + if (realtime) { + + jack_log("Create RT thread"); + //if ((res = pthread_attr_setschedpolicy(&attributes, SCHED_FIFO))) { - if ((res = pthread_attr_setschedpolicy(&attributes, SCHED_RR))) { jack_error("Cannot set RR scheduling class for RT thread %d %s", res, strerror(errno)); return -1; } + } else { + jack_log("Create non RT thread"); + } - memset(&rt_param, 0, sizeof(rt_param)); - rt_param.sched_priority = priority; - - if ((res = pthread_attr_setschedparam(&attributes, &rt_param))) { - jack_error("Cannot set scheduling priority for RT thread %d %s", res, strerror(errno)); - return -1; - } - - if ((res = pthread_attr_setstacksize(&attributes, THREAD_STACK))) { - jack_error("setting thread stack size%d %s", res, strerror(errno)); - return -1; - } + memset(&rt_param, 0, sizeof(rt_param)); + rt_param.sched_priority = priority; - if ((res = pthread_create(thread, &attributes, start_routine, arg))) { - jack_error("Cannot set create thread %d %s", res, strerror(errno)); - return -1; - } + if ((res = pthread_attr_setschedparam(&attributes, &rt_param))) { + jack_error("Cannot set scheduling priority for RT thread %d %s", res, strerror(errno)); + return -1; + } - return 0; - } else { - jack_log("Create non RT thread"); + if ((res = pthread_attr_setstacksize(&attributes, THREAD_STACK))) { + jack_error("setting thread stack size%d %s", res, strerror(errno)); + return -1; + } - if ((res = pthread_create(thread, 0, start_routine, arg))) { - jack_error("Cannot set create thread %d %s", res, strerror(errno)); - return -1; - } - return 0; + if ((res = pthread_create(thread, &attributes, start_routine, arg))) { + jack_error("Cannot set create thread %d %s", res, strerror(errno)); + return -1; } + + return 0; } int JackPosixThread::StartSync() diff --git a/windows/JackWinThread.cpp b/windows/JackWinThread.cpp index f1c14aec..29cdbd19 100644 --- a/windows/JackWinThread.cpp +++ b/windows/JackWinThread.cpp @@ -93,36 +93,27 @@ int JackWinThread::Start() int JackWinThread::StartImp(pthread_t* thread, int priority, int realtime, ThreadCallback start_routine, void* arg) { DWORD id; + *thread = CreateThread(NULL, 0, start_routine, arg, 0, &id); - if (realtime) { + if (*thread == NULL) { + jack_error("Cannot create thread error = %d", GetLastError()); + return -1; + } + if (realtime) { + jack_log("Create RT thread"); - *thread = CreateThread(NULL, 0, start_routine, arg, 0, &id); - - if (*thread == NULL) { - jack_error("Cannot create thread error = %d", GetLastError()); - return -1; - } - + if (!SetThreadPriority(*thread, THREAD_PRIORITY_TIME_CRITICAL)) { jack_error("Cannot set priority class = %d", GetLastError()); return -1; } - return 0; - } else { - jack_log("Create non RT thread"); - *thread = CreateThread(NULL, 0, start_routine, arg, 0, &id); - - if (thread == NULL) { - jack_error("Cannot create thread error = %d", GetLastError()); - return -1; - } - - return 0; } + + return 0; } int JackWinThread::StartSync()