[pulseaudio-discuss] [PATCH] core-util: Clamp RLIMIT_RTTIME to what RealtimeKit accepts
Jan Alexander Steffens (heftig)
jan.steffens at gmail.com
Sun Jun 9 09:47:05 PDT 2013
From: "Jan Alexander Steffens (heftig)" <jan.steffens at gmail.com>
In the default configuration, PulseAudio's rlimit-rttime is set to
1000000 (100%), which is higher than what RealtimeKit requires from
its clients (200000, 20%).
Make an attempt to still get realtime scheduling by clamping the
current RLIMIT_RTTIME to what RealtimeKit accepts. Warn about doing
this.
---
src/pulsecore/core-util.c | 36 +++++++++++++++++++++++++++++-------
1 file changed, 29 insertions(+), 7 deletions(-)
diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index da8266b..3465223 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -684,6 +684,10 @@ static int set_scheduler(int rtprio) {
struct sched_param sp;
#ifdef HAVE_DBUS
int r;
+ long long rttime;
+#ifdef HAVE_SYS_RESOURCE_H
+ struct rlimit rl;
+#endif
DBusError error;
DBusConnection *bus;
@@ -721,16 +725,34 @@ static int set_scheduler(int rtprio) {
* https://bugs.freedesktop.org/show_bug.cgi?id=16924 */
dbus_connection_set_exit_on_disconnect(bus, FALSE);
- r = rtkit_make_realtime(bus, 0, rtprio);
- dbus_connection_close(bus);
- dbus_connection_unref(bus);
+ rttime = rtkit_get_rttime_usec_max(bus);
+ if (rttime >= 0) {
+#ifdef HAVE_SYS_RESOURCE_H
+ r = getrlimit(RLIMIT_RTTIME, &rl);
+ if (r >= 0 && (long long)rl.rlim_max > rttime) {
+ pa_log_warn("Clamping rlimit-rttime to %lld for RealtimeKit\n", rttime);
+ rl.rlim_cur = rl.rlim_max = rttime;
+ r = setrlimit(RLIMIT_RTTIME, &rl);
+ if (r < 0)
+ pa_log_warn("setrlimit() failed: %s", pa_cstrerror(errno));
+ }
+#endif
+ r = rtkit_make_realtime(bus, 0, rtprio);
+ dbus_connection_close(bus);
+ dbus_connection_unref(bus);
- if (r >= 0) {
- pa_log_debug("RealtimeKit worked.");
- return 0;
+ if (r >= 0) {
+ pa_log_debug("RealtimeKit worked.");
+ return 0;
+ }
+
+ errno = -r;
+ } else {
+ dbus_connection_close(bus);
+ dbus_connection_unref(bus);
+ errno = -rttime;
}
- errno = -r;
#else
errno = 0;
#endif
--
1.8.3
More information about the pulseaudio-discuss
mailing list