From aab81fe7edf31f147a1185a8edbe361440f33a4c Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 24 Apr 2018 17:04:59 +0200 Subject: [PATCH] fix(c-wrapper): deal with internal cpp ptr destructions (on clonable) --- src/c-wrapper/internal/c-tools.h | 16 +++++++++++----- src/object/base-object.cpp | 4 +--- src/object/clonable-object.cpp | 2 ++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/c-wrapper/internal/c-tools.h b/src/c-wrapper/internal/c-tools.h index aef5f9183..492cbaccf 100644 --- a/src/c-wrapper/internal/c-tools.h +++ b/src/c-wrapper/internal/c-tools.h @@ -293,12 +293,22 @@ public: typename CppType, typename = typename std::enable_if::value, CppType>::type > - static void signalCppPtrDestruction (CppType *cppObject) { + static void handleObjectDestruction (CppType *cppObject) { void *value = cppObject->getCBackPtr(); if (value && static_cast *>(value)->owner == WrappedObjectOwner::Internal) belle_sip_object_unref(value); } + template< + typename CppType, + typename = typename std::enable_if::value, CppType>::type + > + static void handleClonableObjectDestruction (CppType *cppObject) { + void *value = cppObject->getCBackPtr(); + if (value && static_cast *>(value)->owner == WrappedObjectOwner::Internal) + belle_sip_object_unref(value); + } + // --------------------------------------------------------------------------- // Get c/cpp ptr helpers. // --------------------------------------------------------------------------- @@ -771,10 +781,6 @@ LINPHONE_END_NAMESPACE // Call the init function of wrapped C object. #define L_INIT(C_TYPE) _linphone_ ## C_TYPE ## _init() -// Signal to wrapper the destruction of cpp base object. -#define L_SIGNAL_CPP_PTR_DESTRUCTION(CPP_OBJECT) \ - LinphonePrivate::Wrapper::signalCppPtrDestruction(CPP_OBJECT); - // Get/set the cpp-ptr of a wrapped C object. #define L_GET_CPP_PTR_FROM_C_OBJECT_1_ARGS(C_OBJECT) \ LinphonePrivate::Wrapper::getCppPtrFromC(C_OBJECT) diff --git a/src/object/base-object.cpp b/src/object/base-object.cpp index ebedc602a..7ef6e2b22 100644 --- a/src/object/base-object.cpp +++ b/src/object/base-object.cpp @@ -19,8 +19,6 @@ #include "base-object-p.h" #include "base-object.h" - -// Necessary for: L_SIGNAL_CPP_PTR_DESTRUCTION. #include "c-wrapper/internal/c-tools.h" // ============================================================================= @@ -34,7 +32,7 @@ BaseObject::BaseObject (BaseObjectPrivate &p) : mPrivate(&p) { } BaseObject::~BaseObject () { - L_SIGNAL_CPP_PTR_DESTRUCTION(this); + Wrapper::handleObjectDestruction(this); delete mPrivate; } diff --git a/src/object/clonable-object.cpp b/src/object/clonable-object.cpp index 38d1bba37..5c6ce7f4a 100644 --- a/src/object/clonable-object.cpp +++ b/src/object/clonable-object.cpp @@ -17,6 +17,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#include "c-wrapper/internal/c-tools.h" #include "clonable-object-p.h" #include "clonable-object.h" @@ -43,6 +44,7 @@ ClonableObject::ClonableObject (ClonableObjectPrivate &p) { } while (false); ClonableObject::~ClonableObject () { + Wrapper::handleClonableObjectDestruction(this); UNREF(); }