From: Arvin Schnell Date: Tue, 31 Jul 2012 13:39:28 +0000 (+0200) Subject: - work on dbus interface X-Git-Tag: v0.1.3~183 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=98add07f9a7b592435b025c3d5368bc992d59379;p=thirdparty%2Fsnapper.git - work on dbus interface --- diff --git a/server/Client.cc b/server/Client.cc index 6757a114..e3f518fc 100644 --- a/server/Client.cc +++ b/server/Client.cc @@ -41,7 +41,7 @@ Client::~Client() { thread.interrupt(); - thread.join(); // TODO this can block + thread.join(); // TODO this can block and deadlock for (list::iterator it = comparisons.begin(); it != comparisons.end(); ++it) { diff --git a/server/snapperd.cc b/server/snapperd.cc index 8f44b7b2..f1ebadad 100644 --- a/server/snapperd.cc +++ b/server/snapperd.cc @@ -58,6 +58,9 @@ using namespace snapper; Clients clients; +boost::shared_mutex big_mutex; + + void Client::introspect(DBus::Connection& conn, DBus::Message& msg) { @@ -360,6 +363,8 @@ Client::list_configs(DBus::Connection& conn, DBus::Message& msg) { y2deb("ListConfigs"); + boost::shared_lock lock(big_mutex); + list config_infos = Snapper::getConfigs(); // TODO DBus::MessageMethodReturn reply(msg); @@ -381,7 +386,9 @@ Client::get_config(DBus::Connection& conn, DBus::Message& msg) y2deb("GetConfig config_name:" << config_name); - MetaSnappers::iterator it = meta_snappers.find(config_name); + boost::shared_lock lock(big_mutex); + + MetaSnappers::const_iterator it = meta_snappers.find(config_name); check_permission(conn, msg, *it); @@ -408,6 +415,8 @@ Client::create_config(DBus::Connection& conn, DBus::Message& msg) y2deb("CreateConfig config_name:" << config_name << " subvolume:" << subvolume << " fstype:" << fstype << " template_name:" << template_name); + boost::unique_lock lock(big_mutex); + check_permission(conn, msg); Snapper::createConfig(config_name, subvolume, fstype, template_name); @@ -432,6 +441,8 @@ Client::delete_config(DBus::Connection& conn, DBus::Message& msg) y2deb("DeleteConfig config_name:" << config_name); + boost::unique_lock lock(big_mutex); + check_permission(conn, msg); Snapper::deleteConfig(config_name); @@ -456,6 +467,8 @@ Client::lock_config(DBus::Connection& conn, DBus::Message& msg) y2deb("LockConfig config_name:" << config_name); + boost::unique_lock lock(big_mutex); + MetaSnappers::iterator it = meta_snappers.find(config_name); check_permission(conn, msg, *it); @@ -478,6 +491,8 @@ Client::unlock_config(DBus::Connection& conn, DBus::Message& msg) y2deb("UnlockConfig config_name:" << config_name); + boost::unique_lock lock(big_mutex); + MetaSnappers::iterator it = meta_snappers.find(config_name); check_permission(conn, msg, *it); @@ -500,6 +515,8 @@ Client::list_snapshots(DBus::Connection& conn, DBus::Message& msg) y2deb("ListSnapshots config_name:" << config_name); + boost::unique_lock lock(big_mutex); + MetaSnappers::iterator it = meta_snappers.find(config_name); check_permission(conn, msg, *it); @@ -526,6 +543,8 @@ Client::get_snapshot(DBus::Connection& conn, DBus::Message& msg) y2deb("GetSnapshot config_name:" << config_name << " num:" << num); + boost::unique_lock lock(big_mutex); + MetaSnappers::iterator it = meta_snappers.find(config_name); check_permission(conn, msg, *it); @@ -559,6 +578,8 @@ Client::set_snapshot(DBus::Connection& conn, DBus::Message& msg) y2deb("SetSnapshot config_name:" << config_name << " num:" << num); + boost::unique_lock lock(big_mutex); + MetaSnappers::iterator it = meta_snappers.find(config_name); check_permission(conn, msg, *it); @@ -594,6 +615,8 @@ Client::create_single_snapshot(DBus::Connection& conn, DBus::Message& msg) y2deb("CreateSingleSnapshot config_name:" << config_name << " description:" << description << " cleanup:" << cleanup); + boost::unique_lock lock(big_mutex); + MetaSnappers::iterator it = meta_snappers.find(config_name); check_permission(conn, msg, *it); @@ -630,6 +653,8 @@ Client::create_pre_snapshot(DBus::Connection& conn, DBus::Message& msg) y2deb("CreatePreSnapshot config_name:" << config_name << " description:" << description << " cleanup:" << cleanup); + boost::unique_lock lock(big_mutex); + MetaSnappers::iterator it = meta_snappers.find(config_name); check_permission(conn, msg, *it); @@ -667,6 +692,8 @@ Client::create_post_snapshot(DBus::Connection& conn, DBus::Message& msg) y2deb("CreatePostSnapshot config_name:" << config_name << " pre_num:" << pre_num << " description:" << description << " cleanup:" << cleanup); + boost::unique_lock lock(big_mutex); + MetaSnappers::iterator it = meta_snappers.find(config_name); check_permission(conn, msg, *it); @@ -704,6 +731,8 @@ Client::delete_snapshots(DBus::Connection& conn, DBus::Message& msg) y2deb("DeleteSnapshots config_name:" << config_name << " nums:" << nums); + boost::unique_lock lock(big_mutex); + check_lock(conn, msg, config_name); MetaSnappers::iterator it = meta_snappers.find(config_name); @@ -740,6 +769,8 @@ Client::mount_snapshot(DBus::Connection& conn, DBus::Message& msg) y2deb("MountSnapshot config_name:" << config_name << " num:" << num); + boost::unique_lock lock(big_mutex); + MetaSnappers::iterator it = meta_snappers.find(config_name); check_permission(conn, msg, *it); @@ -769,6 +800,8 @@ Client::umount_snapshot(DBus::Connection& conn, DBus::Message& msg) y2deb("UmountSnapshot config_name:" << config_name << " num:" << num); + boost::unique_lock lock(big_mutex); + MetaSnappers::iterator it = meta_snappers.find(config_name); check_permission(conn, msg, *it); @@ -796,8 +829,9 @@ Client::create_comparison(DBus::Connection& conn, DBus::Message& msg) DBus::Hihi hihi(msg); hihi >> config_name >> num1 >> num2; - y2deb("CreateComparison config_name:" << config_name << " num1:" << num1 << - " num2:" << num2); + y2deb("CreateComparison config_name:" << config_name << " num1:" << num1 << " num2:" << num2); + + boost::unique_lock lock(big_mutex); MetaSnappers::iterator it = meta_snappers.find(config_name); @@ -808,8 +842,12 @@ Client::create_comparison(DBus::Connection& conn, DBus::Message& msg) Snapshots::const_iterator snapshot1 = snapshots.find(num1); Snapshots::const_iterator snapshot2 = snapshots.find(num2); + lock.unlock(); + Comparison* comparison = new Comparison(snapper, snapshot1, snapshot2); + lock.lock(); + comparisons.push_back(comparison); DBus::MessageMethodReturn reply(msg); @@ -827,8 +865,9 @@ Client::get_files(DBus::Connection& conn, DBus::Message& msg) DBus::Hihi hihi(msg); hihi >> config_name >> num1 >> num2; - y2deb("GetFiles config_name:" << config_name << " num1:" << num1 << " num2:" << - num2); + y2deb("GetFiles config_name:" << config_name << " num1:" << num1 << " num2:" << num2); + + boost::unique_lock lock(big_mutex); MetaSnappers::iterator it = meta_snappers.find(config_name); @@ -858,8 +897,10 @@ Client::get_diff(DBus::Connection& conn, DBus::Message& msg) DBus::Hihi hihi(msg); hihi >> config_name >> num1 >> num2 >> filename >> options; - y2deb("GetDiff config_name:" << config_name << " num1:" << num1 << " num2:" << - num2 << " filename:" << filename << " options:" << options); + y2deb("GetDiff config_name:" << config_name << " num1:" << num1 << " num2:" << num2 << + " filename:" << filename << " options:" << options); + + boost::unique_lock lock(big_mutex); MetaSnappers::iterator it = meta_snappers.find(config_name); @@ -872,8 +913,12 @@ Client::get_diff(DBus::Connection& conn, DBus::Message& msg) Files::iterator it3 = files.find(filename); assert(it3 != files.end()); + lock.unlock(); + vector d = it3->getDiff(options); + lock.lock(); + DBus::MessageMethodReturn reply(msg); DBus::Hoho hoho(reply); @@ -893,8 +938,9 @@ Client::set_undo(DBus::Connection& conn, DBus::Message& msg) DBus::Hihi hihi(msg); hihi >> config_name >> num1 >> num2 >> undos; - y2deb("SetUndo config_name:" << config_name << " num1:" << num1 << " num2:" << - num2); + y2deb("SetUndo config_name:" << config_name << " num1:" << num1 << " num2:" << num2); + + boost::unique_lock lock(big_mutex); MetaSnappers::iterator it = meta_snappers.find(config_name); @@ -929,8 +975,9 @@ Client::set_undo_all(DBus::Connection& conn, DBus::Message& msg) DBus::Hihi hihi(msg); hihi >> config_name >> num1 >> num2 >> undo; - y2deb("SetUndoAll config_name:" << config_name << " num1:" << num1 << " num2:" << - num2); + y2deb("SetUndoAll config_name:" << config_name << " num1:" << num1 << " num2:" << num2); + + boost::unique_lock lock(big_mutex); MetaSnappers::iterator it = meta_snappers.find(config_name); @@ -960,8 +1007,9 @@ Client::get_undo_steps(DBus::Connection& conn, DBus::Message& msg) DBus::Hihi hihi(msg); hihi >> config_name >> num1 >> num2; - y2deb("GetUndoSteps config_name:" << config_name << " num1:" << num1 << " num2:" << - num2); + y2deb("GetUndoSteps config_name:" << config_name << " num1:" << num1 << " num2:" << num2); + + boost::unique_lock lock(big_mutex); MetaSnappers::iterator it = meta_snappers.find(config_name); @@ -992,14 +1040,20 @@ Client::do_undo_step(DBus::Connection& conn, DBus::Message& msg) y2deb("DoUndoStep config_name:" << config_name << " num1:" << num1 << " num2:" << num2); + boost::unique_lock lock(big_mutex); + MetaSnappers::iterator it = meta_snappers.find(config_name); check_permission(conn, msg, *it); Comparison* comparison = find_comparison(it->getSnapper(), num1, num2); + lock.unlock(); + bool ret = comparison->doUndoStep(undo_step); + lock.lock(); + DBus::MessageMethodReturn reply(msg); DBus::Hoho hoho(reply); @@ -1012,6 +1066,10 @@ Client::do_undo_step(DBus::Connection& conn, DBus::Message& msg) void Client::debug(DBus::Connection& conn, DBus::Message& msg) { + y2deb("Debug"); + + boost::shared_lock lock(big_mutex); + check_permission(conn, msg); DBus::MessageMethodReturn reply(msg);