示例#1
0
文件: checksum.c 项目: FihlaTV/rmlint
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;
}
示例#2
0
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;
}