Facebook
From Ozma, 4 Years ago, written in Plain Text.
This paste is a reply to Re: suck mydick from Ozma - go back
Embed
Viewing differences between Re: suck mydick and Re: Re: suck mydick
#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;
}