📄 hust_bufpool.c
字号:
/*------------------------------------------------------------------------- * bufpool.c - bufpoolinit, bufpoolgetbuf, bufpoolfreebuf, bufpooldestroy * * Bufferpool design is adapted from: * * Comer, D. E., Operating System Design: The XINU Approach, Prentice-Hall, * 1984. *------------------------------------------------------------------------- */#include <ipOS.h>#include <ipHAL.h>#include <ipStack.h>#include <ipEthernet.h>#include "hust_rtp.h"#include "hust_rtplibcommon.h"#include "hust_rtcp.h"#include "hust_event.h"#include "hust_hash.h"#include "hust_linux.h"///#include "rtplibcommon.h"///#include <stdlib.h>#include "hust_bufpool.h"/*------------------------------------------------------------------------ * bufpoolinit - allocate memory for a pool of fixed-size buffers * and link together *------------------------------------------------------------------------ */boolbufpoolinit(struct bufpool *pbp, int bufsize, int numbufs){ char *where; if (bufsize < BPMINB) return ERROR; where = pbp->bp_base = (char *) heap_alloc((bufsize + sizeof(struct bufpool *)) * numbufs); if (where == NULL) return ERROR; pbp->bp_total = numbufs; pbp->bp_next = where; pbp->bp_size = bufsize; ///sem_init(&pbp->bp_sem, FALSE, numbufs); ///pthread_mutex_init(&pbp->bp_mutex, NULL); bufsize += sizeof(struct bufpool *); for (numbufs-- ; numbufs > 0 ; numbufs--, where += bufsize) *((int *) where ) = (int) (where + bufsize); *((int *) where) = (int) NULL; return OK;}/*------------------------------------------------------------------------ * bufpoolgetbuf - get a fixed size buffer *------------------------------------------------------------------------ */int *bufpoolgetbuf(struct bufpool *pbp){ int *buf; ///if (sem_trywait(&pbp->bp_sem) != 0) /// return NULL; ///if (pthread_mutex_lock(&pbp->bp_mutex) != 0) { /// sem_post(&pbp->bp_sem); /// return NULL; ///} buf = (int *) pbp->bp_next; pbp->bp_next = (char *) *buf; ///pthread_mutex_unlock(&pbp->bp_mutex); *buf = (int) pbp; return buf + 1;}/*------------------------------------------------------------------------ * bufpoolfreebuf - free a buffer that was allocated from a pool by getbuf *------------------------------------------------------------------------ */voidbufpoolfreebuf(void *vbuf){ int *buf = (int *) vbuf; struct bufpool *pbp; pbp = (struct bufpool *) *(--buf); ///pthread_mutex_lock(&pbp->bp_mutex); *buf = (int) pbp->bp_next; pbp->bp_next = (char *) buf; ///pthread_mutex_unlock(&pbp->bp_mutex); ///sem_post(&pbp->bp_sem);}/*------------------------------------------------------------------------ * bufpooldestroy - destroy a pool of buffers *------------------------------------------------------------------------ */intbufpooldestroy(struct bufpool *pbp){ int i; if (pbp == NULL) return ERROR;/// for (i = 0; i < pbp->bp_total; i++)/// sem_wait(&pbp->bp_sem); heap_free(pbp->bp_base); ///sem_destroy(&pbp->bp_sem); ///pthread_mutex_destroy(&pbp->bp_mutex); return OK;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -