+ if (node.name() != xml_node_name) {
+ return -1;
+ }
+
+ XMLNodeList const& children (node.children());
+ Glib::Threads::RWLock::WriterLock lm (master_lock);
+
+ for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
+ if ((*i)->name() == X_("Master")) {
+ XMLProperty const* prop = (*i)->property (X_("number"));
+ if (prop) {
+ uint32_t n = atoi (prop->value());
+ _masters.insert (n);
+ }
+ }
+ }
+
+ return 0;
+}
+
+int
+Slavable::do_assign (VCAManager* manager)
+{
+ std::vector<boost::shared_ptr<VCA> > vcas;
+
+ {
+ Glib::Threads::RWLock::ReaderLock lm (master_lock);
+
+ for (std::set<uint32_t>::const_iterator i = _masters.begin(); i != _masters.end(); ++i) {
+ boost::shared_ptr<VCA> v = manager->vca_by_number (*i);
+ if (v) {
+ vcas.push_back (v);
+ } else {
+ warning << string_compose (_("Master #%1 not found, assignment lost"), *i) << endmsg;
+ }
+ }
+ }
+
+ /* now that we've released the lock, we can do the assignments */
+
+ for (std::vector<boost::shared_ptr<VCA> >::iterator v = vcas.begin(); v != vcas.end(); ++v) {
+ assign (*v);
+ }
+
+ assign_connection.disconnect ();
+