int pthread_create(pthread_t *t, const pthread_attr_t * attr,
pthread_start_t start_routine, void * arg) {
- if (!model) {
- snapshot_system_init(10000, 1024, 1024, 40000);
- model = new ModelChecker();
- model->startChecker();
- }
-
+ createModelIfNotExist();
struct pthread_params params = { start_routine, arg };
/* seq_cst is just a 'don't care' parameter */
}
int pthread_mutex_init(pthread_mutex_t *p_mutex, const pthread_mutexattr_t * attr) {
- if (!model) {
- snapshot_system_init(10000, 1024, 1024, 40000);
- model = new ModelChecker();
- model->startChecker();
- }
-
+ createModelIfNotExist();
int mutex_type = PTHREAD_MUTEX_DEFAULT;
if (attr != NULL)
pthread_mutexattr_gettype(attr, &mutex_type);
}
int pthread_mutex_lock(pthread_mutex_t *p_mutex) {
- if (!model) {
- snapshot_system_init(10000, 1024, 1024, 40000);
- model = new ModelChecker();
- model->startChecker();
- }
-
+ createModelIfNotExist();
ModelExecution *execution = model->get_execution();
/* to protect the case where PTHREAD_MUTEX_INITIALIZER is used
}
int pthread_mutex_trylock(pthread_mutex_t *p_mutex) {
- if (!model) {
- snapshot_system_init(10000, 1024, 1024, 40000);
- model = new ModelChecker();
- model->startChecker();
- }
-
+ createModelIfNotExist();
ModelExecution *execution = model->get_execution();
cdsc::snapmutex *m = execution->getMutexMap()->get(p_mutex);
return m->try_lock() ? 0 : EBUSY;
int pthread_mutex_timedlock (pthread_mutex_t *__restrict p_mutex,
const struct timespec *__restrict abstime) {
// timedlock just gives the option of giving up the lock, so return and let the scheduler decide which thread goes next
-
- if (!model) {
- snapshot_system_init(10000, 1024, 1024, 40000);
- model = new ModelChecker();
- model->startChecker();
- }
-
+ createModelIfNotExist();
ModelExecution *execution = model->get_execution();
/* to protect the case where PTHREAD_MUTEX_INITIALIZER is used
}
pthread_t pthread_self() {
- if (!model) {
- snapshot_system_init(10000, 1024, 1024, 40000);
- model = new ModelChecker();
- model->startChecker();
- }
-
+ createModelIfNotExist();
Thread* th = model->get_current_thread();
return (pthread_t)th->get_id();
}
int pthread_cond_timedwait(pthread_cond_t *p_cond,
pthread_mutex_t *p_mutex, const struct timespec *abstime) {
ModelExecution *execution = model->get_execution();
-
if ( !execution->getCondMap()->contains(p_cond) )
pthread_cond_init(p_cond, NULL);
if ( !execution->getMutexMap()->contains(p_mutex) )
cdsc::snapcondition_variable *v = execution->getCondMap()->get(p_cond);
cdsc::snapmutex *m = execution->getMutexMap()->get(p_mutex);
- model->switch_thread(new ModelAction(ATOMIC_TIMEDWAIT, std::memory_order_seq_cst, v, (uint64_t) m));
+ uint64_t time = abstime->tv_sec * 1000000000 + abstime->tv_nsec;
+ ModelAction * timed_wait = new ModelAction(ATOMIC_TIMEDWAIT, std::memory_order_seq_cst, v, (uint64_t) m);
+ timed_wait->set_time(time);
+ if (model->switch_thread(timed_wait) == ETIMEDOUT) {
+ //model_print("thread %u wait timedout\n", thread_current_id());
+ return ETIMEDOUT;
+ }
m->lock();
-
- // model_print("Timed_wait is called\n");
return 0;
}