Skip to content

Is pool::allocate correct? #17

Description

@angainor

It seems to me that pool::allocate can return without unlocking an internally locked mutex. There are a number of return statements on the way before m_mutex.unlock();. It also seems there is quite a number of if (m_free_stack.pop(b)) return b; calls. Can this be simplified?

    auto allocate()
    {
        block_type b;
        if (m_free_stack.pop(b)) return b;
        if (!m_mutex.try_lock())
            if (m_free_stack.pop(b)) return b;
        if (m_free_stack.pop(b)) return b;
        for (auto& kvp : m_segments) kvp.first->collect(m_free_stack);
        if (m_free_stack.pop(b)) return b;
        unsigned int counter = 0;
        while (!m_free_stack.pop(b))
        {
            // add segments every 2nd iteration
            if (++counter % 2 == 0) add_segment();
        }
        m_mutex.unlock();
        return b;
    }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions