|
|
@@ -307,6 +307,7 @@ static AVBufferRef *pool_alloc_buffer(AVBufferPool *pool) |
|
|
|
ret->buffer->free = pool_release_buffer; |
|
|
|
|
|
|
|
avpriv_atomic_int_add_and_fetch(&pool->refcount, 1); |
|
|
|
avpriv_atomic_int_add_and_fetch(&pool->nb_allocated, 1); |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
@@ -318,6 +319,12 @@ AVBufferRef *av_buffer_pool_get(AVBufferPool *pool) |
|
|
|
|
|
|
|
/* check whether the pool is empty */ |
|
|
|
buf = get_pool(pool); |
|
|
|
if (!buf && pool->refcount <= pool->nb_allocated) { |
|
|
|
av_log(NULL, AV_LOG_DEBUG, "Pool race dectected, spining to avoid overallocation and eventual OOM\n"); |
|
|
|
while (!buf && avpriv_atomic_int_get(&pool->refcount) <= avpriv_atomic_int_get(&pool->nb_allocated)) |
|
|
|
buf = get_pool(pool); |
|
|
|
} |
|
|
|
|
|
|
|
if (!buf) |
|
|
|
return pool_alloc_buffer(pool); |
|
|
|
|
|
|
|