diff --git a/src/c-wrapper/internal/c-tools.h b/src/c-wrapper/internal/c-tools.h index 2fbaa2940..0b94a1681 100644 --- a/src/c-wrapper/internal/c-tools.h +++ b/src/c-wrapper/internal/c-tools.h @@ -210,6 +210,19 @@ private: } public: + // --------------------------------------------------------------------------- + // Back ptr reset, used by uninit c object function. + // --------------------------------------------------------------------------- + + template< + typename CppType, + typename = typename std::enable_if::value, CppType>::type + > + static void resetCBackPtr (const std::shared_ptr &cppObject) { + if (cppObject) + cppObject->setCBackPtr(nullptr); + } + // --------------------------------------------------------------------------- // Belle sip handlers. // Deal with floating references. @@ -331,11 +344,7 @@ public: typename = typename std::enable_if::value, CppType>::type > static L_INTERNAL_WRAPPER_CONSTEXPR const CppType *getCppPtrFromC (const CType *cObject) { - #ifdef DEBUG - return getCppPtrFromC(const_cast(cObject)); - #else - return reinterpret_cast *>(cObject)->cppPtr; - #endif + return getCppPtrFromC(const_cast(cObject)); } // --------------------------------------------------------------------------- @@ -580,6 +589,12 @@ LINPHONE_END_NAMESPACE } \ static void _linphone_ ## C_TYPE ## _uninit(Linphone ## C_TYPE * object) { \ DESTRUCTOR(object); \ + { \ + std::shared_ptr wrappedObject = object->weakCppPtr.lock(); \ + if (!wrappedObject) \ + wrappedObject = object->cppPtr; \ + LinphonePrivate::Wrapper::resetCBackPtr(wrappedObject); \ + } \ object->cppPtr.~shared_ptr(); \ object->weakCppPtr.~weak_ptr(); \ } \