| /**
 | 
 |  * 
 | 
 |  * @file      ringbuf_ex.h
 | 
 |  * @brief     
 | 
 |  *            This file is part of tools.
 | 
 |  *            ¹¤¾ß»·Ðλº³å¹ÜÀíÄ£¿é
 | 
 |  *            
 | 
 |  * @details   
 | 
 |  * @author    Tools Team.
 | 
 |  * @email     
 | 
 |  * @copyright Copyright (C) 2013 Sanechips Technology Co., Ltd.
 | 
 |  * @warning   
 | 
 |  * @date      2019/02/02
 | 
 |  * @version   1.1
 | 
 |  * @pre       
 | 
 |  * @post      
 | 
 |  *            
 | 
 |  * @par       
 | 
 |  * Change History :
 | 
 |  * ---------------------------------------------------------------------------
 | 
 |  * date        version  author         description
 | 
 |  * ---------------------------------------------------------------------------
 | 
 |  * 2013/01/21  1.0      lu.xieji       Create file
 | 
 |  * 2019/02/02  1.1      jiang.fenglin  ÐÞ¸Ä×¢ÊÍ·½Ê½Îªdoxygen
 | 
 |  * 2019/04/08  1.2      jiang.fenglin  È¥µô´íÎó¼ÆÊýÆ÷¸ÄÓöÏÑÔ£¬Ôö¼Óringbuf empty״̬
 | 
 |  * ---------------------------------------------------------------------------
 | 
 |  * 
 | 
 |  * 
 | 
 |  */
 | 
 | 
 | 
 | #ifndef RINGBUF_EX_H
 | 
 | #define RINGBUF_EX_H
 | 
 | 
 | 
 | 
 | 
 | #define RINGBUF_PAD_CHAR 0xaa
 | 
 | #define kLastBlock       -1
 | 
 | #define kMinChunkSize    16
 | 
 | 
 | 
 | enum
 | 
 | {
 | 
 |     kBlockNotUsed,      // ²»¿ÉÓ㬲»¿ÉÒÔ·ÖÅ䣬һ°ãÊÇĩβ²»×ãÒÔ·ÖÅäµÄ¿é
 | 
 |     kBlockFree,         // ¿ÕÏУ¬¿ÉÒÔ½øÐзÖÅä
 | 
 |     kBlockAllocated,    // ¿ÉÓ㬿ÉÒÔ´æÈëÊý¾ÝÖÐ
 | 
 |     kBlockReady,        // Êý¾ÝÒÑ×¼±¸ºÃ£¬¿ÉÒÔÈ¡³öÊý¾Ý
 | 
 |     kBlockEmpty,        // Êý¾ÝÒÑÈ¡³ö£¬¿ÉÒÔÊÍ·Å
 | 
 | };
 | 
 | 
 | 
 | 
 | 
 | typedef void (*mem_lock_fnc_type)(void * ptr);
 | 
 | typedef void (*mem_free_fnc_type)(void * ptr);
 | 
 | 
 | 
 | typedef struct
 | 
 | {
 | 
 |     unsigned long forw_offset;  /**< Forward offset. The value of the offset
 | 
 |                                                   includes the size of the header and the allocated block. */
 | 
 |     char          free_flag;    /**< Flag to indicate if this memory block  is free. */
 | 
 |     char          last_flag;    /**< Flag to indicate if this is the last block  in the allocated section. */
 | 
 |     unsigned char extra;        /**< Extra bytes at the end of a block. */
 | 
 |     unsigned char pad1;         /**< Padding at the end of a block. */
 | 
 | } ringbuf_ex_header_type;
 | 
 | 
 | 
 | typedef struct
 | 
 | {
 | 
 |     ringbuf_ex_header_type         *first_block;
 | 
 |     /**< First block in the ringbuf. */
 | 
 |     ringbuf_ex_header_type         *next_free_block;
 | 
 |     /**< Next free block in the ringbuf. */
 | 
 |     ringbuf_ex_header_type         *next_used_block;
 | 
 |     /**< Next used block in the ringbuf. */
 | 
 |     unsigned long                  total_bytes;
 | 
 |     void                           *base;
 | 
 |     /**< Total bytes available in the ringbuf. */
 | 
 |     // »¥³âÁ¿º¯Êý
 | 
 |     mem_lock_fnc_type              lock_fnc_ptr;
 | 
 |     mem_free_fnc_type              free_fnc_ptr;
 | 
 | } ringbuf_ex_type;
 | 
 | 
 | 
 | #ifdef __cplusplus
 | 
 | extern "C"
 | 
 | {
 | 
 | #endif
 | 
 | 
 | 
 | /**
 | 
 |  * @brief ringbuf³õʼ»¯
 | 
 |  * @param[in] ringbuf_ex_mem_ptr µÚÒ»¸öblockµÄÖ¸Õë
 | 
 |  * @param[in] ringbuf_ex_mem_size µÚÒ»¸öblockµÄ´óС
 | 
 |  * @return ringbuf_ex_ptr »·Ðλº³åÇøÖ¸Õë
 | 
 |  * @note
 | 
 |  * @see 
 | 
 |  */
 | 
 | ringbuf_ex_type *ringbuf_ex_init(void *ringbuf_ex_mem_ptr, UINT32 ringbuf_ex_mem_size);
 | 
 | 
 | 
 | /**
 | 
 |  * @brief ringbufÉêÇëÄÚ´æ
 | 
 |  * @param[out] ringbuf_ex_ptr »·Ðλº³åÇøÖ¸Õë
 | 
 |  * @param[in] size ÄÚ´æ¿é´óС
 | 
 |  * @return ÉêÇëºóµÄÄÚ´æÖ¸Õë
 | 
 |  * @note
 | 
 |  * @see 
 | 
 |  */
 | 
 | void *ringbuf_ex_malloc(ringbuf_ex_type *ringbuf_ex_ptr, int size);
 | 
 | 
 | 
 | /**
 | 
 |  * @brief ringbufÊÍ·ÅÄÚ´æ
 | 
 |  * @param[in] ringbuf_ex_ptr »·Ðλº³åÇøÖ¸Õë
 | 
 |  * @param[in] ptr ÄÚ´æ¿éÖ¸Õë
 | 
 |  * @return void
 | 
 |  * @note
 | 
 |  * @see 
 | 
 |  */
 | 
 | void ringbuf_ex_free(ringbuf_ex_type *ringbuf_ex_ptr, void *ptr);
 | 
 | 
 | 
 | /**
 | 
 |  * @brief ringbuf½«Ò»¸öÄÚ´æ¿éÖÃΪnotused̬
 | 
 |  * @param[in] ringbuf_ex_ptr »·Ðλº³åÇøÖ¸Õë
 | 
 |  * @param[in] ptr ÄÚ´æ¿éÖ¸Õë
 | 
 |  * @return 1 sucess, 0 fail
 | 
 |  * @note
 | 
 |  * @see 
 | 
 |  */
 | 
 | int ringbuf_ex_set_notused(ringbuf_ex_type *ringbuf_ex_ptr, void *ptr);
 | 
 | 
 | 
 | /**
 | 
 |  * @brief ringbuf½«Ò»¸öÄÚ´æ¿éÖÃΪready̬
 | 
 |  * @param[in] ringbuf_ex_ptr »·Ðλº³åÇøÖ¸Õë
 | 
 |  * @param[in] ptr ÄÚ´æ¿éÖ¸Õë
 | 
 |  * @return 1 sucess, 0 fail
 | 
 |  * @note
 | 
 |  * @see 
 | 
 |  */
 | 
 | int ringbuf_ex_set_ready(ringbuf_ex_type *ringbuf_ex_ptr, void *ptr);
 | 
 | 
 | 
 | /**
 | 
 |  * @brief ringbuf½«Ò»¸öÄÚ´æ¿éÖÃΪempty̬
 | 
 |  * @param[in] ringbuf_ex_ptr »·Ðλº³åÇøÖ¸Õë
 | 
 |  * @param[in] ptr ÄÚ´æ¿éÖ¸Õë
 | 
 |  * @return 1 sucess, 0 fail
 | 
 |  * @note
 | 
 |  * @see 
 | 
 |  */
 | 
 | int ringbuf_ex_set_empty(ringbuf_ex_type *ringbuf_ex_ptr, void *ptr);
 | 
 | 
 | 
 | /**
 | 
 |  * @brief ringbuf»ñÈ¡µÚÒ»¸öready buf
 | 
 |  * @param[in] ringbuf_ex_ptr »·Ðλº³åÇøÖ¸Õë
 | 
 |  * @param[in] ptr ÄÚ´æ¿éÖ¸Õë
 | 
 |  * @param[in] size ÄÚ´æ¿é´óС
 | 
 |  * @return 1 sucess, 0 fail
 | 
 |  * @note
 | 
 |  * @see 
 | 
 |  */
 | 
 | int ringbuf_ex_get_first_ready(ringbuf_ex_type *ringbuf_ex_ptr, void **ptr, UINT32 *size);
 | 
 | 
 | 
 | /**
 | 
 |  * @brief ÅжÏringbufµÄµÚÒ»¸öblockÊý¾ÝÊÇ·ñÒѾ׼±¸ºÃ
 | 
 |  * @param[in] ringbuf_ex_ptr »·Ðλº³åÇøÖ¸Õë
 | 
 |  * @return 1 sucess, 0 fail
 | 
 |  * @note
 | 
 |  * @see 
 | 
 |  */
 | 
 | int ringbuf_ex_first_block_is_ready(ringbuf_ex_type *ringbuf_ex_ptr);
 | 
 | 
 | 
 | /**
 | 
 |  * @brief ´´½¨ex2Ð͵Ļ·Ðλº³å
 | 
 |  * @param[in] size Óû§Ö¸¶¨µÄ´óС£¬×¢ÒâÓû§Êµ¼Ê¿ÉÓÿռä±ÈsizeС8
 | 
 |  * @return »·Ðλº³åÇøÖ¸Õë
 | 
 |  * @note
 | 
 |  * @see 
 | 
 |  */
 | 
 | void *ringbuf_ex2_create(unsigned int size);
 | 
 | 
 | 
 | /**
 | 
 |  * @brief Ïòex2Ð͵Ļ·Ðλº³åÖÐдÈëÊý¾Ý
 | 
 |  * @param[in] ringbuf_ex »·Ðλº³åÇøÖ¸Õë
 | 
 |  * @param[in] buf Êý¾ÝµØÖ·
 | 
 |  * @param[in] len Êý¾Ý³¤¶È
 | 
 |  * @return void
 | 
 |  * @note
 | 
 |  * @see 
 | 
 |  */
 | 
 | void ringbuf_ex2_write(void *ringbuf_ex, void *buf, unsigned int len);
 | 
 | 
 | 
 | #ifdef __cplusplus
 | 
 | }
 | 
 | #endif
 | 
 | 
 | 
 | 
 | 
 | #endif /* MEMHEAP_H */
 | 
 | 
 |