Advertisement
techno-

queue.c

Mar 2nd, 2023
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.43 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <threads.h>
  3. #include <stdbool.h>
  4. #include "queue.h"
  5. #include <stdio.h>
  6.  
  7. // circular array
  8. typedef struct _queue {
  9.     int size;
  10.     int used;
  11.     int first;
  12.     void **data;
  13.     mtx_t * mutex;
  14.     cnd_t * full;
  15.     cnd_t * empty;
  16.     bool terminado;
  17. } _queue;
  18.  
  19. void q_terminar(queue q){
  20.     printf("Entra en q_terminar\n");
  21.     q->terminado=true;
  22.     //cnd_broadcast(q->empty);
  23.     mtx_unlock(q->mutex);
  24. }
  25.  
  26. queue q_create(int size) {
  27.     queue q = malloc(sizeof(_queue));
  28.  
  29.     q->size  = size;
  30.     q->used  = 0;
  31.     q->first = 0;
  32.     q->data  = malloc(size * sizeof(void *));
  33.     q->mutex = malloc(sizeof (mtx_t));
  34.     q->full = malloc(sizeof(cnd_t));
  35.     q->empty = malloc(sizeof(cnd_t));
  36.     q->terminado=false;
  37.     mtx_init(q->mutex, mtx_plain);
  38.     cnd_init(q->full);
  39.     cnd_init(q->empty);
  40.  
  41.     return q;
  42. }
  43.  
  44. int q_elements(queue q) {
  45.     mtx_lock(q->mutex);
  46.     int res= q->used;
  47.     mtx_unlock(q->mutex);
  48.     return res;
  49. }
  50.  
  51. int q_insert(queue q, void *elem) {
  52.     printf("Entra en insert\n");
  53.     mtx_lock(q->mutex);
  54.     while(q->used == q->size){
  55.         printf("ESperando para insertar\n");
  56.         cnd_wait(q->full, q->mutex);
  57.         printf("Recibiendo señal para insertar\n");
  58.     }
  59.     if(q->size == q->used) return -1;
  60.     q->data[(q->first + q->used) % q->size] = elem;
  61.     q->used++;
  62.  
  63.     printf("Insertado\n");
  64.     if(q->used == 1){
  65.         cnd_broadcast(q->empty);
  66.         printf("Enviando señal para despertar a los que borran\n");
  67.     }
  68.  
  69.     mtx_unlock(q->mutex);
  70.  
  71.     return 0;
  72. }
  73.  
  74. void *q_remove(queue q) {
  75.     printf("Entra en remove\n");
  76.     void *res;
  77.     mtx_lock(q->mutex);
  78.     if(q->terminado == true){
  79.         return NULL;
  80.     }
  81.     while(q->used ==0){
  82.         printf("Esperando para quitar\n");
  83.         cnd_wait(q->empty, q->mutex);
  84.         printf("Recibiendo señal para quitar\n");
  85.     }
  86.  
  87.     if(q->used == 0) return NULL;
  88.     res = q->data[q->first];
  89.     q->first = (q->first + 1) % q->size;
  90.     q->used--;
  91.  
  92.     printf("Quitado\n");
  93.     if(q->used == q->size-1){
  94.         cnd_broadcast(q->full);
  95.         printf("Enviando señal para despertar a los que insertan\n");
  96.     }
  97.  
  98.     mtx_unlock(q->mutex);
  99.     return res;
  100. }
  101.  
  102. void q_destroy(queue q) {
  103.     mtx_destroy(q->mutex);
  104.     cnd_destroy(q->full);
  105.     cnd_destroy(q->empty);
  106.     free(q->full);
  107.     free(q->empty);
  108.     free(q->mutex);
  109.     free(q->data);
  110.     free(q);
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement