main() { int p,c; n =10; produce_semaphore = MySemaphoreInit(2); consume_semaphore = MySemaphoreInit(1); MyThreadInit(temp,(void *)&n); if(MySemaphoreDestroy(produce_semaphore) == -1) printf("\n Error destroying producer semaphore"); if(MySemaphoreDestroy(consume_semaphore)) printf("\nError destroying consumer semaphore"); }
void MyThreadInit(void(*start_funct)(void *), void *args) { start = 1; MyThread* node; //printf("\nCP1"); ready_queue = malloc(sizeof(MyThread)); getcontext(&ready_queue->context); ready_queue->context.uc_link=&controller; ready_queue->context.uc_stack.ss_sp=malloc(MEM); ready_queue->context.uc_stack.ss_size=MEM; ready_queue->context.uc_stack.ss_flags=0; ready_queue->id = threadCount++; //printf("Allocation Initial Id: %d", ready_queue->id); makecontext(&ready_queue->context, (void*)start_funct, 1, (int)args); ucontext_t next; int id; getcontext(&controller); //printf("\nAbout to Start Checking of Unblocking"); //printQueues(); CheckForUnblocking(); //printf("\nChecked for Block"); //printQueues(); if(ready_queue != NULL) { if(start == 1) { next = ready_queue->context; id = ready_queue->id; //printf("\n 2 Should Repeat:"); //printf("\n4Allocation Initial Id: %d", ready_queue->id); start = 0; //printQueues(); setcontext(&next); } else if (ready_queue->next != NULL) { ready_queue = ready_queue->next; //CheckForUnblocking(); next = ready_queue->context; id = ready_queue->id; //printf("\n 2 Should Repeat:"); //printf("\nSetting Context Id: %d",id); //printQueues(); setcontext(&next); } else { //printf("1Entering New Code"); ready_queue = NULL; //printf("2Entering New Code"); //printQueues(); CheckForUnblocking(); //printf("1Entering New Code"); if (ready_queue != NULL) { next = ready_queue->context; id = ready_queue->id; //printf("\n 2 Should Repeat:"); //printf("\nSetting Context Id: %d",id); //printQueues(); setcontext(&next); } } } printf("completed\n"); printQueues(); printf("Final Queue Remains: "); MySemaphoreDestroy(sem1); MySemaphoreDestroy(sem2); printQueues(); }