#include #include #include #include #include #define n 10 #define threadNumber 3 typedef struct pcb { int id; int priority; struct pcb *next; struct pcb *prev; } pcb_t; typedef struct queue { pcb_t *front; pcb_t *rear; pcb_t *pcb_table[n]; int state; } que_t; que_t init_queue (que_t * qq) { qq->front = NULL; qq->rear = NULL; return *qq; }; pcb_t init_pcb (pcb_t * pp) { pp->id = rand () % 10 + 1; pp->priority = rand () % 5 + 1; return *pp; }; void print_list (pcb_t * head) { pcb_t *current = head; while (current != NULL) { printf ("%d\n", current->id); current = current->next; } }; void enqueue (pcb_t * pp, que_t * qq) { if (qq->front == NULL && qq->rear == NULL) { qq->rear = pp; qq->front = pp; pp->next = NULL; } else { qq->rear->next = pp; qq->rear = pp; pp->next = NULL; } }; void dequeue (que_t * qq) { if (qq->front == NULL && qq->rear == NULL) { printf ("Queue is Empty\n"); } else { pcb_t *temp = qq->front; qq->front = qq->front->next; printf ("Removed item is: %d\n", temp->id); } } int isFull (que_t * qq) { int full = 0; if (qq->rear->priority == n - 1) { full = 1; } return full; } int isEmpty (que_t * qq) { int empty = 0; if (qq->front == qq->rear + 1) { empty = 1; } return empty; } void insert(pcb_t *pp, que_t *qq) { que_t check; check.state = qq->state; check.front = qq->front; check.rear = qq->front; if (qq->front == NULL && qq->rear == NULL) { enqueue(pp, qq); } else if (qq->rear->priority < pp->priority) { enqueue(pp, qq); } else if (qq->front->priority > pp->priority) { qq->front = pp; pp->next = check.front; printf("%d added to queue.\n", pp->id); } else if (qq->front->priority < pp->priority) { while (check.front->priority < pp->priority && check.front->next != NULL) { check.front = check.front->next; } while (check.rear->next != check.front) { check.rear = check.rear->next; } check.rear->next = pp; if (check.front == NULL) { pp->next = NULL; } else { pp->next = check.front; printf("%d added to queue.\n", pp->id); } } else { printf("Error!"); } } void delete(pcb_t *pp, que_t *qq) { pcb_t *temp = qq->front; if (qq->front == NULL && qq->rear == NULL) { printf("Queue is Empty!"); } else if (pp->id == qq->front->id) { dequeue(qq); } else if (pp->id == qq->rear->id) { while (temp->next->next != NULL) { temp = temp->next; } temp->next = NULL; qq->rear = temp; } else { while (pp->id != temp->next->id) { temp = temp->next; } temp->next = temp->next->next; } } void Print (que_t * qq) { pcb_t *pp; printf ("Print: "); for (pp = qq->front; pp != 0; pp = pp->next) { printf ("%d ", pp->id); } putchar ('\n'); } sem_t sem_fcfs, sem_pb; void fcfsFunction(int id) { sem_wait(&sem_fcfs); // Critical Section sleep(2); // Logic Goes Here printf("check_in for fcfs process %i\n",id); int i; que_t queue; queue.state = 1; init_queue (&queue); pcb_t Array[10]; for (i=1; i<= 3;i++) { pcb_t pp=init_pcb(&pp); pp.id=i; Array[i]=pp; } enqueue(&Array[2], &queue); enqueue(&Array[1], &queue); enqueue(&Array[3], &queue); printf("FCFS Queue"); Print(&queue); // End Of Critical Section sem_post(&sem_fcfs); } void pbFunction(int id) { sem_wait(&sem_pb); // Critical Section sleep(2); // Logic Goes Here printf("check_in for pb process %i\n",id); int j; que_t queue; queue.state = 1; init_queue (&queue); pcb_t Array[10]; for (j=4; j<=6; j++) { pcb_t pp=init_pcb(&pp); pp.id=j; pp.priority=j; Array[j]=pp; } insert(&Array[5], &queue); insert(&Array[4], &queue); insert(&Array[6], &queue); printf("Priority Based Queue"); Print(&queue); // End Of Critical Section sem_post(&sem_pb); } void *startExecution(void *num) { int id = *(int *)num; printf("hello process %i\n",id); fcfsFunction(id); pbFunction(id); printf("good bye process %i!\n",id); } int main () { int rc,i ; pthread_t threads[threadNumber]; int threads_id[threadNumber]; sem_init(&sem_pb, 0, threadNumber); sem_init(&sem_fcfs, 0, threadNumber); // for(i=0 ; i< threadNumber ; i++) // { threads_id[0]=0; rc = pthread_create(&threads[0], NULL,startExecution, (void *) &threads_id[0]); rc = pthread_join(threads[0], NULL); // } return 0; }