]> code.delx.au - pulseaudio/commitdiff
daemon: optionally call mlockall() on startup
authorLennart Poettering <lennart@poettering.net>
Sat, 6 Jun 2009 22:43:03 +0000 (00:43 +0200)
committerLennart Poettering <lennart@poettering.net>
Sat, 6 Jun 2009 22:45:47 +0000 (00:45 +0200)
man/pulse-daemon.conf.5.xml.in
src/daemon/daemon-conf.c
src/daemon/daemon-conf.h
src/daemon/daemon.conf.in
src/daemon/main.c

index afa7ca00c8cd3e2bc29b8cfa7e8725000db370d5..b4a7fdb0b4d5c8d4435d93b2889d9d92898b03f4 100644 (file)
@@ -163,6 +163,14 @@ USA.
       memory overcommit.</p>
     </option>
 
+    <option>
+      <p><opt>lock-memory=</opt> Locks the entire PulseAudio process
+      into memory. While this might increase drop-out safety when used
+      in conjunction with real-time scheduling this takes away a lot
+      of memory from other processes and might hence considerably slow
+      down your system. Defaults to <opt>no</opt>.</p>
+    </option>
+
     <option>
       <p><opt>flat-volumes=</opt> Enable 'flat' volumes, i.e. where
       possible let the sink volume equal the maximum of the volumes of
index ac6cc8aad54622515ed5180745bc7a18d72e1ec9..664e4fdea2d885731f51f16f65d74491b866c6d2 100644 (file)
@@ -85,6 +85,7 @@ static const pa_daemon_conf default_conf = {
     .system_instance = FALSE,
     .no_cpu_limit = FALSE,
     .disable_shm = FALSE,
+    .lock_memory = FALSE,
     .default_n_fragments = 4,
     .default_fragment_size_msec = 25,
     .default_sample_spec = { .format = PA_SAMPLE_S16NE, .rate = 44100, .channels = 2 },
@@ -446,6 +447,7 @@ int pa_daemon_conf_load(pa_daemon_conf *c, const char *filename) {
         { "no-cpu-limit",               pa_config_parse_bool,     &c->no_cpu_limit, NULL },
         { "disable-shm",                pa_config_parse_bool,     &c->disable_shm, NULL },
         { "flat-volumes",               pa_config_parse_bool,     &c->flat_volumes, NULL },
+        { "lock-memory",                pa_config_parse_bool,     &c->lock_memory, NULL },
         { "exit-idle-time",             pa_config_parse_int,      &c->exit_idle_time, NULL },
         { "scache-idle-time",           pa_config_parse_int,      &c->scache_idle_time, NULL },
         { "realtime-priority",          parse_rtprio,             c, NULL },
@@ -595,16 +597,14 @@ FILE *pa_daemon_conf_open_default_script_file(pa_daemon_conf *c) {
     return f;
 }
 
-
-static const char* const log_level_to_string[] = {
-    [PA_LOG_DEBUG] = "debug",
-    [PA_LOG_INFO] = "info",
-    [PA_LOG_NOTICE] = "notice",
-    [PA_LOG_WARN] = "warning",
-    [PA_LOG_ERROR] = "error"
-};
-
 char *pa_daemon_conf_dump(pa_daemon_conf *c) {
+    static const char* const log_level_to_string[] = {
+        [PA_LOG_DEBUG] = "debug",
+        [PA_LOG_INFO] = "info",
+        [PA_LOG_NOTICE] = "notice",
+        [PA_LOG_WARN] = "warning",
+        [PA_LOG_ERROR] = "error"
+    };
     pa_strbuf *s;
     char cm[PA_CHANNEL_MAP_SNPRINT_MAX];
 
@@ -630,6 +630,7 @@ char *pa_daemon_conf_dump(pa_daemon_conf *c) {
     pa_strbuf_printf(s, "no-cpu-limit = %s\n", pa_yes_no(c->no_cpu_limit));
     pa_strbuf_printf(s, "disable-shm = %s\n", pa_yes_no(c->disable_shm));
     pa_strbuf_printf(s, "flat-volumes = %s\n", pa_yes_no(c->flat_volumes));
+    pa_strbuf_printf(s, "lock-memory = %s\n", pa_yes_no(c->lock_memory));
     pa_strbuf_printf(s, "exit-idle-time = %i\n", c->exit_idle_time);
     pa_strbuf_printf(s, "scache-idle-time = %i\n", c->scache_idle_time);
     pa_strbuf_printf(s, "dl-search-path = %s\n", pa_strempty(c->dl_search_path));
index 9cec189f82cbd86c285e423b82e5796db645b204..dd69e048f4f2de95fdda03ec754f7fbf2aec483b 100644 (file)
@@ -73,7 +73,8 @@ typedef struct pa_daemon_conf {
         disallow_exit,
         log_meta,
         log_time,
-        flat_volumes;
+        flat_volumes,
+        lock_memory;
     int exit_idle_time,
         scache_idle_time,
         auto_log_target,
index fcd2513a6c8bfb96df1cf6d8ffc73279a2ad5885..746ea76c5512ee7f15a5efba0d6e7ab13051cb43 100644 (file)
@@ -27,6 +27,8 @@
 ; system-instance = no
 ; disable-shm = no
 ; shm-size-bytes = 0 # setting this 0 will use the system-default, usually 64 MiB
+; lock-memory = no
+; no-cpu-limit = no
 
 ; high-priority = yes
 ; nice-level = -11
@@ -55,8 +57,6 @@
 
 ; flat-volumes = yes
 
-; no-cpu-limit = no
-
 ; rlimit-fsize = -1
 ; rlimit-data = -1
 ; rlimit-stack = -1
index 3e50baadefd85afc0b5f6e3084cfca3a0d4e0726..58f8d66031481e4286ad32b0694d0e2929039b54 100644 (file)
 
 #include <liboil/liboil.h>
 
+#ifdef HAVE_SYS_MMAN_H
+#include <sys/mman.h>
+#endif
+
 #ifdef HAVE_SYS_IOCTL_H
 #include <sys/ioctl.h>
 #endif
@@ -960,6 +964,17 @@ int main(int argc, char *argv[]) {
     pa_rtsig_configure(SIGRTMIN, SIGRTMAX-1);
 #endif
 
+    if (conf->lock_memory) {
+#ifdef HAVE_SYS_MMAN_H
+        if (mlockall(MCL_FUTURE) < 0)
+            pa_log_warn("mlockall() failed: %s", pa_cstrerror(errno));
+        else
+            pa_log_info("Sucessfully locked process into memory.");
+#else
+        pa_log_warn("Memory locking requested but not supported on platform.");
+#endif
+    }
+
     pa_memtrap_install();
 
     pa_assert_se(mainloop = pa_mainloop_new());