+
+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
+
+/*
+ ModelExecution *execution = model->get_execution();
+ if (!execution->mutex_map.contains(p_mutex)) {
+ pthread_mutex_init(p_mutex, NULL);
+ }
+ cdsc::mutex *m = execution->mutex_map.get(p_mutex);
+
+ if (m != NULL) {
+ m->lock();
+ } else {
+ printf("something is wrong with pthread_mutex_timedlock\n");
+ }
+
+ printf("pthread_mutex_timedlock is called. It is currently implemented as a normal lock operation without no timeout\n");
+*/
+ return 0;
+}
+
+pthread_t pthread_self() {
+ Thread* th = model->get_current_thread();
+ return th->get_id();
+}
+
+int pthread_key_delete(pthread_key_t) {
+ model_print("key_delete is called\n");
+ return 0;
+}
+
+int pthread_cond_init(pthread_cond_t *p_cond, const pthread_condattr_t *attr) {
+ cdsc::condition_variable *v = new cdsc::condition_variable();
+
+ ModelExecution *execution = model->get_execution();
+ execution->cond_map.put(p_cond, v);
+ return 0;
+}
+
+int pthread_cond_wait(pthread_cond_t *p_cond, pthread_mutex_t *p_mutex) {
+ ModelExecution *execution = model->get_execution();
+ if ( !execution->cond_map.contains(p_cond) )
+ pthread_cond_init(p_cond, NULL);
+
+ cdsc::condition_variable *v = execution->cond_map.get(p_cond);
+ cdsc::mutex *m = execution->mutex_map.get(p_mutex);
+
+ v->wait(*m);
+ return 0;
+}
+
+int pthread_cond_timedwait(pthread_cond_t *p_cond,
+ pthread_mutex_t *p_mutex, const struct timespec *abstime) {
+// implement cond_timedwait as a noop and let the scheduler decide which thread goes next
+ ModelExecution *execution = model->get_execution();
+
+ if ( !execution->cond_map.contains(p_cond) )
+ pthread_cond_init(p_cond, NULL);
+ if ( !execution->mutex_map.contains(p_mutex) )
+ pthread_mutex_init(p_mutex, NULL);
+
+ cdsc::condition_variable *v = execution->cond_map.get(p_cond);
+ cdsc::mutex *m = execution->mutex_map.get(p_mutex);
+
+ model->switch_to_master(new ModelAction(NOOP, std::memory_order_seq_cst, v, NULL));
+// v->wait(*m);
+// printf("timed_wait called\n");
+ return 0;
+}
+
+int pthread_cond_signal(pthread_cond_t *p_cond) {
+ // notify only one blocked thread
+ ModelExecution *execution = model->get_execution();
+ if ( !execution->cond_map.contains(p_cond) )
+ pthread_cond_init(p_cond, NULL);
+
+ cdsc::condition_variable *v = execution->cond_map.get(p_cond);
+
+ v->notify_one();
+ return 0;
+}
+
+void pthread_cleanup_push(void (*routine)(void*), void *arg ) {
+ printf("pthrea cleanup push called\n");
+}
+
+int pthread_once (pthread_once_t *__once_control,
+ void (*__init_routine)) {
+ printf("pthread once is called\n");
+}
+
+