X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmisc%2Fblock.c;h=0a408cc26d15766b7d531542638b7a36cd2f65b4;hb=8b0dd8cfdff0d9697fb44e7849764c9274965adb;hp=069628ab230addee58ba76d6b7ae2b942bb4322e;hpb=3afcc0bb1f929748cc7de65531d0adbdd97098c4;p=vlc diff --git a/src/misc/block.c b/src/misc/block.c index 069628ab23..0a408cc26d 100644 --- a/src/misc/block.c +++ b/src/misc/block.c @@ -31,9 +31,7 @@ #include #include #include -#ifdef HAVE_UNISTD_H -# include -#endif +#include #include #include @@ -117,11 +115,15 @@ static void BlockMetaCopy( block_t *restrict out, const block_t *in ) out->i_length = in->i_length; } -/* Memory alignment (must be a multiple of sizeof(void*) and a power of two) */ -#define BLOCK_ALIGN 16 -/* Initial reserved header and footer size (must be multiple of alignment) */ +/** Initial memory alignment of data block. + * @note This must be a multiple of sizeof(void*) and a power of two. + * libavcodec AVX optimizations require at least 32-bytes. */ +#define BLOCK_ALIGN 32 + +/** Initial reserved header and footer size. */ #define BLOCK_PADDING 32 -/* Maximum size of reserved footer before we release with realloc() */ + +/* Maximum size of reserved footer before shrinking with realloc(). */ #define BLOCK_WASTE_SIZE 2048 block_t *block_Alloc (size_t size) @@ -335,8 +337,57 @@ block_t *block_mmap_Alloc (void *addr, size_t length) } #endif +#ifdef HAVE_SYS_SHM_H +# include + +typedef struct block_shm_t +{ + block_t self; + void *base_addr; +} block_shm_t; + +static void block_shm_Release (block_t *block) +{ + block_shm_t *p_sys = (block_shm_t *)block; + + shmdt (p_sys->base_addr); + free (p_sys); +} -#ifdef WIN32 +/** + * Creates a block from a System V shared memory segment (shmget()). + * This is provided by LibVLC so that segments can safely be deallocated + * even after the allocating plugin has been unloaded from memory. + * + * @param addr base address of the segment (as returned by shmat()) + * @param length length (bytes) of the segment (as passed to shmget()) + * @return NULL if an error occurred (in that case, shmdt(addr) is invoked + * before returning NULL). + */ +block_t *block_shm_Alloc (void *addr, size_t length) +{ + block_shm_t *block = malloc (sizeof (*block)); + if (unlikely(block == NULL)) + { + shmdt (addr); + return NULL; + } + + block_Init (&block->self, (uint8_t *)addr, length); + block->self.pf_release = block_shm_Release; + block->base_addr = addr; + return &block->self; +} +#else +block_t *block_shm_Alloc (void *addr, size_t length) +{ + (void) addr; (void) length; + abort (); +} +#endif + + +#ifdef _WIN32 # include static @@ -397,7 +448,7 @@ block_t *block_File (int fd) } /* Prevent an integer overflow in mmap() and malloc() */ - if (st.st_size >= SIZE_MAX) + if ((uintmax_t)st.st_size >= SIZE_MAX) { errno = ENOMEM; return NULL; @@ -672,14 +723,24 @@ block_t *block_FifoShow( block_fifo_t *p_fifo ) return b; } -/* FIXME: not thread-safe */ -size_t block_FifoSize( const block_fifo_t *p_fifo ) +/* FIXME: not (really) thread-safe */ +size_t block_FifoSize (block_fifo_t *fifo) { - return p_fifo->i_size; + size_t size; + + vlc_mutex_lock (&fifo->lock); + size = fifo->i_size; + vlc_mutex_unlock (&fifo->lock); + return size; } -/* FIXME: not thread-safe */ -size_t block_FifoCount( const block_fifo_t *p_fifo ) +/* FIXME: not (really) thread-safe */ +size_t block_FifoCount (block_fifo_t *fifo) { - return p_fifo->i_depth; + size_t depth; + + vlc_mutex_lock (&fifo->lock); + depth = fifo->i_depth; + vlc_mutex_unlock (&fifo->lock); + return depth; }