bool QDBusArgumentPrivate::checkWrite(QDBusArgumentPrivate *&d) { if (!d) return false; if (d->direction == Marshalling) { if (!d->marshaller()->ok) return false; if (d->message && d->ref != 1) { QDBusMarshaller *dd = new QDBusMarshaller; dd->message = dbus_message_copy(d->message); dbus_message_iter_init_append(dd->message, &dd->iterator); QDBusArgumentPrivate *old = qAtomicSetPtr(&d, static_cast<QDBusArgumentPrivate *>(dd)); if (!old->ref.deref()) delete old; } return true; } #ifdef QT_DEBUG qFatal("QDBusArgument: write from a read-only object"); #else qWarning("QDBusArgument: write from a read-only object"); #endif return false; }
/*! \fn QTextDocumentFragment &QTextDocumentFragment::operator=(const QTextDocumentFragment &other) Assigns the \a other fragment to this fragment. */ QTextDocumentFragment &QTextDocumentFragment::operator=(const QTextDocumentFragment &rhs) { QTextDocumentFragmentPrivate *x = rhs.d; if (x) x->ref.ref(); x = qAtomicSetPtr(&d, x); if (x && !x->ref.deref()) delete x; return *this; }
QListData::Data *QListData::detach() { Q_ASSERT(d->ref != 1); Data *x = static_cast<Data *>(qMalloc(DataHeaderSize + d->alloc * sizeof(void *))); ::memcpy(x, d, DataHeaderSize + d->alloc * sizeof(void *)); x->alloc = d->alloc; x->ref.init(1); x->sharable = true; if (!x->alloc) x->begin = x->end = 0; x = qAtomicSetPtr(&d, x); if (!x->ref.deref()) return x; return 0; }
/*! \internal */ void QAuthenticator::detach() { if (!d) { d = new QAuthenticatorPrivate; d->ref.ref(); return; } if (d->ref.ref() != 1) { QAuthenticatorPrivate *x = new QAuthenticatorPrivate(*d); x = qAtomicSetPtr(&d, x); if (!x->ref.deref()) delete x; } d->phase = QAuthenticatorPrivate::Start; }
bool QDBusArgumentPrivate::checkReadAndDetach(QDBusArgumentPrivate *&d) { if (!checkRead(d)) return false; // don't bother if (d->ref == 1) return true; // no need to detach QDBusDemarshaller *dd = new QDBusDemarshaller; dd->message = dbus_message_ref(d->message); dd->iterator = static_cast<QDBusDemarshaller*>(d)->iterator; QDBusArgumentPrivate *old = qAtomicSetPtr(&d, static_cast<QDBusArgumentPrivate *>(dd)); if (!old->ref.deref()) delete old; return true; }