From: RĂ©mi Denis-Courmont Date: Sun, 7 Jun 2009 19:06:45 +0000 (+0300) Subject: block_heap_Alloc(): create a block from an existing heap allocation X-Git-Tag: 1.1.0-ff~5539 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=24140ae7036eb1df515c862b38879438ac16291a;p=vlc block_heap_Alloc(): create a block from an existing heap allocation --- diff --git a/include/vlc_block.h b/include/vlc_block.h index aa49c65228..98e5626450 100644 --- a/include/vlc_block.h +++ b/include/vlc_block.h @@ -157,6 +157,7 @@ static inline void block_Release( block_t *p_block ) p_block->pf_release( p_block ); } +VLC_EXPORT( block_t *, block_heap_Alloc, (void *, void *, size_t) LIBVLC_USED ); VLC_EXPORT( block_t *, block_mmap_Alloc, (void *addr, size_t length) LIBVLC_USED ); VLC_EXPORT( block_t *, block_File, (int fd) LIBVLC_USED ); diff --git a/src/libvlccore.sym b/src/libvlccore.sym index d588c37cd8..ac07e0906e 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -45,6 +45,7 @@ block_FifoRelease block_FifoShow block_FifoWake block_File +block_heap_Alloc block_Init block_mmap_Alloc block_Realloc diff --git a/src/misc/block.c b/src/misc/block.c index 099c31e226..b2cf2692e0 100644 --- a/src/misc/block.c +++ b/src/misc/block.c @@ -194,6 +194,49 @@ block_t *block_Realloc( block_t *p_block, ssize_t i_prebody, size_t i_body ) return p_block; } + +typedef struct +{ + block_t self; + void *mem; +} block_heap_t; + +static void block_heap_Release (block_t *self) +{ + block_heap_t *block = (block_heap_t *)self; + + free (block->mem); + free (block); +} + +/** + * Creates a block from a heap allocation. + * This is provided by LibVLC so that manually heap-allocated blocks can safely + * be deallocated even after the origin plugin has been unloaded from memory. + * + * When block_Release() is called, VLC will free() the specified pointer. + * + * @param ptr base address of the heap allocation (will be free()'d) + * @param addr base address of the useful buffer data + * @param length bytes length of the useful buffer datan + * @return NULL in case of error (ptr free()'d in that case), or a valid + * block_t pointer. + */ +block_t *block_heap_Alloc (void *ptr, void *addr, size_t length) +{ + block_heap_t *block = malloc (sizeof (*block)); + if (block == NULL) + { + free (addr); + return NULL; + } + + block_Init (&block->self, (uint8_t *)addr, length); + block->self.pf_release = block_heap_Release; + block->mem = ptr; + return &block->self; +} + #ifdef HAVE_MMAP # include