rel_heads_list_t release_heads;
model->get_release_seq_heads(this, &release_heads);
for (unsigned int i = 0; i < release_heads.size(); i++)
- synchronize_with(release_heads[i]);
+ if (!synchronize_with(release_heads[i]))
+ model->set_bad_synchronization();
}
}
* Synchronize the current thread with the thread corresponding to the
* ModelAction parameter.
* @param act The ModelAction to synchronize with
+ * @return True if this is a valid synchronization; false otherwise
*/
-void ModelAction::synchronize_with(const ModelAction *act) {
- ASSERT(*act < *this || type == THREAD_JOIN || type == ATOMIC_LOCK );
+bool ModelAction::synchronize_with(const ModelAction *act) {
+ if (*this < *act && type != THREAD_JOIN && type != ATOMIC_LOCK)
+ return false;
model->check_promises(cv, act->cv);
cv->merge(act->cv);
+ return true;
}
bool ModelAction::has_synchronized_with(const ModelAction *act) const