Merge pull request #39903 from RandomShaper/fix_object_rc_leak

Fix leaked ObjectRCs on object Variant reassignment
This commit is contained in:
Rémi Verschelde 2020-06-28 09:53:32 +02:00 committed by GitHub
commit 94eaeb5e84
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 5 deletions

View File

@ -1996,7 +1996,7 @@ Object::~Object() {
ObjectRC *rc = _rc.load(std::memory_order_acquire); ObjectRC *rc = _rc.load(std::memory_order_acquire);
if (rc) { if (rc) {
if (rc->invalidate()) { if (rc->invalidate()) {
memfree(rc); memdelete(rc);
} }
} }
#endif #endif

View File

@ -1121,9 +1121,9 @@ void Variant::clear() {
case OBJECT: { case OBJECT: {
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
if (_get_obj().rc) { if (likely(_get_obj().rc)) {
if (_get_obj().rc->decrement()) { if (unlikely(_get_obj().rc->decrement())) {
memfree(_get_obj().rc); memdelete(_get_obj().rc);
} }
} else { } else {
_get_obj().ref.unref(); _get_obj().ref.unref();
@ -2655,9 +2655,16 @@ void Variant::operator=(const Variant &p_variant) {
} break; } break;
case OBJECT: { case OBJECT: {
#ifdef DEBUG_ENABLED
if (likely(_get_obj().rc)) {
if (unlikely(_get_obj().rc->decrement())) {
memdelete(_get_obj().rc);
}
}
#endif
*reinterpret_cast<ObjData *>(_data._mem) = p_variant._get_obj(); *reinterpret_cast<ObjData *>(_data._mem) = p_variant._get_obj();
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
if (_get_obj().rc) { if (likely(_get_obj().rc)) {
_get_obj().rc->increment(); _get_obj().rc->increment();
} }
#endif #endif