1377#if !defined(QT_NO_QOBJECT)
1378#include "private/qobject_p.h"
1399 if (strongref.loadRelaxed() < 0)
1400 qWarning(
"QSharedPointer: cannot create a QSharedPointer from a QObject-tracking QWeakPointer");
1407 Q_ASSERT_X(!
d->wasDeleted,
"QWeakPointer",
"Detected QWeakPointer creation in a QObject being deleted");
1417 x->strongref.storeRelaxed(-1);
1418 x->weakref.storeRelaxed(2);
1421 if (
d->sharedRefcount.testAndSetOrdered(
nullptr,
x,
ret)) {
1426 Q_ASSERT((
x->weakref.storeRelaxed(0),
true));
1463# ifdef QT_SHARED_POINTER_BACKTRACE_SUPPORT
1464# if defined(__GLIBC__) && (__GLIBC__ >= 2) && !defined(__UCLIBC__) && !defined(QT_LINUXBASE)
1465# define BACKTRACE_SUPPORTED
1466# elif defined(Q_OS_DARWIN)
1467# define BACKTRACE_SUPPORTED
1471# if defined(BACKTRACE_SUPPORTED)
1472# include <sys/types.h>
1473# include <execinfo.h>
1476# include <sys/wait.h>
1483 static const int maxFrames = 32;
1486 stacktrace.
resize(
sizeof(
void*) * maxFrames);
1487 int stack_size = backtrace((
void**)stacktrace.
data(), maxFrames);
1488 stacktrace.
resize(
sizeof(
void*) * stack_size);
1493static void printBacktrace(
QByteArray stacktrace)
1495 void *
const *stack = (
void *
const *)stacktrace.
constData();
1496 int stack_size = stacktrace.
size() /
sizeof(
void*);
1497 char **stack_symbols = backtrace_symbols(stack, stack_size);
1505 dup2(fileno(stderr), fileno(stdout));
1506 dup2(
filter[0], fileno(stdin));
1509 execlp(
"c++filt",
"c++filt",
"-n", NULL);
1512 execl(
"/bin/cat",
"/bin/cat", NULL);
1527 fprintf(stderr,
"Backtrace of the first creation (most recent frame first):\n");
1528 for (
int i = 0;
i < stack_size; ++
i) {
1529 if (strlen(stack_symbols[
i]))
1530 fprintf(
output,
"#%-2d %s\n",
i, stack_symbols[
i]);
1532 fprintf(
output,
"#%-2d %p\n",
i, stack[
i]);
1537 waitpid(
child, 0, 0);
1549# ifdef BACKTRACE_SUPPORTED
1576 KnownPointers *
const kp = knownPointers();
1587 Q_ASSERT(!kp->dPointers.contains(d_ptr));
1591 const void *other_d_ptr = kp->dataPointers.value(
ptr,
nullptr);
1593# ifdef BACKTRACE_SUPPORTED
1594 printBacktrace(knownPointers()->dPointers.value(other_d_ptr).backtrace);
1596 qFatal(
"QSharedPointer: internal self-check failed: pointer %p was already tracked "
1597 "by another QSharedPointer object %p",
ptr, other_d_ptr);
1602# ifdef BACKTRACE_SUPPORTED
1603 data.backtrace = saveBacktrace();
1606 kp->dPointers.insert(d_ptr,
data);
1607 kp->dataPointers.insert(
ptr, d_ptr);
1608 Q_ASSERT(kp->dPointers.size() == kp->dataPointers.size());
1616 KnownPointers *
const kp = knownPointers();
1624 qFatal(
"QSharedPointer: internal self-check inconsistency: pointer %p was not tracked. "
1625 "To use QT_SHAREDPOINTER_TRACK_POINTERS, you have to enable it throughout "
1626 "in your code.", d_ptr);
1629 const auto it2 = kp->dataPointers.constFind(
it->
pointer);
1630 Q_ASSERT(it2 != kp->dataPointers.cend());
1635 kp->dataPointers.erase(it2);
1636 kp->dPointers.erase(
it);
1637 Q_ASSERT(kp->dPointers.size() == kp->dataPointers.size());
1646# ifdef QT_BUILD_INTERNAL
1647 KnownPointers *
const kp = knownPointers();
1648 Q_ASSERT_X(kp,
"internalSafetyCheckSelfCheck()",
"Called after global statics deletion!");
1650 if (
Q_UNLIKELY(kp->dPointers.size() != kp->dataPointers.size()))
1651 qFatal(
"Internal consistency error: the number of pointers is not equal!");
1654 qFatal(
"Pointer cleaning failed: %d entries remaining",
int(kp->dPointers.size()));
char * data()
\macro QT_NO_CAST_FROM_BYTEARRAY
qsizetype size() const noexcept
Returns the number of bytes in this byte array.
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
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 GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
#define Q_ASSERT_X(cond, x, msg)
#define Q_AUTOTEST_EXPORT
QT_BEGIN_NAMESPACE typedef uchar * output
const volatile void * pointer
Q_CORE_EXPORT void setQObjectShared(const QObject *, bool enable)
Q_CORE_EXPORT void checkQObjectShared(const QObject *)
static Q_CORE_EXPORT ExternalRefCountData * getAndRef(const QObject *)