# # patch "ChangeLog" # from [50fa8303aeb55d364c932720badca25be590865f] # to [eb5c81c96e0c5511885e2d346dca79a3d1d91ff6] # # patch "packet.cc" # from [90a102794d4dc3b6943b502026bfb74c4ab69fab] # to [4d1e28798820d2902092b64f87179f3c5754ce37] # --- ChangeLog +++ ChangeLog @@ -1,3 +1,10 @@ +2005-05-21 Matt Johnston + + * packet.cc (db_packet_writer::~impl, prerequisite.cleanup): + add code to remove up circular dependencies between prerequisite + and delayed_packet shared_ptrs upon destruction, so that unsatisified + dependency warnings are printed. + 2005-05-19 Matt Johnston * change_set.cc (merge_disjoint_analyses): handle the case where --- packet.cc +++ packet.cc @@ -116,6 +116,9 @@ return type < other.type || (type == other.type && ident < other.ident); } + // we need to be able to avoid circular dependencies between prerequisite and + // delayed_packet shared_ptrs. + void cleanup() { delayed.clear(); } }; class @@ -321,7 +324,7 @@ delayed_revision_data_packet::~delayed_revision_data_packet() { if (!all_prerequisites_satisfied()) - W(F("discarding revision data packet with unmet dependencies\n")); + W(F("discarding revision data packet %s with unmet dependencies\n") % ident); } void @@ -334,7 +337,7 @@ delayed_manifest_data_packet::~delayed_manifest_data_packet() { if (!all_prerequisites_satisfied()) - W(F("discarding manifest data packet with unmet dependencies\n")); + W(F("discarding manifest data packet %s with unmet dependencies\n") % ident); } void @@ -366,7 +369,8 @@ delayed_manifest_delta_packet::~delayed_manifest_delta_packet() { if (!all_prerequisites_satisfied()) - W(F("discarding manifest delta packet with unmet dependencies\n")); + W(F("discarding manifest delta packet %s -> %s with unmet dependencies\n") + % old_id % new_id); } void @@ -385,7 +389,8 @@ delayed_file_delta_packet::~delayed_file_delta_packet() { if (!all_prerequisites_satisfied()) - W(F("discarding file delta packet with unmet dependencies\n")); + W(F("discarding file delta packet %s -> %s with unmet dependencies\n") + % old_id % new_id); } void @@ -466,6 +471,8 @@ : app(app), take_keys(take_keys), count(0) // cert("cert", 1), manc("manc", 1), manw("manw", 1), filec("filec", 1) {} + + ~impl(); }; packet_db_writer::packet_db_writer(app_state & app, bool take_keys) @@ -475,7 +482,27 @@ packet_db_writer::~packet_db_writer() {} +packet_db_writer::impl::~impl() +{ + // break any circular dependencies for unsatisfied prerequisites + for (map >::const_iterator i = + revision_prereqs.begin(); i != revision_prereqs.end(); i++) + { + i->second->cleanup(); + } + for (map >::const_iterator i = + manifest_prereqs.begin(); i != manifest_prereqs.end(); i++) + { + i->second->cleanup(); + } + for (map >::const_iterator i = + file_prereqs.begin(); i != file_prereqs.end(); i++) + { + i->second->cleanup(); + } +} + bool packet_db_writer::impl::revision_exists_in_db(revision_id const & r) {