123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- //muqueue.c
- #include "myqueue.h"
- ArrQueue *CreateQueue( int nLen )
- {
- ArrQueue *pQueue = (ArrQueue *)malloc( sizeof(ArrQueue) );
- pQueue->rear = (ElemType **)calloc( nLen, sizeof(ElemType **) );
- pQueue->front = pQueue->rear[0];
- pQueue->len = 0;
- pQueue->size = nLen;
-
- pthread_mutex_init(&pQueue->locker,NULL);
- pthread_cond_init(&pQueue->notEmpty,NULL);
- pthread_cond_init(&pQueue->notFull,NULL);
-
- return pQueue;
- }
-
- void DestroyQueue( ArrQueue *pQueue )
- {
- free( pQueue->rear );
- free( pQueue );
-
- pthread_mutex_destroy(&pQueue->locker);
- pthread_cond_destroy(&pQueue->notEmpty);
- pthread_cond_destroy(&pQueue->notFull);
-
- pQueue = NULL;
- }
-
- void ClearQueue( ArrQueue *pQueue )
- {
- pQueue->front = pQueue->rear[0];
-
- pQueue->len = 0;
- }
-
-
- int GetLength( ArrQueue *pQueue )
- {
- return pQueue->len;
- }
-
-
- int GetSize( ArrQueue *pQueue )
- {
- return pQueue->size;
- }
-
- int IsEmpty( ArrQueue *pQueue )
- {
- return pQueue->len == 0 ? TRUE : FALSE;
- }
-
- int IsFull( ArrQueue *pQueue )
- {
- //DBG("pQueue->len=%d,pQueue->size=%d\n",pQueue->len,pQueue->size);
- return pQueue->len == pQueue->size? TRUE : FALSE;
- }
-
- int GetHead( ArrQueue *pQueue, ElemType **pe )
- {
- if( pQueue->len == 0 )
- {
- *pe = NULL;
- return -1;
- }
-
- *pe = pQueue->rear[pQueue->len-1];
-
- return pQueue->len-1;
- }
-
- int EnQueue( ArrQueue *pQueue, ElemType *pe )
- {
- pthread_mutex_lock(&pQueue->locker);
-
- while (IsFull(pQueue))
- {
- //DBG("\n");
- pthread_cond_wait(&pQueue->notFull, &pQueue->locker);
- }
-
- int i = 0;
- for( i = pQueue->len; i > 0; --i )
- {
- pQueue->rear[i] = pQueue->rear[i-1];
- }
- pQueue->rear[0] = pe;
- pQueue->front = pQueue->rear[pQueue->len];
-
- ++pQueue->len;
-
- pthread_cond_signal(&pQueue->notEmpty);
- pthread_mutex_unlock(&pQueue->locker);
-
- return pQueue->len;
- }
-
- int DeQueue( ArrQueue *pQueue, ElemType **pe )
- {
-
- pthread_mutex_lock(&pQueue->locker);
- while (IsEmpty(pQueue))
- {
- pthread_cond_wait(&pQueue->notEmpty, &pQueue->locker);
- }
-
-
- if( pQueue->len == 0 )
- {
- *pe = NULL;
- return -1;
- }
-
- *pe = pQueue->front;
-
- //DBG("len= %d,%x \n",(*pe)->len,(*pe)->len);
-
- --pQueue->len;
- pQueue->front = pQueue->rear[pQueue->len-1];
-
- pthread_cond_signal(&pQueue->notFull);
- pthread_mutex_unlock(&pQueue->locker);
-
- return pQueue->len;
- }
-
-
- void ForEachQueue( ArrQueue *pQueue, void (*func)(ElemType *pe) )
- {
- int i = 0;
- for( i = 0; i < pQueue->len; ++i )
- {
- func( pQueue->rear[i] );
- }
- }
|