mirror of https://git.ffmpeg.org/ffmpeg.git
avcodec/refstruct: Allow to always return zeroed pool entries
This is in preparation for the following commit. Reviewed-by: Anton Khirnov <anton@khirnov.net> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
parent
e01e30ede1
commit
090d9956fd
|
@ -285,6 +285,10 @@ static int refstruct_pool_get_ext(void *datap, FFRefStructPool *pool)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
atomic_fetch_add_explicit(&pool->refcount, 1, memory_order_relaxed);
|
atomic_fetch_add_explicit(&pool->refcount, 1, memory_order_relaxed);
|
||||||
|
|
||||||
|
if (pool->pool_flags & FF_REFSTRUCT_POOL_FLAG_ZERO_EVERY_TIME)
|
||||||
|
memset(ret, 0, pool->size);
|
||||||
|
|
||||||
memcpy(datap, &ret, sizeof(ret));
|
memcpy(datap, &ret, sizeof(ret));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -357,6 +361,12 @@ FFRefStructPool *ff_refstruct_pool_alloc_ext_c(size_t size, unsigned flags,
|
||||||
flags &= ~FF_REFSTRUCT_POOL_FLAG_FREE_ON_INIT_ERROR;
|
flags &= ~FF_REFSTRUCT_POOL_FLAG_FREE_ON_INIT_ERROR;
|
||||||
pool->pool_flags = flags;
|
pool->pool_flags = flags;
|
||||||
|
|
||||||
|
if (flags & FF_REFSTRUCT_POOL_FLAG_ZERO_EVERY_TIME) {
|
||||||
|
// We will zero the buffer before every use, so zeroing
|
||||||
|
// upon allocating the buffer is unnecessary.
|
||||||
|
pool->entry_flags |= FF_REFSTRUCT_FLAG_NO_ZEROING;
|
||||||
|
}
|
||||||
|
|
||||||
atomic_init(&pool->refcount, 1);
|
atomic_init(&pool->refcount, 1);
|
||||||
|
|
||||||
err = ff_mutex_init(&pool->mutex, NULL);
|
err = ff_mutex_init(&pool->mutex, NULL);
|
||||||
|
|
|
@ -211,6 +211,14 @@ typedef struct FFRefStructPool FFRefStructPool;
|
||||||
* the callbacks applied earlier (init_cb potentially followed by reset_cb).
|
* the callbacks applied earlier (init_cb potentially followed by reset_cb).
|
||||||
*/
|
*/
|
||||||
#define FF_REFSTRUCT_POOL_FLAG_FREE_ON_INIT_ERROR (1 << 17)
|
#define FF_REFSTRUCT_POOL_FLAG_FREE_ON_INIT_ERROR (1 << 17)
|
||||||
|
/**
|
||||||
|
* If this flag is set, the entries will be zeroed before
|
||||||
|
* being returned to the user (after the init or reset callbacks
|
||||||
|
* have been called (if provided)). Furthermore, to avoid zeroing twice
|
||||||
|
* it also makes the pool behave as if the FF_REFSTRUCT_POOL_FLAG_NO_ZEROING
|
||||||
|
* flag had been provided.
|
||||||
|
*/
|
||||||
|
#define FF_REFSTRUCT_POOL_FLAG_ZERO_EVERY_TIME (1 << 18)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Equivalent to ff_refstruct_pool_alloc(size, flags, NULL, NULL, NULL, NULL, NULL)
|
* Equivalent to ff_refstruct_pool_alloc(size, flags, NULL, NULL, NULL, NULL, NULL)
|
||||||
|
|
Loading…
Reference in New Issue