From d010ef5d993f8c818b401185e10cb7aa1f854c5f Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 28 Jun 2014 21:27:36 +0200 Subject: [PATCH] add Session::StateProtector temp. disable save during batch updates, save once at the end. --- libs/ardour/ardour/session.h | 22 ++++++++++++++++++++++ libs/ardour/session.cc | 2 ++ libs/ardour/session_state.cc | 6 ++++++ 3 files changed, 30 insertions(+) diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index a3f89f8355..42f5ef9b75 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -433,6 +433,23 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop StateOfTheState state_of_the_state() const { return _state_of_the_state; } + class StateProtector { + public: + StateProtector (Session* s) : _session (s) { + g_atomic_int_inc (&s->_suspend_save); + } + ~StateProtector () { + if (g_atomic_int_dec_and_test (&_session->_suspend_save)) { + while (_session->_save_queued) { + _session->_save_queued = false; + _session->save_state (""); + } + } + } + private: + Session * _session; + }; + void add_route_group (RouteGroup *); void remove_route_group (RouteGroup&); void reorder_route_groups (std::list); @@ -1106,6 +1123,10 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop bool state_was_pending; StateOfTheState _state_of_the_state; + friend class StateProtector; + gint _suspend_save; /* atomic */ + volatile bool _save_queued; + void auto_save(); int load_options (const XMLNode&); int load_state (std::string snapshot_name); @@ -1658,6 +1679,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop static int get_session_info_from_path (XMLTree& state_tree, const std::string& xmlpath); }; + } // namespace ARDOUR #endif /* __ardour_session_h__ */ diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index fe12073ca4..7165412f01 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -206,6 +206,8 @@ Session::Session (AudioEngine &eng, , state_tree (0) , state_was_pending (false) , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading)) + , _suspend_save (0) + , _save_queued (false) , _last_roll_location (0) , _last_roll_or_reversal_location (0) , _last_record_location (0) diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index e9b8452045..3dc0a99f37 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -693,6 +693,12 @@ Session::save_state (string snapshot_name, bool pending, bool switch_to_snapshot return 1; } + if (g_atomic_int_get(&_suspend_save)) { + _save_queued = true; + return 1; + } + _save_queued = false; + if (!_engine.connected ()) { error << string_compose (_("the %1 audio engine is not connected and state saving would lose all I/O connections. Session not saved"), PROGRAM_NAME)