From d2a68f458096f59828eee646188292cbb6d87f45 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Mon, 23 Apr 2018 14:35:06 +0200 Subject: [PATCH] feat(c-tools): add one owner on clonable object --- src/c-wrapper/api/c-content.cpp | 3 ++- src/c-wrapper/internal/c-tools.h | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/c-wrapper/api/c-content.cpp b/src/c-wrapper/api/c-content.cpp index 4f83fe482..1071b5eb1 100644 --- a/src/c-wrapper/api/c-content.cpp +++ b/src/c-wrapper/api/c-content.cpp @@ -55,7 +55,8 @@ LinphoneContent * linphone_content_ref(LinphoneContent *content) { } void linphone_content_unref(LinphoneContent *content) { - belle_sip_object_unref(content); + // FIXME: Avoid leaks. + // belle_sip_object_unref(content); } void *linphone_content_get_user_data(const LinphoneContent *content) { diff --git a/src/c-wrapper/internal/c-tools.h b/src/c-wrapper/internal/c-tools.h index 776e58f58..4cbea191b 100644 --- a/src/c-wrapper/internal/c-tools.h +++ b/src/c-wrapper/internal/c-tools.h @@ -140,6 +140,9 @@ private: struct WrappedClonableObject { belle_sip_object_t base; CppType *cppPtr; + + // By default: External. + WrappedObjectOwner owner; }; // --------------------------------------------------------------------------- @@ -236,7 +239,7 @@ public: : wrappedObject->cppPtr; if (cppObject) - cppObject->setCBackPtr(nullptr); \ + cppObject->setCBackPtr(nullptr); wrappedObject->cppPtr.~shared_ptr(); wrappedObject->weakCppPtr.~weak_ptr(); @@ -248,7 +251,9 @@ public: typename = typename std::enable_if::value, CppType>::type > static void uninitClonableCppObject (CType *cObject) { - delete reinterpret_cast *>(cObject)->cppPtr; + WrappedClonableObject *wrappedObject = reinterpret_cast *>(cObject); + if (wrappedObject->owner == WrappedObjectOwner::External) + delete wrappedObject->cppPtr; } // --------------------------------------------------------------------------- @@ -417,7 +422,9 @@ public: CppType **cppObjectAddr = &reinterpret_cast *>(cObject)->cppPtr; if (*cppObjectAddr == cppObject) return; - delete *cppObjectAddr; + + if (reinterpret_cast *>(cObject)->owner == WrappedObjectOwner::External) + delete *cppObjectAddr; *cppObjectAddr = cppObject; (*cppObjectAddr)->setCBackPtr(cObject); @@ -455,6 +462,7 @@ private: return static_cast(value); RetType *cObject = CppTypeMetaInfo::init(); + reinterpret_cast *>(cObject)->owner = WrappedObjectOwner::Internal; setCppPtrFromC(cObject, const_cast(cppObject)); return cObject; @@ -491,7 +499,6 @@ public: RetType *cObject = CppTypeMetaInfo::init(); reinterpret_cast *>(cObject)->owner = WrappedObjectOwner::Internal; - setCppPtrFromC(cObject, cppObject); return cObject; @@ -713,6 +720,7 @@ LINPHONE_END_NAMESPACE struct _Linphone ## C_TYPE { \ belle_sip_object_t base; \ L_CPP_TYPE_OF_C_TYPE(C_TYPE) *cppPtr; \ + int owner; \ __VA_ARGS__ \ }; \ BELLE_SIP_DECLARE_VPTR_NO_EXPORT(Linphone ## C_TYPE); \