myqueue.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. //muqueue.c
  2. #include "myqueue.h"
  3. ArrQueue *CreateQueue( int nLen )
  4. {
  5. ArrQueue *pQueue = (ArrQueue *)malloc( sizeof(ArrQueue) );
  6. pQueue->rear = (ElemType **)calloc( nLen, sizeof(ElemType **) );
  7. pQueue->front = pQueue->rear[0];
  8. pQueue->len = 0;
  9. pQueue->size = nLen;
  10. pthread_mutex_init(&pQueue->locker,NULL);
  11. pthread_cond_init(&pQueue->notEmpty,NULL);
  12. pthread_cond_init(&pQueue->notFull,NULL);
  13. return pQueue;
  14. }
  15. void DestroyQueue( ArrQueue *pQueue )
  16. {
  17. free( pQueue->rear );
  18. free( pQueue );
  19. pthread_mutex_destroy(&pQueue->locker);
  20. pthread_cond_destroy(&pQueue->notEmpty);
  21. pthread_cond_destroy(&pQueue->notFull);
  22. pQueue = NULL;
  23. }
  24. void ClearQueue( ArrQueue *pQueue )
  25. {
  26. pQueue->front = pQueue->rear[0];
  27. pQueue->len = 0;
  28. }
  29. int GetLength( ArrQueue *pQueue )
  30. {
  31. return pQueue->len;
  32. }
  33. int GetSize( ArrQueue *pQueue )
  34. {
  35. return pQueue->size;
  36. }
  37. int IsEmpty( ArrQueue *pQueue )
  38. {
  39. return pQueue->len == 0 ? TRUE : FALSE;
  40. }
  41. int IsFull( ArrQueue *pQueue )
  42. {
  43. //DBG("pQueue->len=%d,pQueue->size=%d\n",pQueue->len,pQueue->size);
  44. return pQueue->len == pQueue->size? TRUE : FALSE;
  45. }
  46. int GetHead( ArrQueue *pQueue, ElemType **pe )
  47. {
  48. if( pQueue->len == 0 )
  49. {
  50. *pe = NULL;
  51. return -1;
  52. }
  53. *pe = pQueue->rear[pQueue->len-1];
  54. return pQueue->len-1;
  55. }
  56. int EnQueue( ArrQueue *pQueue, ElemType *pe )
  57. {
  58. pthread_mutex_lock(&pQueue->locker);
  59. while (IsFull(pQueue))
  60. {
  61. //DBG("\n");
  62. pthread_cond_wait(&pQueue->notFull, &pQueue->locker);
  63. }
  64. int i = 0;
  65. for( i = pQueue->len; i > 0; --i )
  66. {
  67. pQueue->rear[i] = pQueue->rear[i-1];
  68. }
  69. pQueue->rear[0] = pe;
  70. pQueue->front = pQueue->rear[pQueue->len];
  71. ++pQueue->len;
  72. pthread_cond_signal(&pQueue->notEmpty);
  73. pthread_mutex_unlock(&pQueue->locker);
  74. return pQueue->len;
  75. }
  76. int DeQueue( ArrQueue *pQueue, ElemType **pe )
  77. {
  78. pthread_mutex_lock(&pQueue->locker);
  79. while (IsEmpty(pQueue))
  80. {
  81. pthread_cond_wait(&pQueue->notEmpty, &pQueue->locker);
  82. }
  83. if( pQueue->len == 0 )
  84. {
  85. *pe = NULL;
  86. return -1;
  87. }
  88. *pe = pQueue->front;
  89. //DBG("len= %d,%x \n",(*pe)->len,(*pe)->len);
  90. --pQueue->len;
  91. pQueue->front = pQueue->rear[pQueue->len-1];
  92. pthread_cond_signal(&pQueue->notFull);
  93. pthread_mutex_unlock(&pQueue->locker);
  94. return pQueue->len;
  95. }
  96. void ForEachQueue( ArrQueue *pQueue, void (*func)(ElemType *pe) )
  97. {
  98. int i = 0;
  99. for( i = 0; i < pQueue->len; ++i )
  100. {
  101. func( pQueue->rear[i] );
  102. }
  103. }