封装kmalloc/malloc的一些小函数

由于开发时常需要对分配的内存长度进行管理,C语言下又没有像C++那样方便的类, 所以只好重新封装了下kmalloc/kfree的内存分配释放函数. 操作起来还算比较方便:)

struct gbuffer{ u8 *buf; u32 len; }; typedef struct gbuffer gbuffer; typedef struct gbuffer gbuffer_t; static inline void gbuffer_init(gbuffer *p) { p->len = 0; p->buf = NULL; } static inline void __gbuffer_init(gbuffer *p, u8 *buf, u32 len) { p->len = len; p->buf = buf; } static inline int gbuffer_empty(gbuffer *p) { return ( p->buf == NULL ); } static inline void gbuffer_free(gbuffer *p) { if ( NULL == p ) return; #ifdef __KERNEL__ if ( likely( p->buf != NULL ) ){ kfree( p->buf ); p->buf = NULL; } #else if ( NULL != p->buf ) { free( p->buf ); } #endif p->len = 0; } static inline void _gbuffer_free(gbuffer *p) { if ( NULL == p ) return; #ifdef __KERNEL__ if ( likely( p->buf != NULL ) ){ kfree( p->buf ); p->buf = NULL; } kfree( p ); #else if ( NULL != p->buf ) { free( p->buf ); } free( p ); #endif } static inline gbuffer_t* __gbuffer_alloc(void) { gbuffer_t *p = NULL; #ifdef __KERNEL__ p = kzalloc( sizeof(*p), GFP_KERNEL ); if ( unlikely( NULL == p ) ){ return NULL; } #else p = malloc( sizeof(*p) ); if ( NULL == p ) return NULL; #endif p->buf = NULL; p->len = 0; return p; } static inline gbuffer_t* _gbuffer_alloc(u32 len) { gbuffer_t *p = NULL; #ifdef __KERNEL__ p = kzalloc( sizeof(*p), GFP_KERNEL ); if ( unlikely( NULL == p ) ){ return NULL; } p->buf = kzalloc( len, GFP_KERNEL ); if ( unlikely( NULL == p->buf ) ){ kfree( p ); return NULL; } #else p = malloc( sizeof(*p) ); if ( NULL == p ) return NULL; p->buf = malloc( len ); if ( NULL == p->buf ){ free( p ); return -1; } #endif p->len = len; return p; } static inline int gbuffer_alloc( gbuffer *p, u32 len ) { if ( NULL == p ) return -1; #ifdef __KERNEL__ p->buf = kzalloc( len, GFP_KERNEL ); if ( unlikely( NULL == p->buf ) ){ return -1; } #else p->buf = malloc( len ); if ( NULL == p->buf ){ return -1; } #endif p->len = len; return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值