Commit 24140ae7 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

block_heap_Alloc(): create a block from an existing heap allocation

parent 4b36ca62
...@@ -157,6 +157,7 @@ static inline void block_Release( block_t *p_block ) ...@@ -157,6 +157,7 @@ static inline void block_Release( block_t *p_block )
p_block->pf_release( 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_mmap_Alloc, (void *addr, size_t length) LIBVLC_USED );
VLC_EXPORT( block_t *, block_File, (int fd) LIBVLC_USED ); VLC_EXPORT( block_t *, block_File, (int fd) LIBVLC_USED );
......
...@@ -45,6 +45,7 @@ block_FifoRelease ...@@ -45,6 +45,7 @@ block_FifoRelease
block_FifoShow block_FifoShow
block_FifoWake block_FifoWake
block_File block_File
block_heap_Alloc
block_Init block_Init
block_mmap_Alloc block_mmap_Alloc
block_Realloc block_Realloc
......
...@@ -194,6 +194,49 @@ block_t *block_Realloc( block_t *p_block, ssize_t i_prebody, size_t i_body ) ...@@ -194,6 +194,49 @@ block_t *block_Realloc( block_t *p_block, ssize_t i_prebody, size_t i_body )
return p_block; 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 #ifdef HAVE_MMAP
# include <sys/mman.h> # include <sys/mman.h>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment