#include "hashtable.h"
#include <vector>
#include <inttypes.h>
-
+#include "config.h"
#include "mymemory.h"
+class Promise;
class CycleNode;
class ModelAction;
bool checkForCycles();
bool checkForRMWViolation();
void addRMWEdge(const ModelAction *from, const ModelAction *rmw);
-
+ bool checkPromise(const ModelAction *from, Promise *p);
bool checkReachable(const ModelAction *from, const ModelAction *to);
void startChanges();
void commitChanges();
void rollbackChanges();
+#if SUPPORT_MOD_ORDER_DUMP
+ void dumpNodes(FILE *file);
+ void dumpGraphToFile(const char *filename);
+#endif
SNAPSHOTALLOC
private:
CycleNode * getNode(const ModelAction *);
+ HashTable<CycleNode *, CycleNode *, uintptr_t, 4, model_malloc, model_calloc, model_free> *discovered;
/** @brief A table for mapping ModelActions to CycleNodes */
HashTable<const ModelAction *, CycleNode *, uintptr_t, 4> actionToNode;
+#if SUPPORT_MOD_ORDER_DUMP
+ std::vector<CycleNode *> nodeList;
+#endif
bool checkReachable(CycleNode *from, CycleNode *to);
bool hasRMWViolation;
bool oldRMWViolation;
- std::vector<CycleNode *> rollbackvector;
- std::vector<CycleNode *> rmwrollbackvector;
+ std::vector< CycleNode *, SnapshotAlloc<CycleNode *> > rollbackvector;
+ std::vector< CycleNode *, SnapshotAlloc<CycleNode *> > rmwrollbackvector;
};
/** @brief A node within a CycleGraph; corresponds to one ModelAction */
class CycleNode {
public:
CycleNode(const ModelAction *action);
- void addEdge(CycleNode * node);
- std::vector<CycleNode *> * getEdges();
+ bool addEdge(CycleNode *node);
+ CycleNode * getEdge(unsigned int i) const;
+ unsigned int getNumEdges() const;
bool setRMW(CycleNode *);
- CycleNode* getRMW();
+ CycleNode * getRMW() const;
+ const ModelAction * getAction() const { return action; }
+
void popEdge() {
edges.pop_back();
- };
+ }
void clearRMW() {
- hasRMW=NULL;
+ hasRMW = NULL;
}
SNAPSHOTALLOC
const ModelAction *action;
/** @brief The edges leading out from this node */
- std::vector<CycleNode *> edges;
+ std::vector< CycleNode *, SnapshotAlloc<CycleNode *> > edges;
/** Pointer to a RMW node that reads from this node, or NULL, if none
* exists */
- CycleNode * hasRMW;
+ CycleNode *hasRMW;
};
#endif