Advertisement
techno-

queue.c

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