X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Flayout.cpp;h=af7304da6aeef557f3f4f8119d08cc4aaca1ace4;hb=02c12263ac40289afc626156358ebb705ed84a5b;hp=0901382b91d0f140bb8ddf39010bf41228b33bfb;hpb=78d36019ec11d62d6fd016fcbe19f566d11771ff;p=r2c2.git diff --git a/source/libr2c2/layout.cpp b/source/libr2c2/layout.cpp index 0901382..af7304d 100644 --- a/source/libr2c2/layout.cpp +++ b/source/libr2c2/layout.cpp @@ -69,31 +69,69 @@ Driver &Layout::get_driver() const void Layout::add(Object &o) { if(objects.insert(o)) - signal_object_added.emit(o); + { + try + { + signal_object_added.emit(o); + } + catch(...) + { + objects.erase(o); + throw; + } + } } void Layout::add(Track &t) { if(objects.insert(t)) { - // Blocks must be recreated first - create_blocks(); - signal_object_added.emit(t); + try + { + // Blocks must be recreated first + create_blocks(); + signal_object_added.emit(t); + } + catch(...) + { + objects.erase(t); + create_blocks(); + throw; + } } } void Layout::add(TrackChain &g) { if(track_chains.insert(g)) - signal_track_chain_added.emit(g); + { + try + { + signal_track_chain_added.emit(g); + } + catch(...) + { + track_chains.erase(g); + throw; + } + } } void Layout::add(Block &b) { if(track_chains.insert(b)) { - b.signal_reserved.connect(sigc::bind<0>(signal_block_reserved, sigc::ref(b))); - signal_track_chain_added.emit(b); + sigc::connection conn = b.signal_reserved.connect(sigc::bind<0>(signal_block_reserved, sigc::ref(b))); + try + { + signal_track_chain_added.emit(b); + } + catch(...) + { + track_chains.erase(b); + conn.disconnect(); + throw; + } } }