Revision control
Copy as Markdown
// Copyright (C) 2025 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qmemory_resource_tlsf_p.h"
#include <QtCore/qassert.h>
#include <tlsf.h>
QT_BEGIN_NAMESPACE
namespace QtMultimediaPrivate {
QTlsfMemoryResource::QTlsfMemoryResource(std::size_t preallocatedBytes, memory_resource *upstream):
m_allocationSize {
preallocatedBytes + 8192, // over-allocate by 8k for tlsf header
},
m_upstream{
upstream,
}
{
m_buffer = reinterpret_cast<std::byte *>(operator new(m_allocationSize, poolAlignment));
m_tlsf = QtPrivate::tlsf_create_with_pool(m_buffer, m_allocationSize);
Q_ASSERT(m_tlsf);
}
QTlsfMemoryResource::~QTlsfMemoryResource()
{
QtPrivate::tlsf_destroy(m_tlsf);
::operator delete(m_buffer, poolAlignment);
}
void *QTlsfMemoryResource::do_allocate(size_t bytes, size_t alignment)
{
void *ret = QtPrivate::tlsf_memalign(m_tlsf, alignment, bytes);
if (Q_UNLIKELY(ret == nullptr))
ret = m_upstream->allocate(bytes, alignment);
return ret;
}
void QTlsfMemoryResource::do_deallocate(void *p, size_t bytes, size_t alignment)
{
if (Q_LIKELY(p >= m_buffer && p < m_buffer + m_allocationSize))
QtPrivate::tlsf_free(m_tlsf, p);
else
m_upstream->deallocate(p, bytes, alignment);
}
bool QTlsfMemoryResource::do_is_equal(const memory_resource &other) const noexcept
{
return this == &other;
}
} // namespace QtMultimediaPrivate
QT_END_NAMESPACE