diff --git a/dbus/controller.c b/dbus/controller.c index 14d28e5c..cada1f07 100644 --- a/dbus/controller.c +++ b/dbus/controller.c @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include "controller.h" #include "controller_internal.h" @@ -560,6 +562,8 @@ jack_controller_create( controller_ptr->client = NULL; controller_ptr->started = false; + controller_ptr->pending_save = 0; + INIT_LIST_HEAD(&controller_ptr->slave_drivers); controller_ptr->slave_drivers_set = false; controller_ptr->slave_drivers_vparam_value.str[0] = 0; @@ -776,3 +780,45 @@ jack_controller_destroy( free(controller_ptr); } +void +jack_controller_run( + void * context) +{ + struct sysinfo si; + + if (controller_ptr->pending_save == 0) + { + return; + } + + if (sysinfo(&si) != 0) + { + jack_error("sysinfo() failed with %d", errno); + } + else if (si.uptime < controller_ptr->pending_save + 2) /* delay save by two seconds */ + { + return; + } + + controller_ptr->pending_save = 0; + jack_controller_settings_save_auto(controller_ptr); +} + +#undef controller_ptr + +void +jack_controller_pending_save( + struct jack_controller * controller_ptr) +{ + struct sysinfo si; + + if (sysinfo(&si) != 0) + { + jack_error("sysinfo() failed with %d.", errno); + controller_ptr->pending_save = 0; + jack_controller_settings_save_auto(controller_ptr); + return; + } + + controller_ptr->pending_save = si.uptime; +} diff --git a/dbus/controller.h b/dbus/controller.h index 19887b4f..1db79ecd 100644 --- a/dbus/controller.h +++ b/dbus/controller.h @@ -24,6 +24,10 @@ void * jack_controller_create( DBusConnection *connection); +void +jack_controller_run( + void *controller_ptr); + void jack_controller_destroy( void *controller_ptr); diff --git a/dbus/controller_iface_configure.c b/dbus/controller_iface_configure.c index 7e3a8fd9..a5e67f30 100644 --- a/dbus/controller_iface_configure.c +++ b/dbus/controller_iface_configure.c @@ -903,7 +903,7 @@ jack_controller_dbus_set_parameter_value( param_ptr->vtable.set_value(param_ptr->obj, &value); - jack_controller_settings_save_auto(controller_ptr); + jack_controller_pending_save(controller_ptr); jack_dbus_construct_method_return_empty(call); @@ -945,7 +945,7 @@ jack_controller_dbus_reset_parameter_value( param_ptr->vtable.reset(param_ptr->obj); - jack_controller_settings_save_auto(controller_ptr); + jack_controller_pending_save(controller_ptr); jack_dbus_construct_method_return_empty(call); } diff --git a/dbus/controller_iface_control.c b/dbus/controller_iface_control.c index c1e18956..05d8bf77 100644 --- a/dbus/controller_iface_control.c +++ b/dbus/controller_iface_control.c @@ -261,7 +261,7 @@ jack_control_run_method( } else { - jack_controller_settings_save_auto(controller_ptr); + jack_controller_pending_save(controller_ptr); } } else if (strcmp (call->method_name, "RemoveSlaveDriver") == 0) @@ -290,7 +290,7 @@ jack_control_run_method( } else { - jack_controller_settings_save_auto(controller_ptr); + jack_controller_pending_save(controller_ptr); } } else if (strcmp (call->method_name, "UnloadInternal") == 0) diff --git a/dbus/controller_internal.h b/dbus/controller_internal.h index 9dbce2e3..9e9fb52f 100644 --- a/dbus/controller_internal.h +++ b/dbus/controller_internal.h @@ -68,6 +68,8 @@ struct jack_controller pthread_mutex_t lock; struct list_head session_pending_commands; + + long pending_save; /* uptime seconds */ }; #define DEFAULT_DRIVER "dummy" @@ -77,6 +79,10 @@ struct jack_controller "You probably don't want to edit this because\n" \ "it will be overwritten next time jackdbus saves.\n" +void +jack_controller_pending_save( + struct jack_controller *controller_ptr); + bool jack_controller_start_server( struct jack_controller *controller_ptr, diff --git a/dbus/jackdbus.c b/dbus/jackdbus.c index 685bba3d..a03c8e3c 100644 --- a/dbus/jackdbus.c +++ b/dbus/jackdbus.c @@ -948,7 +948,10 @@ main (int argc, char **argv) jack_info("Listening for D-Bus messages"); g_exit_command = FALSE; - while (!g_exit_command && dbus_connection_read_write_dispatch (g_connection, 200)); + while (!g_exit_command && dbus_connection_read_write_dispatch (g_connection, 200)) + { + jack_controller_run(controller_ptr); + } jack_controller_destroy(controller_ptr);