bool mutex_lock_validity(pthread_mutex_t* arg) { pthread_t holding_thread = lock_map.get(arg); if(holding_thread==NULL) { return true; } else { // Do something if other thread is holding lock struct thread_data* cur_thread_data=all_thread.get(pthread_self()); cur_thread_data->state=PTHREAD_WAITING_THREAD; cur_thread_data->waiting_lock=arg; return false; } }
void* closure_wrapper(void* arg) { struct Thread_Arg* th_arg=(struct Thread_Arg*)arg; original_pthread_mutex_lock(&SCHED_LOCK); PRINT("NEW THREAD %lx BEGINS\n",pthread_self()); void* ret=th_arg->start_routine(th_arg->arg); //free(th_arg); struct thread_data* cur_thread_data=(struct thread_data*)all_thread.get(pthread_self()); ASSERT((cur_thread_data==NULL),"SNAP!!"); cur_thread_data->state=PTHREAD_DEAD_THREAD; findnextthreadtoschedule(NULL); original_pthread_mutex_unlock(&SCHED_LOCK); PRINT("EXITING THREAD %x\n",pthread_self()); return(ret); }
int pthread_join(pthread_t joinee, void **retval) { PRINT("THREAD JOIN\n",NULL); // TODO struct thread_data* join_thread_data=all_thread.get(joinee); // cur_thread_data->state=PTHREAD_WAITING_THREAD; while(join_thread_data->state!=PTHREAD_DEAD_THREAD) { next_thread=joinee; sched(); } //original_pthread_mutex_unlock(&SCHED_LOCK); return original_pthread_join(joinee, retval); //original_pthread_mutex_lock(&SCHED_LOCK); //cur_thread_data->state=PTHREAD_ACTIVE_THREAD; //findnextthreadtoschedule(NULL); //sched(); }