📄 transact.cxx
字号:
toplevel = current_transaction->toplevel; current_transaction = current_transaction->parent; } while (!result && (0 != current_transaction)); if (!result) { CYG_ASSERT_CLASSC(toplevel); for (conf_i = toplevel->structural_conflicts.begin(); conf_i != toplevel->structural_conflicts.end(); conf_i++) { if ((node == (*conf_i)->get_node()) && (prop == (*conf_i)->get_property()) && !(this->has_conflict_been_cleared(*conf_i)) && (*pFn)(*conf_i)) { result = true; break; } } } CYG_REPORT_RETVAL(result); return result;}CdlConflictCdlTransactionBody::get_structural_conflict(CdlNode node, CdlProperty prop, bool (*pFn)(CdlConflict)){ CYG_REPORT_FUNCNAMETYPE("CdlTransaction::get_structural_conflict", "result %p"); CYG_REPORT_FUNCARG4XV(this, node, prop, pFn); CYG_PRECONDITION_THISC(); CYG_PRECONDITION_CLASSC(node); CYG_PRECONDITION_CLASSC(prop); CdlConflict result = 0; std::list<CdlConflict>::const_iterator conf_i; CdlTransaction current_transaction = this; CdlToplevel toplevel = this->toplevel; do { CYG_LOOP_INVARIANT_CLASSC(current_transaction); for (conf_i = current_transaction->new_structural_conflicts.begin(); conf_i != current_transaction->new_structural_conflicts.end(); conf_i++) { if ((node == (*conf_i)->get_node()) && (prop == (*conf_i)->get_property()) && !(this->has_conflict_been_cleared(*conf_i)) && (*pFn)(*conf_i)) { result = *conf_i; break; } } toplevel = current_transaction->toplevel; current_transaction = current_transaction->parent; } while ((0 == result) && (0 != current_transaction)); if (0 == result) { CYG_ASSERT_CLASSC(toplevel); for (conf_i = toplevel->structural_conflicts.begin(); conf_i != toplevel->structural_conflicts.end(); conf_i++) { if ((node == (*conf_i)->get_node()) && (prop == (*conf_i)->get_property()) && !(this->has_conflict_been_cleared(*conf_i)) && (*pFn)(*conf_i)) { result = *conf_i; break; } } } CYG_REPORT_RETVAL(result); return result;}voidCdlTransactionBody::get_structural_conflicts(CdlNode node, CdlProperty prop, bool (*pFn)(CdlConflict), std::vector<CdlConflict>& result){ CYG_REPORT_FUNCNAME("CdlTransaction::get_structural_conflict"); CYG_REPORT_FUNCARG4XV(this, node, prop, pFn); CYG_PRECONDITION_THISC(); CYG_PRECONDITION_CLASSC(node); CYG_PRECONDITION_CLASSC(prop); std::list<CdlConflict>::const_iterator conf_i; CdlTransaction current_transaction = this; CdlToplevel toplevel = this->toplevel; do { CYG_LOOP_INVARIANT_CLASSC(current_transaction); for (conf_i = current_transaction->new_structural_conflicts.begin(); conf_i != current_transaction->new_structural_conflicts.end(); conf_i++) { if ((node == (*conf_i)->get_node()) && (prop == (*conf_i)->get_property()) && !(this->has_conflict_been_cleared(*conf_i)) && (*pFn)(*conf_i)) { result.push_back(*conf_i); } } toplevel = current_transaction->toplevel; current_transaction = current_transaction->parent; } while (0 != current_transaction); CYG_ASSERT_CLASSC(toplevel); for (conf_i = toplevel->structural_conflicts.begin(); conf_i != toplevel->structural_conflicts.end(); conf_i++) { if ((node == (*conf_i)->get_node()) && (prop == (*conf_i)->get_property()) && !(this->has_conflict_been_cleared(*conf_i)) && (*pFn)(*conf_i)) { result.push_back(*conf_i); } } CYG_REPORT_RETURN();}//}}}//{{{ clear_conflicts() // ----------------------------------------------------------------------------// Clearing a conflict. This can only happen in the context of a// transaction.voidCdlTransactionBody::clear_conflicts(CdlNode node, bool (*pFn)(CdlConflict)){ CYG_REPORT_FUNCNAME("CdlTransaction::clear_conflicts"); CYG_REPORT_FUNCARG3XV(this, node, pFn); CYG_PRECONDITION_THISC(); CYG_PRECONDITION_CLASSC(node); // Recursing into the parent is the wrong thing to do here, it // would result in the conflict being cleared in the parent rather // than in the current transaction. std::list<CdlConflict>::iterator conf_i; CdlTransaction current_transaction = this; CdlToplevel toplevel = this->toplevel; do { CYG_LOOP_INVARIANT_CLASSC(current_transaction); for (conf_i = current_transaction->new_conflicts.begin(); conf_i != current_transaction->new_conflicts.end(); ) { CdlConflict conflict = *conf_i++; if ((node == conflict->get_node()) && !(this->has_conflict_been_cleared(conflict)) && (*pFn)(conflict)) { this->clear_conflict(conflict); } } toplevel = current_transaction->toplevel; current_transaction = current_transaction->parent; } while (0 != current_transaction); CYG_ASSERT_CLASSC(toplevel); for (conf_i = toplevel->conflicts.begin(); conf_i != toplevel->conflicts.end(); ) { CdlConflict conflict = *conf_i++; if ((node == conflict->get_node()) && !(this->has_conflict_been_cleared(conflict)) && (*pFn)(conflict)) { this->clear_conflict(conflict); } } CYG_REPORT_RETURN();}voidCdlTransactionBody::clear_conflicts(CdlNode node, CdlProperty prop, bool (*pFn)(CdlConflict)){ CYG_REPORT_FUNCNAME("CdlTransaction::clear_conflicts"); CYG_REPORT_FUNCARG4XV(this, node, prop, pFn); CYG_PRECONDITION_THISC(); CYG_PRECONDITION_CLASSC(node); std::list<CdlConflict>::iterator conf_i; CdlTransaction current_transaction = this; CdlToplevel toplevel = this->toplevel; do { CYG_LOOP_INVARIANT_CLASSC(current_transaction); for (conf_i = current_transaction->new_conflicts.begin(); conf_i != current_transaction->new_conflicts.end(); ) { CdlConflict conflict = *conf_i++; if ((node == conflict->get_node()) && (prop == conflict->get_property()) && !(this->has_conflict_been_cleared(conflict)) && (*pFn)(conflict)) { this->clear_conflict(conflict); } } toplevel = current_transaction->toplevel; current_transaction = current_transaction->parent; } while (0 != current_transaction); CYG_ASSERT_CLASSC(toplevel); for (conf_i = toplevel->conflicts.begin(); conf_i != toplevel->conflicts.end(); ) { CdlConflict conflict = *conf_i++; if ((node == conflict->get_node()) && (prop == conflict->get_property()) && !(this->has_conflict_been_cleared(conflict)) && (*pFn)(conflict)) { this->clear_conflict(conflict); } } CYG_REPORT_RETURN();}voidCdlTransactionBody::clear_structural_conflicts(CdlNode node, bool (*pFn)(CdlConflict)){ CYG_REPORT_FUNCNAME("CdlTransaction::clear_structural_conflicts"); CYG_REPORT_FUNCARG3XV(this, node, pFn); CYG_PRECONDITION_THISC(); CYG_PRECONDITION_CLASSC(node); std::list<CdlConflict>::iterator conf_i; CdlTransaction current_transaction = this; CdlToplevel toplevel = this->toplevel; do { CYG_LOOP_INVARIANT_CLASSC(current_transaction); for (conf_i = current_transaction->new_structural_conflicts.begin(); conf_i != current_transaction->new_structural_conflicts.end(); ) { CdlConflict conflict = *conf_i++; if ((node == conflict->get_node()) && !(this->has_conflict_been_cleared(conflict)) && (*pFn)(conflict)) { this->clear_conflict(conflict); } } toplevel = current_transaction->toplevel; current_transaction = current_transaction->parent; } while (0 != current_transaction); CYG_ASSERT_CLASSC(toplevel); for (conf_i = toplevel->structural_conflicts.begin(); conf_i != toplevel->structural_conflicts.end(); ) { CdlConflict conflict = *conf_i++; if ((node == conflict->get_node()) && !(this->has_conflict_been_cleared(conflict)) && (*pFn)(conflict)) { this->clear_conflict(conflict); } } CYG_REPORT_RETURN();}voidCdlTransactionBody::clear_structural_conflicts(CdlNode node, CdlProperty prop, bool (*pFn)(CdlConflict)){ CYG_REPORT_FUNCNAME("CdlTransaction::clear_structural_conflicts"); CYG_REPORT_FUNCARG4XV(this, node, prop, pFn); CYG_PRECONDITION_THISC(); CYG_PRECONDITION_CLASSC(node); std::list<CdlConflict>::iterator conf_i; CdlTransaction current_transaction = this; CdlToplevel toplevel = this->toplevel; do { CYG_LOOP_INVARIANT_CLASSC(current_transaction); for (conf_i = current_transaction->new_structural_conflicts.begin(); conf_i != current_transaction->new_structural_conflicts.end(); ) { CdlConflict conflict = *conf_i++; if ((node == conflict->get_node()) && (prop == conflict->get_property()) && !(this->has_conflict_been_cleared(conflict)) && (*pFn)(conflict)) { this->clear_conflict(conflict); } } toplevel = current_transaction->toplevel; current_transaction = current_transaction->parent; } while (0 != current_transaction); CYG_ASSERT_CLASSC(toplevel); for (conf_i = toplevel->structural_conflicts.begin(); conf_i != toplevel->structural_conflicts.end(); ) { CdlConflict conflict = *conf_i++; if ((node == conflict->get_node()) && (prop == conflict->get_property()) && (*pFn)(conflict)) { this->clear_conflict(conflict); } } CYG_REPORT_RETURN();}//}}}//{{{ clear_conflict() // ----------------------------------------------------------------------------voidCdlTransactionBody::clear_conflict(CdlConflict conflict){ CYG_REPORT_FUNCNAME("CdlTransaction::clear_conflict"); CYG_REPORT_FUNCARG2XV(this, conflict); CYG_PRECONDITION_THISC(); CYG_PRECONDITION_CLASSC(conflict); // If this conflict was created during the transaction, it should // be on the new_conflicts or new_structural_conflicts container if (this == conflict->transaction) { // The conflict should be on one of the two new_conflicts deques. if (conflict->structural) { std::list<CdlConflict>::iterator conf_i = std::find(new_structural_conflicts.begin(), new_structural_conflicts.end(), conflict); CYG_ASSERTC(conf_i != new_structural_conflicts.end()); new_structural_conflicts.erase(conf_i); } else { std::list<CdlConflict>::iterator conf_i = std::find(new_conflicts.begin(), new_conflicts.end(), conflict); CYG_ASSERTC(conf_i != new_conflicts.end()); new_conflicts.erase(conf_i); } delete conflict; } else { if (conflict->structural) { deleted_structural_conflicts.push_back(conflict); } else { deleted_conflicts.push_back(conflict); } } CYG_REPORT_RETURN();}// ----------------------------------------------------------------------------boolCdlTransactionBody::has_conflict_been_cleared(CdlConflict conf){ CYG_REPORT_FUNCNAMETYPE("CdlTransaction::has_conflict_been_cleared", "result %d"); CYG_REPORT_FUNCARG2XV(this, conf); CYG_PRECONDITION_THISC(); CYG_PRECONDITION_CLASSC(conf); bool result = false; CdlTransaction current_transaction = this; do { if (conf->structural) { if (std::find(current_transaction->deleted_structural_conflicts.begin(), current_transaction->deleted_structural_conflicts.end(), conf) != current_transaction->deleted_structural_conflicts.end()) { result = true; } } else { if (std::find(current_transaction->deleted_conflicts.begin(), current_transaction->deleted_conflicts.end(), conf) != current_transaction->deleted_conflicts.end()) { result = true; } } current_transaction = current_transaction->parent; } while (!result && (0 != current_transaction)); CYG_REPORT_RETVAL(result); return result;}//}}}//{{{ per-transaction data // ----------------------------------------------------------------------------// Accessing the per-transaction conflict data.const std::list<CdlConflict>&CdlTransactionBody::get_new_conflicts() const{ CYG_REPORT_FUNCNAME("CdlTransaction::get_new_conflicts"); CYG_REPORT_FUNCARG1XV(this); CYG_PRECONDITION_THISC(); CYG_REPORT_RETURN(); return new_conflicts;}const std::list<CdlConflict>&CdlTransactionBody::get_new_structural_conflicts() const{ CYG_REPORT_FUNCNAME("CdlTransaction::get_new_structural_conflicts"); CYG_REPORT_FUNCARG1XV(this); CYG_PRECONDITION_THISC(); CYG_REPORT_RETURN(); return new_structural_conflicts;}const std::vector<CdlConflict>&CdlTransactionBody::get_deleted_conflicts() const{ CYG_REPORT_FUNCNAME("CdlTransaction::get_deleted_conflicts"); CYG_REPORT_FUNCARG1XV(this); CYG_PRECONDITION_THISC(); CYG_REPORT_RETURN(); return deleted_conflicts;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -