On Mon, 28 Jan 2013 11:21:17 +0100, Reinhard Tartler <siret...@gmail.com> wrote:
> On Mon, Jan 28, 2013 at 7:53 AM, Anton Khirnov <an...@khirnov.net> wrote:
> > +/* remove the whole buffer list from the pool and return it */
> > +static BufferPoolEntry *get_pool(AVBufferPool *pool)
> > +{
> > +    BufferPoolEntry *cur, *last = NULL;
> > +
> > +    cur = avpriv_atomic_ptr_cas((void * volatile *)&pool->pool, NULL, 
> > NULL);
> > +    if (!cur)
> > +        return NULL;
> > +
> > +    while (cur != last) {
> > +        FFSWAP(BufferPoolEntry*, cur, last);
> > +        cur = avpriv_atomic_ptr_cas((void * volatile *)&pool->pool, last, 
> > NULL);
> > +    }
> 
> I think a do {} while() would make this look a bit less weird.

Fixed

> > +/**
> > + * @defgroup lavu_bufferpool AVBufferPool
> > + * @ingroup lavu_data
> > + *
> > + * @{
> > + * AVBufferPool is an API for a lock-free thread-safe pool of AVBuffers.
> > + *
> > + * Frequently allocating and freeing large buffers may be slow. 
> > AVBufferPool is
> > + * meant to solve this in cases when the caller needs a set of buffers of 
> > the
> > + * same size (the most obvious use case being buffers for raw video or 
> > audio
> > + * frames).
> > + *
> > + * At the beginning, the user must call av_buffer_pool_init() to create the
> > + * buffer pool. Then whenever a buffer is needed, call 
> > av_buffer_alloc_pool() to
> > + * get a reference to a new buffer, similar to av_buffer_alloc(). This new
> > + * reference works in all aspects the same way as the one created by
> > + * av_buffer_alloc(). However, when the last reference to this buffer is
> > + * unreferenced, it is returned to the pool instead of being freed and 
> > will be
> > + * reused for subsequent av_buffer_alloc_pool() calls.
> > + *
> > + * When the caller is done with the pool and no longer needs to allocate 
> > any new
> > + * buffers, av_buffer_pool_uninit() must be called to mark the pool as 
> > freeable.
> > + * Once all the buffers are released, it will automatically be freed.
> > + *
> > + * Allocating and releasing buffers with this API is thread-safe as long as
> > + * either the default alloc callback is used, or the user-supplied one is
> > + * thread-safe.
> > + */
> > +
> > +/**
> > + * The buffer pool. This structure is opaque and not meant to be accessed
> > + * directly. It is allocated with av_buffer_pool_init() and freed with
> > + * av_buffer_pool_uninit().
> > + */
> > +typedef struct AVBufferPool AVBufferPool;
> > +
> > +/**
> > + * Allocate and initialize a buffer pool.
> > + *
> > + * @param size size of each buffer in this pool
> > + * @param alloc a function that will be used to allocate new buffers when 
> > the
> > + * pool is empty. May be NULL, then the default allocator will be used
> > + * (av_buffer_alloc()).
> > + * @return newly created buffer pool on success, NULL on error.
> > + */
> > +AVBufferPool *av_buffer_pool_init(int size, AVBufferRef* (*alloc)(int 
> > size));
> > +
> > +/**
> > + * Mark the pool as being available for freeing. It will actually be freed 
> > only
> > + * once all the allocated buffers associated with the pool are released. 
> > Thus it
> > + * is safe to call this function while some of the allocated buffers are 
> > still
> > + * in use.
> > + *
> > + * @param pool pointer to the pool to be freed. It will be set to NULL.
> > + * @see av_buffer_pool_can_uninit()
> > + */
> > +void av_buffer_pool_uninit(AVBufferPool **pool);
> > +
> > +/**
> > + * Allocate a new AVBuffer, reusing an old buffer from the pool when 
> > available.
> > + *
> > + * @return a reference to the new buffer on success, NULL on error.
> > + */
> > +AVBufferRef *av_buffer_alloc_pool(AVBufferPool *pool);
> > +
> > +/**
> > + * Same as av_buffer_allocz_pool(), except the data in the returned buffer 
> > will
> > + * be initialized to zero.
> > + */
> > +AVBufferRef *av_buffer_allocz_pool(AVBufferPool *pool);
> > +
> > +/**
> > + * @}
> > + */
> 
> The documentation should elaborate a bit more what methods support
> what kind of concurrency situation. Which of them may be called from
> different threads simultanously, and which not?
> 

Wel...the whole API is just 3.5 functions (alloc/allocz are the same thing with
a different flavor). init and uninit it only makes sense to call once, so the
question of concurrency does not even arise. alloc is thread-safe, as the
documentation explicitly says. So I don't see what more could be said here.

-- 
Anton Khirnov
_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to