+ reads_from = act;
+ if (act != NULL && this->is_acquire()) {
+ rel_heads_list_t release_heads;
+ model->get_release_seq_heads(this, &release_heads);
+ int num_heads = release_heads.size();
+ for (unsigned int i = 0; i < release_heads.size(); i++)
+ if (!synchronize_with(release_heads[i])) {
+ model->set_bad_synchronization();
+ num_heads--;
+ }
+ return num_heads > 0;
+ }
+ return false;
+}
+
+/**
+ * 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
+ */
+bool ModelAction::synchronize_with(const ModelAction *act) {
+ if (*this < *act && type != THREAD_JOIN && type != ATOMIC_LOCK)
+ return false;
+ model->check_promises(act->get_tid(), cv, act->cv);
+ cv->merge(act->cv);
+ return true;
+}
+
+bool ModelAction::has_synchronized_with(const ModelAction *act) const
+{
+ return cv->has_synchronized_with(act->cv);