📄 hqueue.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "hqueue.h"
/***********************************************************/
HQUEUE * hqCreate(unsigned int unit_num,unsigned int unit_size,unsigned int queue_mode)
{
HQUEUE *phq = (HQUEUE *)malloc(sizeof(HQUEUE));
if(phq == NULL)
{
printf("hqCreate malloc HQUEUE fail\n");
return IPANEL_NULL;
}
phq->queue_mode = queue_mode;
phq->unit_size = unit_size;
phq->unit_num = unit_num;
phq->front = 0;
phq->rear = 0;
phq->count_put_full = 0;
printf("[xiaohw:%s %d] unit_num=%d unit_size=%d queue_mode=%d\n", __FUNCTION__,__LINE__,unit_num,unit_size,queue_mode);
if((sem_init((sem_t*)&phq->queue_nnulEvent, 0, 0)!=0 ) || ( sem_init((sem_t*)&phq->queue_nfulEvent, 0, unit_num)!=0))
{
free(phq);
// printf("hqCreate::queue_sem == NULL\n");
return IPANEL_NULL;
}
phq->queue_buffer = (char *)malloc(unit_num * unit_size);
if(phq->queue_buffer == NULL)
{
free(phq);
printf("hqCreate malloc buffer fail\n");
return IPANEL_NULL;
}
return phq;
}
void hqDelete(HQUEUE * phq)
{
if(phq == NULL)return;
if(phq->queue_buffer)
free(phq->queue_buffer);
// sem_destroy((sem_t*)&phq->queue_semMutex);
sem_destroy((sem_t*)&phq->queue_nnulEvent);
sem_destroy((sem_t*)&phq->queue_nfulEvent);
free(phq);
}
/***********************************************************/
int hqBufPut(HQUEUE * phq,char * buf)
{
unsigned int real_rear,queue_count;
hqBufPut_start:
queue_count = phq->rear - phq->front;
if(queue_count == (phq->unit_num - 1))
{
if(phq->queue_mode & HQ_PUT_WAIT){
sem_wait( (&phq->queue_nfulEvent));
goto hqBufPut_start;
}
else {
phq->count_put_full++; //队列满失败次数+1
return IPANEL_ERR;
}
// return FALSE;
}
real_rear = phq->rear % phq->unit_num;
memcpy(phq->queue_buffer + real_rear*phq->unit_size,buf,phq->unit_size);
phq->rear++;
sem_post(&phq->queue_nnulEvent); //发送一个信号表示队列中又多一个成员(至少有非空)
return IPANEL_OK;
}
int hqBufGet(HQUEUE * phq,char * buf)
{
unsigned int real_front;
hqBufGet_start:
if(phq->front == phq->rear) //队列空
{
if(phq->queue_mode & HQ_GET_WAIT){
sem_wait(&phq->queue_nnulEvent);//等待PUT函数发信
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -