From: bruceperens Date: Tue, 21 Jan 2014 21:21:55 +0000 (+0000) Subject: Set real-time priority. The version in source/platform/linux/scheduler.cpp X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=a7053c2114cad31795fef09654271a2d2ef41c22;p=freetel-svn-tracking.git Set real-time priority. The version in source/platform/linux/scheduler.cpp is (of course) Linux-specific. git-svn-id: https://svn.code.sf.net/p/freetel/code@1383 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/freedv-server/CMakeLists.txt b/freedv-server/CMakeLists.txt index 0460ef75..35f2369b 100644 --- a/freedv-server/CMakeLists.txt +++ b/freedv-server/CMakeLists.txt @@ -86,7 +86,18 @@ message(STATUS "${Param.build-type} ${Version.major}.${Version.minor}.${Version. # # Set cmake internal variables from parameters. # + +set(Compile.linux.sources + source/platform/linux/scheduler.cpp +) + +# FIX: Add other platforms. +if(Platform.name STREQUAL Linux) + set(Compile.platform.sources ${Compile.linux.sources}) +endif(Platform.name STREQUAL Linux) + set(Compile.sources + ${Compile.platform.sources} source/audio_device.cpp source/audio_input.cpp source/audio_output.cpp diff --git a/freedv-server/source/big_main.cpp b/freedv-server/source/big_main.cpp index 74239717..b60cc0e0 100644 --- a/freedv-server/source/big_main.cpp +++ b/freedv-server/source/big_main.cpp @@ -182,6 +182,7 @@ main(int argc, char * * argv) help(argv[0]); exit(1); } + set_scheduler(); return run(&i); } #endif diff --git a/freedv-server/source/drivers.h b/freedv-server/source/drivers.h index 25b37664..65a0a57d 100644 --- a/freedv-server/source/drivers.h +++ b/freedv-server/source/drivers.h @@ -17,7 +17,11 @@ namespace FreeDV { /// \param s The string to be copied. /// \return The new copy. It's the caller's responsibility to free this data, /// or a memory leak will occurr. - char * copy_string(const char * s); + char * copy_string(const char * s); + + /// Set the real-time parameters in the scheduler before running our main + /// loop. + void set_scheduler(); /// Virtual base class for all driver classes. class Base { diff --git a/freedv-server/source/platform/linux/.gitignore b/freedv-server/source/platform/linux/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/freedv-server/source/platform/linux/scheduler.cpp b/freedv-server/source/platform/linux/scheduler.cpp new file mode 100644 index 00000000..cd01dc49 --- /dev/null +++ b/freedv-server/source/platform/linux/scheduler.cpp @@ -0,0 +1,35 @@ +#include +#ifdef _POSIX_PRIORITY_SCHEDULING +#include +#include +#include +#include +#endif +#include "drivers.h" + +namespace FreeDV { + void + set_scheduler() + { +#ifdef _POSIX_PRIORITY_SCHEDULING + sched_param p; + int policy = SCHED_RR; + + p.sched_priority = sched_get_priority_min(policy); + const int result = sched_setscheduler(0, policy, &p); + if ( result < 0 ) { + if ( errno == EPERM ) { + std::cerr << "Insufficient privilege to set real-time priority. " + "Try runing as root." << std::endl; + } + else if ( errno == EINVAL ) { + std::cerr << "This kernel doesn't seem to have real-time facilities. " + "If audio is sometimes interrupted, try a newer kernel." << std::endl; + } + else { + std::cerr << "sched_setscheduler: " << strerror(errno) << std::endl; + } + } + } +#endif +} diff --git a/freedv-server/source/run.cpp b/freedv-server/source/run.cpp index 8a893370..dfe99655 100644 --- a/freedv-server/source/run.cpp +++ b/freedv-server/source/run.cpp @@ -68,7 +68,7 @@ namespace FreeDV { else { receive(i); } - usleep(10000); + usleep(20000); } }