/* THREAD_CREATE stores its (Thread *) in a thrd_t::priv */
thrd_t *thrd = (thrd_t *)get_location();
return thrd->priv;
- } else if (type == THREAD_JOIN)
+ } else if (type == PTHREAD_CREATE) {
+ // not implemented
+ return NULL;
+ } else if (type == THREAD_JOIN) {
/* THREAD_JOIN uses (Thread *) for location */
return (Thread *)get_location();
- else
+ } else if (type == PTHREAD_JOIN) {
+ // WL: to be added (modified)
+ return (Thread *)get_location();
+ } else
return NULL;
}
case THREAD_YIELD: return "thread yield";
case THREAD_JOIN: return "thread join";
case THREAD_FINISH: return "thread finish";
+
+ case PTHREAD_CREATE: return "pthread create";
+ case PTHREAD_JOIN: return "pthread join";
+
case ATOMIC_UNINIT: return "uninitialized";
case ATOMIC_READ: return "atomic read";
case ATOMIC_WRITE: return "atomic write";
#include "threads-model.h"
#include "bugmessage.h"
+#include <pthread.h>
+
#define INITIAL_THREAD_ID 0
/**
}
break;
}
+ case PTHREAD_CREATE: {
+ thrd_t *thrd = (thrd_t *)curr->get_location();
+ struct pthread_params *params = (struct pthread_params *)curr->get_value();
+ Thread *th = new Thread(get_next_id(), thrd, params->func, params->arg, get_thread(curr));
+ add_thread(th);
+ th->set_creation(curr);
+ /* Promises can be satisfied by children */
+ for (unsigned int i = 0; i < promises.size(); i++) {
+ Promise *promise = promises[i];
+ if (promise->thread_is_available(curr->get_tid()))
+ promise->add_thread(th->get_id());
+ }
+ break;
+ }
case THREAD_JOIN: {
Thread *blocking = curr->get_thread_operand();
ModelAction *act = get_last_action(blocking->get_id());
updated = true; /* trigger rel-seq checks */
break;
}
+ case PTHREAD_JOIN: {
+ break; // WL: to be add (modified)
+ Thread *blocking = curr->get_thread_operand();
+ ModelAction *act = get_last_action(blocking->get_id());
+ synchronize(act, curr);
+ updated = true; /* trigger rel-seq checks */
+ }
+
case THREAD_FINISH: {
Thread *th = get_thread(curr);
/* Wake up any joining threads */
}
/* Follow CREATE with the created thread */
+ /* which is not needed, because model.cc takes care of this */
if (curr->get_type() == THREAD_CREATE)
+ return curr->get_thread_operand();
+ if (curr->get_type() == PTHREAD_CREATE) {
return curr->get_thread_operand();
+ }
return NULL;
}
scheduler->sleep(th);
}
}
- /* Catch assertions from prior take_step or from
- * between-ModelAction bugs (e.g., data races) */
for (unsigned int i = 1; i < get_num_threads(); i++) {
Thread *th = get_thread(int_to_id(i));
break;
}
} else if (act->get_type() == THREAD_CREATE || \
+ act->get_type() == PTHREAD_CREATE || \
act->get_type() == THREAD_START || \
act->get_type() == THREAD_FINISH) {
t = th;
}
}
+ /* Catch assertions from prior take_step or from
+ * between-ModelAction bugs (e.g., data races) */
if (execution->has_asserted())
break;