From 9353736bd427c993fd57d1ec3fbc5db3042fe118 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Mon, 26 Nov 2007 19:18:23 +0000 Subject: [PATCH] Cleanup custom block allocation --- include/vlc_block.h | 20 +++++++++----- modules/access/screen/win32.c | 6 +--- src/libvlc.sym | 3 +- src/misc/block.c | 52 +++++++++++++++++++++-------------- 4 files changed, 47 insertions(+), 34 deletions(-) diff --git a/include/vlc_block.h b/include/vlc_block.h index 861f76b2b4..8d46178831 100644 --- a/include/vlc_block.h +++ b/include/vlc_block.h @@ -78,6 +78,8 @@ typedef struct block_sys_t block_sys_t; #define BLOCK_FLAG_PRIVATE_MASK 0xffff0000 #define BLOCK_FLAG_PRIVATE_SHIFT 16 +typedef void (*block_free_t) (block_t *); + struct block_t { block_t *p_next; @@ -95,10 +97,8 @@ struct block_t size_t i_buffer; uint8_t *p_buffer; - /* This way the block_Release can be overloaded - * Don't mess with it now, if you need it the ask on ML - */ - void (*pf_release) ( block_t * ); + /* Rudimentary support for overloading block (de)allocation. */ + block_free_t pf_release; }; /**************************************************************************** @@ -117,9 +117,15 @@ struct block_t * and decrease are supported). Use it as it is optimised. * - block_Duplicate : create a copy of a block. ****************************************************************************/ -#define block_New( a, b ) __block_New( NULL, b ) -VLC_EXPORT( block_t *, __block_New, ( vlc_object_t *, size_t ) ); -VLC_EXPORT( block_t *, block_Realloc, ( block_t *, ssize_t i_pre, size_t i_body ) ); +VLC_EXPORT( void, block_Init, ( block_t *, void *, size_t ) ); +VLC_EXPORT( block_t *, block_Alloc, ( size_t ) ); +VLC_EXPORT( block_t *, block_Realloc, ( block_t *, ssize_t i_pre, size_t i_body ) ); + +static inline block_t *block_New( void *dummy, size_t size ) +{ + (void)dummy; + return block_Alloc (size); +} static inline block_t *block_Duplicate( block_t *p_block ) { diff --git a/modules/access/screen/win32.c b/modules/access/screen/win32.c index f553eee0db..557e42d6dd 100644 --- a/modules/access/screen/win32.c +++ b/modules/access/screen/win32.c @@ -205,14 +205,10 @@ static block_t *CaptureBlockNew( demux_t *p_demux ) DeleteObject( hbmp ); return NULL; } - memset( &p_block->self, 0, sizeof( block_t->self ) ); - /* Fill all fields */ i_buffer = (p_sys->fmt.video.i_bits_per_pixel + 7) / 8 * p_sys->fmt.video.i_width * p_sys->fmt.video.i_height; - p_block->self.p_next = NULL; - p_block->self.i_buffer = i_buffer; - p_block->self.p_buffer = p_buffer; + block_Init( &p_block->self, p_buffer, i_buffer ); p_block->self.pf_release = CaptureBlockRelease; p_block->hbmp = hbmp; diff --git a/src/libvlc.sym b/src/libvlc.sym index 046aacfaa6..e55a318921 100644 --- a/src/libvlc.sym +++ b/src/libvlc.sym @@ -71,7 +71,8 @@ block_FifoRelease block_FifoShow block_FifoCount block_FifoSize -__block_New +block_Init +block_Alloc block_Realloc config_ChainCreate config_ChainDestroy diff --git a/src/misc/block.c b/src/misc/block.c index 1b6539cbd1..abd10e8b5e 100644 --- a/src/misc/block.c +++ b/src/misc/block.c @@ -38,10 +38,36 @@ struct block_sys_t uint8_t p_allocated_buffer[0]; }; +#ifndef NDEBUG +static void BlockNoRelease( block_t *b ) +{ + fprintf( stderr, "block %p has no release callback! This is a bug!\n", b ); + abort(); +} +#endif + +void block_Init( block_t *restrict b, void *buf, size_t size ) +{ + /* Fill all fields to their default */ + b->p_next = b->p_prev = NULL; + b->i_flags = 0; + b->i_pts = b->i_dts = b->i_length = 0; + b->i_rate = 0; + b->p_buffer = buf; + b->i_buffer = size; +#ifndef NDEBUG + b->pf_release = BlockNoRelease; +#endif +} + +static void BlockRelease( block_t *p_block ) +{ + free( p_block ); +} + #define BLOCK_PADDING_SIZE 32 -static void BlockRelease( block_t * ); -block_t *__block_New( vlc_object_t *p_obj, size_t i_size ) +block_t *block_Alloc( size_t i_size ) { /* We do only one malloc * TODO bench if doing 2 malloc but keeping a pool of buffer is better @@ -57,19 +83,9 @@ block_t *__block_New( vlc_object_t *p_obj, size_t i_size ) /* Fill opaque data */ p_sys->i_allocated_buffer = i_alloc; - /* Fill all fields */ - p_sys->self.p_next = NULL; - p_sys->self.p_prev = NULL; - p_sys->self.i_flags = 0; - p_sys->self.i_pts = 0; - p_sys->self.i_dts = 0; - p_sys->self.i_length = 0; - p_sys->self.i_rate = 0; - p_sys->self.i_buffer = i_size; - p_sys->self.p_buffer = - &p_sys->p_allocated_buffer[BLOCK_PADDING_SIZE + - 16 - ((uintptr_t)p_sys->p_allocated_buffer % 16 )]; - p_sys->self.pf_release = BlockRelease; + block_Init( &p_sys->self, p_sys->p_allocated_buffer + BLOCK_PADDING_SIZE + + 16 - ((uintptr_t)p_sys->p_allocated_buffer % 16 ), i_size ); + p_sys->self.pf_release = BlockRelease; return &p_sys->self; } @@ -139,12 +155,6 @@ block_t *block_Realloc( block_t *p_block, ssize_t i_prebody, size_t i_body ) return p_block; } -static void BlockRelease( block_t *p_block ) -{ - free( p_block ); -} - - /***************************************************************************** * block_fifo_t management *****************************************************************************/ -- 2.39.2