📄 wxbuff.c
字号:
/* * This piece of code is totally free. If any pitfalls found, * please feel free to contact me at jetmotor@21cn.com * THANKS A LOT! */#include <stdlib.h>#include <string.h>#include "que.h"#include "wxbuff.h"#define NR_WXBUFF_MAX 32#define NR_DATABUFF_MAX 16pool_t g_wxbuffpool;pool_t g_databuffpool;int32_t wxbuff_pool_init(){ int32_t i; wxbuff_t *wxb; databuff_t *db; pool_init(&g_wxbuffpool); pool_init(&g_databuffpool); for ( i = 0; i < NR_WXBUFF_MAX; i++ ) { if ( (wxb = (wxbuff_t *)malloc(sizeof(wxbuff_t))) == NULL ) return -1; memset(wxb, 0, sizeof(wxbuff_t)); list_add_tail(&wxb->junior, &g_wxbuffpool.link); g_wxbuffpool.count++; } for ( i = 0; i < NR_DATABUFF_MAX; i++ ) { if ( (db = (databuff_t *)malloc(sizeof(databuff_t))) == NULL ) return -1; atomic_set(&db->ref, 0); list_add_tail(&db->link, &g_databuffpool.link); g_databuffpool.count++; } return 0;}wxbuff_t * get_wxbuff(wxbuff_t *refwxb){ wxbuff_t *wxb; databuff_t *db; pthread_mutex_lock(&g_wxbuffpool.mutex); if ( g_wxbuffpool.count == 0 ) { pthread_mutex_unlock(&g_wxbuffpool.mutex); return NULL; } else { wxb = list_entry(g_wxbuffpool.link.next, wxbuff_t, junior); list_del(g_wxbuffpool.link.next); g_wxbuffpool.count--; pthread_mutex_unlock(&g_wxbuffpool.mutex); memset(wxb, 0, sizeof(wxbuff_t)); INIT_LIST_HEAD(&wxb->senior); INIT_LIST_HEAD(&wxb->junior); } if ( refwxb == NULL ) { pthread_mutex_lock(&g_databuffpool.mutex); if ( g_databuffpool.count == 0 ) { pthread_mutex_unlock(&g_databuffpool.mutex); put_wxbuff(wxb); wxb = NULL; } else { db = list_entry(g_databuffpool.link.next, databuff_t, link); list_del(g_databuffpool.link.next); g_databuffpool.count--; atomic_set(&db->ref,1); wxb->data = &db->data[0]; wxb->beg = wxb->end = wxb->data; wxb->tail = &db->data[2048]; } pthread_mutex_unlock(&g_databuffpool.mutex); } else { wxb->data = refwxb->data; wxb->tail = refwxb->tail; wxb->beg = wxb->end = wxb->data; db = wxbuff_databuff(refwxb); atomic_inc(&db->ref); } return wxb;}int32_t put_wxbuff(wxbuff_t *wxb){ databuff_t *db; if ( wxb->data != NULL && wxb->tail != NULL ) { db = wxbuff_databuff(wxb); if ( atomic_dec_and_test(&db->ref) ) { pthread_mutex_lock(&g_databuffpool.mutex); list_add_tail(&db->link, &g_databuffpool.link); g_databuffpool.count++; pthread_mutex_unlock(&g_databuffpool.mutex); } } pthread_mutex_lock(&g_wxbuffpool.mutex); list_add_tail(&wxb->junior, &g_wxbuffpool.link); g_wxbuffpool.count++; pthread_mutex_unlock(&g_wxbuffpool.mutex); return 0;}void init_wxbuff(wxbuff_t *wxb){ databuff_t *db = wxbuff_databuff(wxb); atomic_set(&db->ref, 0); wxb->tolen = wxb->len = 0; wxb->cid = 0; wxb->beg = wxb->end = wxb->data; wxbuff_reserve(wxb, 64); return;}uint8_t * copy_and_free_wxbuff(wxbuff_t *wxb, uint32_t *len){ uint8_t *buffer; struct list_head hdr, *pos, *tmp; wxbuff_t *_wxb; uint32_t off = 0; if ( (buffer = (uint8_t *)malloc(wxb->tolen)) == NULL ) return NULL; *len = wxb->tolen; list_add_tail(&hdr, &wxb->junior); list_for_each_safe(pos, tmp, &hdr) { _wxb = list_entry(pos, wxbuff_t, junior); memcpy(buffer+off, _wxb->beg, _wxb->len); off += _wxb->len; put_wxbuff(_wxb); } return buffer;}void wxbuff_reserve(wxbuff_t *wxb, uint32_t size){ wxb->beg += size; wxb->end += size; return;}int32_t wxbuff_push(wxbuff_t *wxb, uint8_t *in, uint32_t len){ if ( wxb->end+len > wxb->tail ) return -1; memcpy(wxb->end, in, len); wxb->end += len; wxb->len += len; return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -