RmBuffer *rm_buffer_get(RmBufferPool *pool) { RmBuffer *buffer = NULL; g_mutex_lock(&pool->lock); { while(!buffer) { buffer = rm_util_slist_pop(&pool->stack, NULL); if (!buffer && pool->avail_buffers > 0) { buffer = rm_buffer_new(pool); } if (!buffer) { if(!pool->mem_warned) { rm_log_warning_line( "read buffer limit reached - waiting for " "processing to catch up"); pool->mem_warned = true; } g_cond_wait(&pool->change, &pool->lock); } } pool->avail_buffers--; } g_mutex_unlock(&pool->lock); rm_assert_gentle(buffer); return buffer; }
RmBuffer *rm_buffer_pool_get(RmBufferPool *pool) { RmBuffer *buffer = NULL; g_mutex_lock(&pool->lock); { while(!buffer) { if(pool->stack) { buffer = pool->stack->data; pool->stack = g_slist_delete_link(pool->stack, pool->stack); } else if(pool->avail_buffers > 0) { buffer = rm_buffer_new(pool); } else { if(!pool->mem_warned) { rm_log_warning_line( "read buffer limit reached - waiting for " "processing to catch up"); pool->mem_warned = true; } g_cond_wait(&pool->change, &pool->lock); } } pool->avail_buffers--; if(pool->avail_buffers < pool->min_kept_buffers) { pool->min_kept_buffers = pool->avail_buffers; } } g_mutex_unlock(&pool->lock); rm_assert_gentle(buffer); return buffer; }