#include <ucontext.h>
#include "mymemory.h"
-#include "libthreads.h"
-#include "threads.h"
#include "action.h"
-#include "clockvector.h"
#include "hashtable.h"
#include "workqueue.h"
#include "config.h"
+#include "modeltypes.h"
/* Forward declaration */
class NodeStack;
class CycleGraph;
class Promise;
class Scheduler;
+class Thread;
/** @brief Shorthand for a list of release sequence heads */
typedef std::vector< const ModelAction *, ModelAlloc<const ModelAction *> > rel_heads_list_t;
*/
struct model_snapshot_members {
ModelAction *current_action;
- int next_thread_id;
+ unsigned int next_thread_id;
modelclock_t used_sequence_numbers;
Thread *nextThread;
ModelAction *next_backtrack;
void add_thread(Thread *t);
void remove_thread(Thread *t);
- Thread * get_thread(thread_id_t tid);
- Thread * get_thread(ModelAction *act);
+ Thread * get_thread(thread_id_t tid) const;
+ Thread * get_thread(ModelAction *act) const;
thread_id_t get_next_id();
- int get_num_threads();
+ unsigned int get_num_threads();
Thread * get_current_thread();
int switch_to_master(ModelAction *act);
bool isfeasible();
bool isfeasibleotherthanRMW();
bool isfinalfeasible();
- void check_promises(ClockVector *old_cv, ClockVector * merge_cv);
+ void mo_check_promises(thread_id_t tid, const ModelAction *write);
+ void check_promises(thread_id_t tid, ClockVector *old_cv, ClockVector * merge_cv);
void get_release_seq_heads(ModelAction *act, rel_heads_list_t *release_heads);
void finish_execution();
bool isfeasibleprefix();
void set_bad_synchronization() { bad_synchronization = true; }
const model_params params;
+ Scheduler * get_scheduler() { return scheduler;}
MEMALLOC
private:
void post_r_modification_order(ModelAction *curr, const ModelAction *rf);
bool r_modification_order(ModelAction *curr, const ModelAction *rf);
bool w_modification_order(ModelAction *curr);
- bool release_seq_head(const ModelAction *rf, rel_heads_list_t *release_heads) const;
+ bool release_seq_heads(const ModelAction *rf, rel_heads_list_t *release_heads) const;
bool resolve_release_sequences(void *location, work_queue_t *work_queue);
void do_complete_join(ModelAction *join);