|
|
@@ -69,69 +69,58 @@ int JackPosixThread::Start() |
|
|
|
|
|
|
|
|
int JackPosixThread::StartImp(pthread_t* thread, int priority, int realtime, void*(*start_routine)(void*), void* arg) |
|
|
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; |
|
|
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_FIFO))) { |
|
|
|
|
|
|
|
|
if ((res = pthread_attr_setschedpolicy(&attributes, SCHED_RR))) { |
|
|
if ((res = pthread_attr_setschedpolicy(&attributes, SCHED_RR))) { |
|
|
jack_error("Cannot set RR scheduling class for RT thread %d %s", res, strerror(errno)); |
|
|
jack_error("Cannot set RR scheduling class for RT thread %d %s", res, strerror(errno)); |
|
|
return -1; |
|
|
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() |
|
|
int JackPosixThread::StartSync() |
|
|
|