From 7bbe5971bfa7355c41ae4d2e5021b2ac8b357f4f Mon Sep 17 00:00:00 2001 From: nedko Date: Sat, 12 Nov 2011 19:23:44 +0000 Subject: [PATCH] jackdbus: group batch of saves into one When a parameter is set, jackdbus used to save immediately. This was quite annoying and ineffective when configuring lot of parameters without delay. It caused log line to appear for each parameter set and xml file serialization as well. This changeset implements delayed save. Parameters are saved two seconds after last parameter set. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4583 0c269be4-1314-0410-8aa9-9f06e86f4224 --- dbus/controller.c | 46 +++++++++++++++++++++++++++++++ dbus/controller.h | 4 +++ dbus/controller_iface_configure.c | 4 +-- dbus/controller_iface_control.c | 4 +-- dbus/controller_internal.h | 6 ++++ dbus/jackdbus.c | 5 +++- 6 files changed, 64 insertions(+), 5 deletions(-) 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);