// cds volatile loads
#define VOLATILELOAD(size) \
- uint ## size ## _t cds_volatile_load ## size(void * obj, const char * position) { \
- ensureModel(); \
- return (uint ## size ## _t) model->switch_to_master(new ModelAction(ATOMIC_READ, position, memory_order_relaxed, obj)); \
- }
+ uint ## size ## _t cds_volatile_load ## size(void * obj, const char * position) { \
+ ensureModel(); \
+ return (uint ## size ## _t)model->switch_to_master(new ModelAction(ATOMIC_READ, position, memory_order_relaxed, obj)); \
+ }
VOLATILELOAD(8)
VOLATILELOAD(16)
// cds volatile stores
#define VOLATILESTORE(size) \
- void cds_volatile_store ## size (void * obj, uint ## size ## _t val, const char * position) { \
- ensureModel(); \
- model->switch_to_master(new ModelAction(ATOMIC_WRITE, position, memory_order_relaxed, obj, (uint64_t) val)); \
-}
+ void cds_volatile_store ## size (void * obj, uint ## size ## _t val, const char * position) { \
+ ensureModel(); \
+ model->switch_to_master(new ModelAction(ATOMIC_WRITE, position, memory_order_relaxed, obj, (uint64_t) val)); \
+ }
VOLATILESTORE(8)
VOLATILESTORE(16)
next_thread_id(INITIAL_THREAD_ID),
used_sequence_numbers(0),
bugs(),
- dataraces(),
bad_synchronization(false),
asserted(false)
{ }
~model_snapshot_members() {
for (unsigned int i = 0;i < bugs.size();i++)
delete bugs[i];
- for (unsigned int i = 0;i < dataraces.size(); i++)
- delete dataraces[i];
bugs.clear();
- dataraces.clear();
}
unsigned int next_thread_id;
modelclock_t used_sequence_numbers;
SnapVector<bug_message *> bugs;
- SnapVector<bug_message *> dataraces;
/** @brief Incorrectly-ordered synchronization was made */
bool bad_synchronization;
bool asserted;
return false;
}
-/* @brief Put data races in a different list from other bugs. The purpose
- * is to continue the program untill the number of data races exceeds a
- * threshold */
-
-/* TODO: check whether set_assert should be called */
-bool ModelExecution::assert_race(const char *msg)
-{
- priv->dataraces.push_back(new bug_message(msg));
-
- if (isfeasibleprefix()) {
- set_assert();
- return true;
- }
- return false;
-}
-
/** @return True, if any bugs have been reported for this execution */
bool ModelExecution::have_bug_reports() const
{
}
/** @return True, if any fatal bugs have been reported for this execution.
- * Any bug other than a data race is considered a fatal bug. Data races
+ * Any bug other than a data race is considered a fatal bug. Data races
* are not considered fatal unless the number of races is exceeds
- * a threshold (temporarily set as 15).
+ * a threshold (temporarily set as 15).
*/
bool ModelExecution::have_fatal_bug_reports() const
{
- return priv->bugs.size() != 0 || priv->dataraces.size() >= 15;
+ return priv->bugs.size() != 0;
}
SnapVector<bug_message *> * ModelExecution::get_bugs() const
SnapVector<const ModelAction *> * priorset = new SnapVector<const ModelAction *>();
bool hasnonatomicstore = hasNonAtomicStore(curr->get_location());
if (hasnonatomicstore) {
- ModelAction * nonatomicstore = convertNonAtomicStore(curr->get_location());
- rf_set->push_back(nonatomicstore);
+ ModelAction * nonatomicstore = convertNonAtomicStore(curr->get_location());
+ rf_set->push_back(nonatomicstore);
}
while(true) {
{
int tid = id_to_int(act->get_tid());
insertIntoActionListAndSetCV(&action_trace, act);
-
+
action_list_t *list = get_safe_ptr_action(&obj_map, act->get_location());
insertIntoActionList(list, act);
bool check_action_enabled(ModelAction *curr);
bool assert_bug(const char *msg);
- bool assert_race(const char *msg);
bool have_bug_reports() const;
bool have_fatal_bug_reports() const;
func_inst = new FuncInst(act, this);
inst->get_collisions()->push_back(func_inst);
- inst_list.push_back(func_inst); // delete?
+ inst_list.push_back(func_inst); // delete?
return func_inst;
}
/* Store the memory locations where atomic reads happen */
bool push_loc = true;
ModelList<void *>::iterator it;
- for (it = read_locations.begin(); it != read_locations.end(); it++) {
+ for (it = read_locations.begin();it != read_locations.end();it++) {
if (location == *it) {
push_loc = false;
break;
read_map_t * read_map = thrd_read_map[tid];
ModelList<void *>::iterator it;
- for (it = read_locations.begin(); it != read_locations.end(); it++) {
+ for (it = read_locations.begin();it != read_locations.end();it++) {
if ( !read_map->contains(*it) )
break;
/** @brief Constructor */
ModelHistory::ModelHistory() :
- func_counter(1), /* function id starts with 1 */
+ func_counter(1), /* function id starts with 1 */
func_map(),
func_map_rev(),
func_nodes()
void ModelHistory::print()
{
/* function id starts with 1 */
- for (uint32_t i = 1; i < func_nodes.size(); i++) {
+ for (uint32_t i = 1;i < func_nodes.size();i++) {
FuncNode * func_node = func_nodes[i];
func_inst_list_mt * entry_insts = func_node->get_entry_insts();
return execution->assert_bug(str);
}
-/**
- * @brief Assert a data race in the executing program.
- *
- * Different from assert_bug, the program will not be aborted immediately
- * upon calling this function, unless the number of data races exceeds
- * a threshold.
- *
- * @param msg Descriptive message for the bug (do not include newline char)
- * @return True if bug is immediately-feasible
- */
-bool ModelChecker::assert_race(const char *msg, ...)
-{
- char str[800];
-
- va_list ap;
- va_start(ap, msg);
- vsnprintf(str, sizeof(str), msg, ap);
- va_end(ap);
-
- return execution->assert_race(str);
-}
-
/**
* @brief Assert a bug in the executing program, asserted by a user thread
* @see ModelChecker::assert_bug
uint64_t switch_to_master(ModelAction *act);
bool assert_bug(const char *msg, ...);
- bool assert_race(const char *msg, ...);
void assert_user_bug(const char *msg);