QDom: optimize an atomic read
By the time setNodeValue() gets its hands on the removed object, the removeChild() function has already called removed->ref.deref(), which performs an acquire fence if the ref-count drops to zero. IOW: if removed->ref == 0 now, then an acquire fence has been executed. If ref != 0, then we're not reaching into removed, so we need no acquire. Therefore, a relaxed load suffices (as opposed to the loadAcquire() the implicit conversion operator performs). Found by disabling QAtomic<T> -> T implicit conversions. Change-Id: I367754fde0ad82db797161b5e94e2ebc08a90c0b Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
ad26d6a18d
commit
2fb7c94f63
@ -3625,7 +3625,7 @@ void QDomAttrPrivate::setNodeValue(const QString& v)
|
|||||||
t->ref.deref();
|
t->ref.deref();
|
||||||
if (first) {
|
if (first) {
|
||||||
auto removed = removeChild(first);
|
auto removed = removeChild(first);
|
||||||
if (removed && !removed->ref)
|
if (removed && !removed->ref.loadRelaxed()) // removeChild() already deref()ed
|
||||||
delete removed;
|
delete removed;
|
||||||
}
|
}
|
||||||
appendChild(t);
|
appendChild(t);
|
||||||
|
Loading…
Reference in New Issue
Block a user