1418#if !defined(QT_NO_QOBJECT)
1419#include "private/qobject_p.h"
1441void QtSharedPointer::ExternalRefCountData::checkQObjectShared(
const QObject *)
1443 if (strongref.loadRelaxed() < 0)
1444 qWarning(
"QSharedPointer: cannot create a QSharedPointer from a QObject-tracking QWeakPointer");
1452 Q_ASSERT_X(!
d->wasDeleted,
"QWeakPointer",
"Detected QWeakPointer creation in a QObject being deleted");
1462 x->strongref.storeRelaxed(-1);
1463 x->weakref.storeRelaxed(2);
1466 if (
d->sharedRefcount.testAndSetOrdered(
nullptr,
x,
ret)) {
1471 Q_ASSERT((
x->weakref.storeRelaxed(0),
true));
1486 return *
reinterpret_cast<const QSharedPointer<QObject>*
>(
variant.
constData());
1498 return *
reinterpret_cast<const QWeakPointer<QObject>*
>(
variant.
constData());
1508# ifdef QT_SHARED_POINTER_BACKTRACE_SUPPORT
1509# if defined(__GLIBC__) && (__GLIBC__ >= 2) && !defined(__UCLIBC__) && !defined(QT_LINUXBASE)
1510# define BACKTRACE_SUPPORTED
1511# elif defined(Q_OS_DARWIN)
1512# define BACKTRACE_SUPPORTED
1516# if defined(BACKTRACE_SUPPORTED)
1517# include <sys/types.h>
1518# include <execinfo.h>
1521# include <sys/wait.h>
1528 static const int maxFrames = 32;
1531 stacktrace.
resize(
sizeof(
void*) * maxFrames);
1532 int stack_size = backtrace((
void**)stacktrace.data(), maxFrames);
1533 stacktrace.resize(
sizeof(
void*) * stack_size);
1538static void printBacktrace(
QByteArray stacktrace)
1540 void *
const *stack = (
void *
const *)stacktrace.constData();
1541 int stack_size = stacktrace.size() /
sizeof(
void*);
1542 char **stack_symbols = backtrace_symbols(stack, stack_size);
1550 dup2(fileno(stderr), fileno(stdout));
1551 dup2(
filter[0], fileno(stdin));
1554 execlp(
"c++filt",
"c++filt",
"-n", NULL);
1557 execl(
"/bin/cat",
"/bin/cat", NULL);
1572 fprintf(stderr,
"Backtrace of the first creation (most recent frame first):\n");
1573 for (
int i = 0;
i < stack_size; ++
i) {
1574 if (strlen(stack_symbols[
i]))
1575 fprintf(
output,
"#%-2d %s\n",
i, stack_symbols[
i]);
1577 fprintf(
output,
"#%-2d %p\n",
i, stack[
i]);
1582 waitpid(
child, 0, 0);
1594# ifdef BACKTRACE_SUPPORTED
1621 KnownPointers *
const kp = knownPointers();
1632 Q_ASSERT(!kp->dPointers.contains(d_ptr));
1636 const void *other_d_ptr = kp->dataPointers.value(
ptr,
nullptr);
1638# ifdef BACKTRACE_SUPPORTED
1639 printBacktrace(knownPointers()->dPointers.value(other_d_ptr).backtrace);
1641 qFatal(
"QSharedPointer: internal self-check failed: pointer %p was already tracked "
1642 "by another QSharedPointer object %p",
ptr, other_d_ptr);
1647# ifdef BACKTRACE_SUPPORTED
1648 data.backtrace = saveBacktrace();
1651 kp->dPointers.insert(d_ptr,
data);
1652 kp->dataPointers.insert(
ptr, d_ptr);
1653 Q_ASSERT(kp->dPointers.size() == kp->dataPointers.size());
1661 KnownPointers *
const kp = knownPointers();
1669 qFatal(
"QSharedPointer: internal self-check inconsistency: pointer %p was not tracked. "
1670 "To use QT_SHAREDPOINTER_TRACK_POINTERS, you have to enable it throughout "
1671 "in your code.", d_ptr);
1674 const auto it2 = kp->dataPointers.constFind(
it->
pointer);
1675 Q_ASSERT(it2 != kp->dataPointers.cend());
1680 kp->dataPointers.erase(it2);
1681 kp->dPointers.erase(
it);
1682 Q_ASSERT(kp->dPointers.size() == kp->dataPointers.size());
1691# ifdef QT_BUILD_INTERNAL
1692 KnownPointers *
const kp = knownPointers();
1693 Q_ASSERT_X(kp,
"internalSafetyCheckSelfCheck()",
"Called after global statics deletion!");
1695 if (
Q_UNLIKELY(kp->dPointers.size() != kp->dataPointers.size()))
1696 qFatal(
"Internal consistency error: the number of pointers is not equal!");
1699 qFatal(
"Pointer cleaning failed: %d entries remaining",
int(kp->dPointers.size()));
void resize(qsizetype size)
Sets the size of the byte array to size bytes.
static QObjectPrivate * get(QObject *o)
const_iterator cend() const noexcept
const_iterator constFind(const T &value) const
QHash< const void *, Data > dPointers
QHash< const volatile void *, const void * > dataPointers
QMetaType metaType() const
const void * constData() const
QSet< QString >::iterator it
Combined button and popup list for selecting options.
Q_CORE_EXPORT QWeakPointer< QObject > weakPointerFromVariant_internal(const QVariant &variant)
Q_AUTOTEST_EXPORT void internalSafetyCheckCleanCheck()
Q_CORE_EXPORT void internalSafetyCheckRemove(const void *)
Q_CORE_EXPORT void internalSafetyCheckAdd(const void *, const volatile void *)
Q_CORE_EXPORT QSharedPointer< QObject > sharedPointerFromVariant_internal(const QVariant &variant)
constexpr Initialization Uninitialized
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
static ControlElement< T > * ptr(QWidget *widget)
GLint GLint GLint GLint GLint x
[0]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
#define Q_ASSERT_X(cond, x, msg)
QT_BEGIN_NAMESPACE QT6_ONLY(void QtSharedPointer::ExternalRefCountData::setQObjectShared(const QObject *, bool) {}) QT6_ONLY(void QtSharedPointer
#define Q_AUTOTEST_EXPORT
QT_BEGIN_NAMESPACE typedef uchar * output
const volatile void * pointer
void setQObjectShared(...)
static Q_CORE_EXPORT ExternalRefCountData * getAndRef(const QObject *)