⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wxbuff.c

📁 wimax BS simulation code,implemented under linux.
💻 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 + -