Instead of checking only the trivial release sequence (i.e., a read-acquire
reads directly from a write-release) for establishing synchronization, make use
of the ModelChecker's more complete 'get_release_seq_head()' functionality,
then loop through all release heads and synchronize with each. This is
necessary because a read-acquire may synchronize with more than one
store-release.
Note that this step only implements support based on present knowledge. The
incomplete knowledge of the modification order, as given in mo_graph, as well
as "reading from the future" may require lazy checking.
#include <stdio.h>
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
+#include <vector>
#include "model.h"
#include "action.h"
{
ASSERT(cv);
reads_from = act;
- if (act!=NULL && act->is_release() && this->is_acquire()) {
- synchronize_with(act);
+ if (act != NULL && this->is_acquire()) {
+ std::vector<const ModelAction *> 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]);
}
}