action: synchronize_with - return status for out-of-order synchronization
authorBrian Norris <banorris@uci.edu>
Mon, 1 Oct 2012 20:20:56 +0000 (13:20 -0700)
committerBrian Norris <banorris@uci.edu>
Mon, 1 Oct 2012 20:20:56 +0000 (13:20 -0700)
"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.

action.cc
action.h

index 3fda30de4bf7e425ac99fe95d5c30aca198965d5..54ecce7dd4192e81c5e587041d2df7af27031de8 100644 (file)
--- a/action.cc
+++ b/action.cc
@@ -236,11 +236,14 @@ void ModelAction::read_from(const ModelAction *act)
  * Synchronize the current thread with the thread corresponding to the
  * ModelAction parameter.
  * @param act The ModelAction to synchronize with
  * 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);
        model->check_promises(cv, act->cv);
        cv->merge(act->cv);
+       return true;
 }
 
 bool ModelAction::has_synchronized_with(const ModelAction *act) const
 }
 
 bool ModelAction::has_synchronized_with(const ModelAction *act) const
index c455ea780883b371d80caed2d25c95e3d16edf1b..fecef4dbf3043ac920d5fb09efef85ffb8d6e863 100644 (file)
--- a/action.h
+++ b/action.h
@@ -103,7 +103,7 @@ public:
        void create_cv(const ModelAction *parent = NULL);
        ClockVector * get_cv() const { return cv; }
        void read_from(const ModelAction *act);
        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;
 
        bool has_synchronized_with(const ModelAction *act) const;
        bool happens_before(const ModelAction *act) const;