fifo 类型结构体 c语言,精简通用环形fifo

该代码段定义了一个模板化的队列结构,包括初始化、入队、出队和查看队首元素等操作。同时,它还提供了安全的原子访问控制,确保在多线程环境中的正确性。队列的大小可变,支持不同类型的元素(如uint8_t、uint16_t和uint32_t)。

/***************************************************************************

*   Copyright(C)2009-2012 by Gorgon Meducer *

*                                                                         *

*   This program is free software; you can redistribute it and/or modify  *

*   it under the terms of the GNU Lesser General Public License as        *

*   published by the Free Software Foundation; either version 2 of the    *

*   License, or (at your option) any later version.                       *

*                                                                         *

*   This program is distributed in the hope that it will be useful,       *

*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *

*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *

*   GNU General Public License for more details.                          *

*                                                                         *

*   You should have received a copy of the GNU Lesser General Public      *

*   License along with this program; if not, write to the                 *

*   Free Software Foundation, Inc.,                                       *

*   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *

***************************************************************************/

#ifndef _USE_TEMPLATE_QUEUE_H_

#define _USE_TEMPLATE_QUEUE_H_

/*============================ INCLUDES ======================================*/

/*============================ MACROS ========================================*/

#define END_DEF_QUEUE

#define END_DEF_QUEUE_U8

#define END_DEF_QUEUE_U16

#define END_DEF_QUEUE_U32

#define END_DEF_SAFE_QUEUE

#define END_DEF_SAFE_QUEUE_U8

#define END_DEF_SAFE_QUEUE_U16

#define END_DEF_SAFE_QUEUE_U32

/*============================ MACROFIED FUNCTIONS ===========================*/

#define NONE_ATOM_ACCESS(__CODE)        {__CODE;}

#define QUEUE_MUTEX(__NAME, __QUEUE)                                        \

__NAME##_queue_mutex(__QUEUE)

#define QUEUE_INIT(__NAME, __QUEUE, __BUFFER, __SIZE)                       \

__NAME##_queue_init((__QUEUE), (__BUFFER), (__SIZE))

#define DEQUEUE(__NAME, __QUEUE, __ADDR)                                    \

__NAME##_dequeue((__QUEUE),(__ADDR))

#define ENQUEUE(__NAME, __QUEUE, __VALUE)                                   \

__NAME##_enqueue((__QUEUE), (__VALUE))

#define PEEK_QUEUE(__NAME, __QUEUE, __ADDR)                                 \

__NAME##_queue_peek((__QUEUE),(__ADDR))

#define QUEUE(__NAME)   __NAME##_queue_t

#define DEF_QUEUE_EX(__NAME, __TYPE, __PTR_TYPE, __MUTEX_TYPE, __ATOM_ACCESS)  \

DEF_CLASS                                                                   \

__TYPE          *ptBuffer;                                              \

__PTR_TYPE      tSize;                                                  \

__PTR_TYPE      tHead;                                                  \

__PTR_TYPE      tTail;                                                  \

__PTR_TYPE      tCounter;                                               \

__MUTEX_TYPE    tMutex;                                                 \

END_DEF_CLASS(__NAME##_queue_t)                                             \

\

__MUTEX_TYPE *__NAME##_queue_mutex(__NAME##_queue_t *ptQueue)               \

{                                                                           \

CLASS(__NAME##_queue_t) *ptQ = (CLASS(__NAME##_queue_t) *)ptQueue;      \

if ( NULL == ptQueue)  {                                                \

return NULL;                                                        \

}                                                                       \

return &(ptQ->tMutex);                                                  \

}                                                                           \

\

bool __NAME##_queue_init(__NAME##_queue_t *ptQueue, __TYPE *ptBuffer, __PTR_TYPE tSize) \

{                                                                           \

CLASS(__NAME##_queue_t) *ptQ = (CLASS(__NAME##_queue_t) *)ptQueue;      \

if (NULL == ptQueue || NULL == ptBuffer || 0 == tSize) {                \

return false;                                                       \

}                                                                       \

\

ptQ->ptBuffer = ptBuffer;                                               \

ptQ->tSize = tSize;                                                     \

ptQ->tHead = 0;                                                         \

ptQ->tTail = 0;                                                         \

ptQ->tCounter = 0;                                                      \

\

return true;                                                            \

}                                                                           \

\

bool __NAME##_enqueue(__NAME##_queue_t *ptQueue, __TYPE tObj)               \

{                                                                           \

bool bResult = false;                                                   \

CLASS(__NAME##_queue_t) *ptQ = (CLASS(__NAME##_queue_t) *)ptQueue;      \

if (NULL == ptQ) {                                                      \

return false;                                                       \

}                                                                       \

\

__ATOM_ACCESS(                                                          \

do {                                                                \

if ((ptQ->tHead == ptQ->tTail) && (0 != ptQ->tCounter)) {       \

break;                                                      \

}                                                               \

\

ptQ->ptBuffer[ptQ->tTail++] = tObj;                             \

if (ptQ->tTail >= ptQ->tSize) {                                 \

ptQ->tTail = 0;                                             \

}                                                               \

ptQ->tCounter++;                                                \

bResult = true;                                                 \

} while (false);                                                    \

)                                                                       \

\

return bResult;                                                         \

}                                                                           \

\

bool __NAME##_queue_peek(__NAME##_queue_t *ptQueue, __TYPE *ptObj)          \

{                                                                           \

bool bResult = false;                                                   \

CLASS(__NAME##_queue_t) *ptQ = (CLASS(__NAME##_queue_t) *)ptQueue;      \

if (NULL == ptQ) {                                                      \

return false;                                                       \

}                                                                       \

\

__ATOM_ACCESS(                                                          \

do {                                                                \

if ((ptQ->tHead == ptQ->tTail) && (!ptQ->tCounter)) {           \

break;                                                      \

}                                                               \

if (NULL != ptObj) {                                            \

*ptObj = ptQ->ptBuffer[ptQ->tHead];                         \

}                                                               \

bResult = true;                                                 \

} while (false);                                                    \

)                                                                       \

\

return bResult;                                                         \

}                                                                           \

bool __NAME##_dequeue(__NAME##_queue_t *ptQueue, __TYPE *ptObj)             \

{                                                                           \

bool bResult = false;                                                   \

CLASS(__NAME##_queue_t) *ptQ = (CLASS(__NAME##_queue_t) *)ptQueue;      \

if (NULL == ptQ) {                                                      \

return false;                                                       \

}                                                                       \

\

__ATOM_ACCESS(                                                          \

do {                                                                \

if ((ptQ->tHead == ptQ->tTail) && (!ptQ->tCounter)) {           \

break;                                                      \

}                                                               \

if (NULL != ptObj) {                                            \

*ptObj = ptQ->ptBuffer[ptQ->tHead];                         \

}                                                               \

ptQ->tHead++;                                                   \

if (ptQ->tHead >= ptQ->tSize) {                                 \

ptQ->tHead = 0;                                             \

}                                                               \

ptQ->tCounter--;                                                \

bResult = true;                                                 \

} while (false);                                                    \

)                                                                       \

\

return bResult;                                                         \

}                                                                           \

#define DEF_SAFE_QUEUE(__NAME, __TYPE, __PTR_TYPE, __MUTEX_TYPE)            \

DEF_QUEUE_EX(__NAME, __TYPE, __PTR_TYPE, __MUTEX_TYPE, SAFE_ATOM_CODE)

#define DEF_SAFE_QUEUE_U8(__NAME, __PTR_TYPE,__MUTEX_TYPE)                  \

DEF_SAFE_QUEUE(__NAME, uint8_t, __PTR_TYPE, __MUTEX_TYPE)

#define DEF_SAFE_QUEUE_U16(__NAME, __PTR_TYPE, __MUTEX_TYPE)                \

DEF_SAFE_QUEUE(__NAME, uint16_t, __PTR_TYPE, __MUTEX_TYPE)

#define DEF_SAFE_QUEUE_U32(__NAME, __PTR_TYPE, __MUTEX_TYPE)                \

DEF_SAFE_QUEUE(__NAME, uint32_t __PTR_TYPE, __MUTEX_TYPE)

#define DEF_QUEUE(__NAME, __TYPE, __PTR_TYPE, __MUTEX_TYPE)                 \

DEF_QUEUE_EX(__NAME, __TYPE, __PTR_TYPE, __MUTEX_TYPE, NONE_ATOM_ACCESS)

#define DEF_QUEUE_U8(__NAME, __PTR_TYPE,__MUTEX_TYPE)                       \

DEF_QUEUE(__NAME, uint8_t, __PTR_TYPE, __MUTEX_TYPE)

#define DEF_QUEUE_U16(__NAME, __PTR_TYPE, __MUTEX_TYPE)                     \

DEF_QUEUE(__NAME, uint16_t, __PTR_TYPE, __MUTEX_TYPE)

#define DEF_QUEUE_U32(__NAME, __PTR_TYPE, __MUTEX_TYPE)                     \

DEF_QUEUE(__NAME, uint32_t __PTR_TYPE, __MUTEX_TYPE)

/*============================ TYPES =========================================*/

/*============================ GLOBAL VARIABLES ==============================*/

/*============================ LOCAL VARIABLES ===============================*/

/*============================ PROTOTYPES ====================================*/

/*============================ IMPLEMENTATION ================================*/

#endif

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值