queue.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include "mandelbrot.h"
  2. queue_t *initialize_queue()
  3. {
  4. queue_t *q;
  5. q = (queue_t *) malloc(sizeof(queue_t *));
  6. return q;
  7. }
  8. void enqueue(queue_t * q, mandel_t * w, pthread_mutex_t * lock)
  9. {
  10. struct queue_node_t *aux;
  11. pthread_mutex_lock(lock);
  12. if (q->head == NULL) {
  13. q->head =
  14. (struct queue_node_t *)
  15. malloc(sizeof(struct queue_node_t *));
  16. q->head->next = NULL;
  17. q->head->node = w;
  18. q->tail = q->head;
  19. } else {
  20. aux =
  21. (struct queue_node_t *)
  22. malloc(sizeof(struct queue_node_t *));
  23. aux->next = NULL;
  24. aux->node = w;
  25. q->tail->next = aux;
  26. q->tail = aux;
  27. }
  28. pthread_mutex_unlock(lock);
  29. }
  30. mandel_t *dequeue(queue_t * q, pthread_mutex_t * lock)
  31. {
  32. struct queue_node_t *aux;
  33. mandel_t *ret_val;
  34. pthread_mutex_lock(lock);
  35. if (q->head == NULL) {
  36. ret_val = NULL;
  37. }
  38. else if (q->head == q->tail) {
  39. aux = q->head;
  40. ret_val = aux->node;
  41. q->head = NULL;
  42. q->tail = NULL;
  43. }
  44. else {
  45. aux = q->head;
  46. ret_val = aux->node;
  47. q->head = aux->next;
  48. }
  49. pthread_mutex_unlock(lock);
  50. return ret_val;
  51. }
  52. int is_empty(queue_t * q, pthread_mutex_t * lock)
  53. {
  54. int ret = 0;
  55. pthread_mutex_lock(lock);
  56. if (q->head == NULL) ret = 1;
  57. pthread_mutex_unlock(lock);
  58. return (ret);
  59. }
  60. void destroy_queue(queue_t * q)
  61. {
  62. struct queue_node_t *aux, *next;
  63. aux = q->head;
  64. while (aux != NULL) {
  65. next = aux->next;
  66. free(aux);
  67. if (next != NULL)
  68. aux = next;
  69. }
  70. free(q);
  71. }