range constraint for realtime-priority engine parameter

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@3011 0c269be4-1314-0410-8aa9-9f06e86f4224
This commit is contained in:
nedko 2008-10-18 11:48:26 +00:00
parent ce79323448
commit 606609f9b5
4 changed files with 66 additions and 6 deletions

View File

@ -591,6 +591,29 @@ jackctl_wait_signals(sigset_t signals)
}
#endif
static
jack_driver_param_constraint_desc_t *
get_realtime_priority_constraint()
{
jack_driver_param_constraint_desc_t * constraint_ptr;
int min, max;
if (!jack_get_thread_realtime_priority_range(&min, &max))
{
return NULL;
}
//jack_info("realtime priority range is (%d,%d)", min, max);
constraint_ptr = (jack_driver_param_constraint_desc_t *)calloc(1, sizeof(jack_driver_param_value_enum_t));
constraint_ptr->flags = JACK_CONSTRAINT_FLAG_RANGE;
constraint_ptr->constraint.range.min.i = min;
constraint_ptr->constraint.range.max.i = max;
return constraint_ptr;
}
EXPORT jackctl_server_t * jackctl_server_create()
{
struct jackctl_server * server_ptr;
@ -645,7 +668,8 @@ EXPORT jackctl_server_t * jackctl_server_create()
JackParamInt,
&server_ptr->realtime_priority,
&server_ptr->default_realtime_priority,
value) == NULL)
value,
get_realtime_priority_constraint()) == NULL)
{
goto fail_free_parameters;
}

View File

@ -114,6 +114,8 @@ class SERVER_EXPORT JackThreadInterface
} // end of namespace
bool jack_get_thread_realtime_priority_range(int * min_ptr, int * max_ptr);
bool jack_tls_allocate_key(jack_tls_key *key_ptr);
bool jack_tls_free_key(jack_tls_key key);

View File

@ -22,6 +22,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "JackError.h"
#include "JackTime.h"
#include <string.h> // for memset
#include <unistd.h> // for _POSIX_PRIORITY_SCHEDULING check
#define JACK_SCHED_POLICY SCHED_RR
//#define JACK_SCHED_POLICY SCHED_FIFO
namespace Jack
{
@ -114,8 +118,7 @@ int JackPosixThread::StartImp(pthread_t* thread, int priority, int realtime, voi
return -1;
}
//if ((res = pthread_attr_setschedpolicy(&attributes, SCHED_FIFO))) {
if ((res = pthread_attr_setschedpolicy(&attributes, SCHED_RR))) {
if ((res = pthread_attr_setschedpolicy(&attributes, JACK_SCHED_POLICY))) {
jack_error("Cannot set RR scheduling class for RT thread res = %d err = %s", res, strerror(errno));
return -1;
}
@ -216,9 +219,7 @@ int JackPosixThread::AcquireRealTimeImp(pthread_t thread, int priority)
memset(&rtparam, 0, sizeof(rtparam));
rtparam.sched_priority = priority;
//if ((res = pthread_setschedparam(fThread, SCHED_FIFO, &rtparam)) != 0) {
if ((res = pthread_setschedparam(thread, SCHED_RR, &rtparam)) != 0) {
if ((res = pthread_setschedparam(thread, JACK_SCHED_POLICY, &rtparam)) != 0) {
jack_error("Cannot use real-time scheduling (RR/%d) "
"(%d: %s)", rtparam.sched_priority, res,
strerror(res));
@ -265,6 +266,34 @@ SERVER_EXPORT void ThreadExit()
} // end of namespace
bool jack_get_thread_realtime_priority_range(int * min_ptr, int * max_ptr)
{
#if defined(_POSIX_PRIORITY_SCHEDULING) && !defined(__APPLE__)
int min, max;
min = sched_get_priority_min(JACK_SCHED_POLICY);
if (min == -1)
{
jack_error("sched_get_priority_min() failed.");
return false;
}
max = sched_get_priority_max(JACK_SCHED_POLICY);
if (max == -1)
{
jack_error("sched_get_priority_max() failed.");
return false;
}
*min_ptr = min;
*max_ptr = max;
return true;
#else
return false;
#endif
}
bool jack_tls_allocate_key(jack_tls_key *key_ptr)
{
int ret;

View File

@ -232,6 +232,11 @@ SERVER_EXPORT void ThreadExit()
} // end of namespace
bool jack_get_thread_realtime_priority_range(int * min_ptr, int * max_ptr)
{
return false;
}
bool jack_tls_allocate_key(jack_tls_key *key_ptr)
{
DWORD key;