Example #1
0
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;
    }
}
Example #2
0
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);
}
Example #3
0
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();

}