"synchronize_with()" now can return a boolean status, rather than just
using an ASSERT(). This allows synchronize_with() to be called with
actions that are against the program trace order, then return a status
to signify success/failure. This will allow, for instance, release
sequence calculations to simply abort this single execution, not the
whole model-checker.
* 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
void create_cv(const ModelAction *parent = NULL);
ClockVector * get_cv() const { return cv; }
void read_from(const ModelAction *act);
- void synchronize_with(const ModelAction *act);
+ bool synchronize_with(const ModelAction *act);
bool has_synchronized_with(const ModelAction *act) const;
bool happens_before(const ModelAction *act) const;