diff -Nru dtkcore-5.4.20/debian/changelog dtkcore-5.5.17.1/debian/changelog --- dtkcore-5.4.20/debian/changelog 2021-09-17 07:18:30.000000000 +0000 +++ dtkcore-5.5.17.1/debian/changelog 2021-09-18 07:48:34.000000000 +0000 @@ -1,3 +1,9 @@ +dtkcore (5.5.17.1-1) impish; urgency=medium + + * New upstream release. + + -- Arun Kumar Pariyar Sat, 18 Sep 2021 13:33:34 +0545 + dtkcore (5.4.20-1ubuntu1) impish; urgency=medium * Re-upload. diff -Nru dtkcore-5.4.20/debian/rules dtkcore-5.5.17.1/debian/rules --- dtkcore-5.4.20/debian/rules 2021-01-05 12:07:19.000000000 +0000 +++ dtkcore-5.5.17.1/debian/rules 2021-09-18 07:48:34.000000000 +0000 @@ -17,9 +17,18 @@ # Retrieve version info include /usr/share/dpkg/default.mk +VERSION = $(DEB_VERSION_UPSTREAM) +_PACK_VER = $(shell echo $(VERSION) | awk -F'[+_~-]' '{print $$1}') +_BUILD_VER = $(shell echo $(VERSION) | awk -F'[+_~-]' '{print $$2}' | sed 's/[^0-9]//g') +ifeq ($(_BUILD_VER),) + CONFIG_VERSION = $(_PACK_VER) +else + CONFIG_VERSION = $(_PACK_VER).$(_BUILD_VER) +endif + %: dh $@ override_dh_auto_configure: - dh_auto_configure -- LIB_INSTALL_DIR=/usr/lib/$(DEB_HOST_MULTIARCH) VERSION=$(DEB_VERSION_UPSTREAM) + dh_auto_configure -- LIB_INSTALL_DIR=/usr/lib/$(DEB_HOST_MULTIARCH) VERSION=$(VERSION) diff -Nru dtkcore-5.4.20/dtk_build_config.prf dtkcore-5.5.17.1/dtk_build_config.prf --- dtkcore-5.4.20/dtk_build_config.prf 2021-07-27 03:14:17.000000000 +0000 +++ dtkcore-5.5.17.1/dtk_build_config.prf 1970-01-01 00:00:00.000000000 +0000 @@ -1,79 +0,0 @@ -isEmpty(DTK_MODULE_NAME): error(set DTK_MODULE_NAME first) -!contains(DTK_MODULE_NAME, ^dtk[a-z0-9]+$): error(The format of the value of DTK_MODULE_NAME is incorrect. eg: dtk[a-z0-9]+) -!isEqual(DTK_MODULE_NAME, dtkcore):!contains(QT, dtkcore): error(QT += dtkcore first) - -#将首字母改为大写 -defineReplace(capitalizingString) { - RAW=$$1 - FIRST = $$upper($$section(RAW, "", 1, 1)) - OTHERS = $$section(RAW, "", 2, -1) - return($$FIRST$$OTHERS) -} - -defineTest(checkDtkVersion) { - isEmpty(VERSION) { - !isEqual(DTK_MODULE_NAME, dtkcore) { - VERSION = $${QT.dtkcore.VERSION} - } - - # TODO: failed in windows - isEmpty(VERSION): VERSION = $$system(git describe --tags --abbrev=0) - isEmpty(VERSION): VERSION = $$DTK_VERSION - isEmpty(VERSION): return(false) - VERSION = $$replace(VERSION, [^0-9.],) - } - - export(VERSION) - return(true) -} - -!checkDtkVersion():error("check dtk version failed") - -message("build dtk with version $$VERSION") -ver_list = $$split(VERSION, .) - -isEmpty(VER_MAJ) { - VER_MAJ = $$format_number($$first(ver_list), ibase=10) -} -isEmpty(VER_MIN) { - VER_MIN = $$format_number($$member(ver_list, 1, 1), ibase=10) - isEmpty(VER_MIN):VER_MIN = 0 -} -isEmpty(VER_PAT) { - VER_PAT = $$format_number($$member(ver_list, 2, 2), ibase=10) - isEmpty(VER_PAT):VER_PAT = 0 -} -isEmpty(VER_BUI) { - VER_BUI = $$member(ver_list, 3, 3) - # fix VER_BUI=009, invalid digit "9" in octal constant error - VER_BUI = $$format_number($$VER_BUI, ibase=10) - isEmpty(VER_BUI):VER_BUI = 0 -} - -isEmpty(PREFIX){ - PREFIX = /usr -} - -isEmpty(LIB_INSTALL_DIR) { - isEqual(DTK_MODULE_NAME, dtkcore) { - LIB_INSTALL_DIR=$$PREFIX/lib - } else { - LIB_INSTALL_DIR=$${QT.dtkcore.libs} - } -} - -LIB_VERSION_NAME = libdtk-$${VER_MAJ}.$${VER_MIN}.$${VER_PAT} -MODULE_NAME = $$upper($$member($$list($$split(DTK_MODULE_NAME,)), 3, 3))$$join($$list($$member($$list($$split(DTK_MODULE_NAME,)), 4, -1))) -DMODULE_NAME = D$${MODULE_NAME} - -isEmpty(TOOL_INSTALL_DIR) { - TOOL_INSTALL_DIR=$$LIB_INSTALL_DIR/$$LIB_VERSION_NAME/$$DMODULE_NAME/bin -} - -isEmpty(INCLUDE_INSTALL_DIR) { - isEqual(DTK_MODULE_NAME, dtkcore) { - INCLUDE_INSTALL_DIR = $$PREFIX/include/$$LIB_VERSION_NAME/$$DMODULE_NAME - } else { - INCLUDE_INSTALL_DIR = $${QT.dtkcore.includes}/../$$DMODULE_NAME - } -} diff -Nru dtkcore-5.4.20/.gitignore dtkcore-5.5.17.1/.gitignore --- dtkcore-5.4.20/.gitignore 2021-07-27 03:14:17.000000000 +0000 +++ dtkcore-5.5.17.1/.gitignore 2021-06-29 09:15:40.000000000 +0000 @@ -27,3 +27,5 @@ bin/ .qmake* Makefile + +cmake/DtkCore* diff -Nru dtkcore-5.4.20/.qmake.conf dtkcore-5.5.17.1/.qmake.conf --- dtkcore-5.4.20/.qmake.conf 2021-07-27 03:14:17.000000000 +0000 +++ dtkcore-5.5.17.1/.qmake.conf 2021-06-29 09:15:40.000000000 +0000 @@ -1,2 +1,5 @@ -isEmpty(DTK_VERSION):DTK_VERSION=5.0.0 -DTK_MODULE_NAME=dtkcore +DTK_VERSION=5.5.0 +ver_list = $$split(DTK_VERSION, .) +V1 = $$first(ver_list) +V2 = $$member(ver_list, 1, 1) +DTK_MODULE_NAME=dtkcore$${V1}.$${V2} diff -Nru dtkcore-5.4.20/src/dsysinfo.cpp dtkcore-5.5.17.1/src/dsysinfo.cpp --- dtkcore-5.4.20/src/dsysinfo.cpp 2021-07-27 03:14:17.000000000 +0000 +++ dtkcore-5.5.17.1/src/dsysinfo.cpp 2021-06-29 09:15:40.000000000 +0000 @@ -476,6 +476,9 @@ void DSysInfoPrivate::ensureComputerInfo() { + if (memoryAvailableSize >= 0) + return; + #ifdef Q_OS_LINUX struct utsname u; if (uname(&u) == 0) diff -Nru dtkcore-5.4.20/src/dtk_cmake.prf dtkcore-5.5.17.1/src/dtk_cmake.prf --- dtkcore-5.4.20/src/dtk_cmake.prf 2021-07-27 03:14:17.000000000 +0000 +++ dtkcore-5.5.17.1/src/dtk_cmake.prf 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -# CMake configure - -#TODO: check cmake exist - -!win*: { -MODULE_DEPENDS=$$find(QT, dtk*) -CMAKE_MODULE_DEPENDS=$$replace(MODULE_DEPENDS,"dtk","") - -CMAKE_MODULE=Dtk$$MODULE_NAME -WORK_DIR=$$_PRO_FILE_PWD_ - -message("config cmake module: $$CMAKE_MODULE") - -MODULE_PRI_CONT = "" -LINK_LIBRARIES = "" - -for(MODULE_DEPEND, CMAKE_MODULE_DEPENDS) { - MODULE_DEPEND=$$capitalizingString($$MODULE_DEPEND) - CMAKE_CONTENT += "find_package(Dtk REQUIRED $$MODULE_DEPEND)" - LINK_LIBRARIES += " ${Dtk$${MODULE_DEPEND}_LIBRARIES}" -} - -CMAKE_MODULE_INCLUDE_DIR=$$upper($${CMAKE_MODULE})_INCLUDE_DIR -INC_DIR = $$replace(INCLUDE_INSTALL_DIR, "/", "/") - -CMAKE_MODULE_TOO_DIR=$$upper($${CMAKE_MODULE})_TOOL_DIR -TOOL_DIR = $$TOOL_INSTALL_DIR - -CMAKE_CONTENT += "set($${CMAKE_MODULE_INCLUDE_DIR} $${INC_DIR})" -CMAKE_CONTENT += "set($${CMAKE_MODULE_TOO_DIR} $${TOOL_DIR})" -CMAKE_CONTENT += "set($${CMAKE_MODULE}_LIBRARIES $$TARGET$$LINK_LIBRARIES)" -CMAKE_CONTENT += "include_directories(\"${"$${CMAKE_MODULE_INCLUDE_DIR}"}\")" - -CMAKE_DIR=$$WORK_DIR/../cmake/$${CMAKE_MODULE} -CMAKE_PATH=$$CMAKE_DIR/$${CMAKE_MODULE}Config.cmake -mkpath($$CMAKE_DIR) -message("write cmake file to $$CMAKE_PATH") -write_file($$CMAKE_PATH, CMAKE_CONTENT) | error("Aborting.") - -cmake_config.files = $$WORK_DIR/../cmake -cmake_config.path = $$LIB_INSTALL_DIR - -INSTALLS += cmake_config -} diff -Nru dtkcore-5.4.20/src/dtkcore_global.cpp dtkcore-5.5.17.1/src/dtkcore_global.cpp --- dtkcore-5.4.20/src/dtkcore_global.cpp 1970-01-01 00:00:00.000000000 +0000 +++ dtkcore-5.5.17.1/src/dtkcore_global.cpp 2021-06-29 09:15:40.000000000 +0000 @@ -0,0 +1,54 @@ +#include "dtkcore_global.h" +#include +#include + +#if (!defined DTK_VERSION) || (!defined DTK_VERSION_STR) +#error "DTK_VERSION or DTK_VERSION_STR not defined!" +#endif + +void doubleLoadCheck() +{ + QFile f("/proc/self/maps"); + if (!f.open(QIODevice::ReadOnly)) + qFatal("%s", f.errorString().toLocal8Bit().data()); + + const QByteArray &data = f.readAll(); + QTextStream ts(data); + QString modulePath; + while (Q_UNLIKELY(!ts.atEnd())) { + const QString line = ts.readLine(); + const QStringList &maps = line.split(' ', QString::SplitBehavior::SkipEmptyParts); + if (Q_UNLIKELY(maps.size() < 6)) + continue; + + QFileInfo info(maps.value(5)); + const QString &infoAbPath = info.absoluteFilePath(); + if (modulePath == infoAbPath || !info.fileName().contains("dtkcore")) + continue; + + if (modulePath.isEmpty()) { + modulePath = infoAbPath; + } else { + // modulePath != infoAbPath + QByteArray msg; + msg += modulePath + " and " + info.absoluteFilePath() + " both loaded"; + qFatal("%s", msg.data()); + } + } +} + +// 在库被加载时就执行此函数 +__attribute__((constructor)) void init() +{ + doubleLoadCheck(); +} + +int dtkVersion() +{ + return DTK_VERSION; +} + +const char *dtkVersionString() +{ + return DTK_VERSION_STR; +} diff -Nru dtkcore-5.4.20/src/dtkcore_global.h dtkcore-5.5.17.1/src/dtkcore_global.h --- dtkcore-5.4.20/src/dtkcore_global.h 2021-07-27 03:14:17.000000000 +0000 +++ dtkcore-5.5.17.1/src/dtkcore_global.h 2021-06-29 09:15:40.000000000 +0000 @@ -18,7 +18,6 @@ #pragma once #include - #include #define DTK_NAMESPACE Dtk @@ -67,3 +66,8 @@ #define DTK_VERSION_CHECK(major, minor, patch, build) ((major<<24)|(minor<<16)|(patch<<8)|build) #define DTK_VERSION DTK_VERSION_CHECK(DTK_VERSION_MAJOR, DTK_VERSION_MINOR, DTK_VERSION_PATCH, DTK_VERSION_BUILD) + +extern "C" { +int LIBDTKCORESHARED_EXPORT dtkVersion(); +const LIBDTKCORESHARED_EXPORT char *dtkVersionString(); +} diff -Nru dtkcore-5.4.20/src/dtk_module.prf dtkcore-5.5.17.1/src/dtk_module.prf --- dtkcore-5.4.20/src/dtk_module.prf 2021-07-27 03:14:17.000000000 +0000 +++ dtkcore-5.5.17.1/src/dtk_module.prf 1970-01-01 00:00:00.000000000 +0000 @@ -1,127 +0,0 @@ -isEmpty(DTK_BUILD): error("Please load(dtk_build) first!") - -# ----------------------- -# Config Qt module -MODULE_ID=$$DTK_MODULE_NAME -mod_inst_pfx=$$_PRO_FILE_PWD_ -MODULE_PRI = $$mod_inst_pfx/qt_lib_$${MODULE_ID}.pri -module_libs = $$LIB_INSTALL_DIR -module_tools = $$TOOL_INSTALL_DIR -MODULE_INCLUDES = $$INCLUDE_INSTALL_DIR -MODULE_DEPENDS=$$find(QT, dtk*) - -message("config qt module: $$MODULE_ID") -message("write $$MODULE_PRI to: $$mod_inst_pfx") - -internal_module: \ - MODULE_DEPENDS = $$replace(QT, -private$, _private) -else: \ - MODULE_DEPENDS = $$replace(QT, -private$, ) -MODULE_DEPENDS = $$unique(MODULE_DEPENDS) -contains(MODULE_DEPENDS, $$MODULE): \ - error("$$MODULE_ID depends on itself.") - -# Create a module .pri file -module_libs=$$LIB_INSTALL_DIR -isEmpty(module_libs) { -host_build: \ - module_libs = "\$\$QT_MODULE_HOST_LIB_BASE" -else: \ - module_libs = "\$\$QT_MODULE_LIB_BASE" -} - -# In addition to the library's private deps, the private module's deps -# are logically runtime deps of the public module. -runtime_deps = $$QT_PRIVATE $$QT_FOR_PRIVATE -!isEmpty(runtime_deps): \ - module_rundep = "QT.$${MODULE_ID}.run_depends = $$replace(runtime_deps, -private$, _private)" -else: \ - module_rundep = -module_build_type = v2 -static: \ - module_build_type += staticlib -lib_bundle { - module_build_type += lib_bundle - MODULE_FRAMEWORKS = " \$\$QT_MODULE_LIB_BASE" -} -internal_module: \ - module_build_type += internal_module -ltcg: \ - module_build_type += ltcg -module_module = -!equals(TEMPLATE, aux) { - module_module = $$MODULE_ID$$QT_LIBINFIX - !lib_bundle: module_module ~= s,^Qt,Qt$$QT_MAJOR_VERSION, -} -!isEmpty(MODULE_CONFIG): \ - module_config = "QT.$${MODULE_ID}.CONFIG = $$MODULE_CONFIG" -else: \ - module_config = -!isEmpty(MODULE_PLUGIN_TYPES): \ - module_plugtypes = "QT.$${MODULE_ID}.plugin_types = $$replace(MODULE_PLUGIN_TYPES, /.*$, )" -else: \ - module_plugtypes = -!isEmpty(MODULE_MASTER_HEADER): \ - module_master = "QT.$${MODULE_ID}.master_header = $$MODULE_MASTER_HEADER" -else: \ - module_master = - -MODULE_PRI_CONT = \ - "QT.$${MODULE_ID}.VERSION = $${VERSION}" \ - "QT.$${MODULE_ID}.MAJOR_VERSION = $${VER_MAJ}" \ - "QT.$${MODULE_ID}.MINOR_VERSION = $${VER_MIN}" \ - "QT.$${MODULE_ID}.PATCH_VERSION = $${VER_PAT}" \ - "" \ - "QT.$${MODULE_ID}.name = $${MODULE_ID}" \ - "QT.$${MODULE_ID}.module = $$module_module" \ - "QT.$${MODULE_ID}.tools = $$module_tools" \ - "QT.$${MODULE_ID}.libs = $$module_libs" \ - $$module_master \ - "QT.$${MODULE_ID}.includes = $$MODULE_INCLUDES" \ - "QT.$${MODULE_ID}.frameworks =$$MODULE_FRAMEWORKS" - -MODULE_PRI_CONT += \ - "QT.$${MODULE_ID}.depends =$$join(MODULE_DEPENDS, " ", " ")" \ - $$module_rundep \ - "QT.$${MODULE_ID}.module_config =$$join(module_build_type, " ", " ")" \ - $$module_config \ - "QT.$${MODULE_ID}.DEFINES = $$val_escape(MODULE_DEFINES)" \ - "" \ - "QT_MODULES += $$MODULE" - -write_file($$MODULE_PRI, MODULE_PRI_CONT)|error("Aborting.") - -qt_module.files = $$MODULE_PRI - -isEmpty(MKSPECS_INSTALL_DIR) { - MKSPECS_INSTALL_DIR=$$[QT_INSTALL_ARCHDATA]/mkspecs -} -qt_module.path = $${MKSPECS_INSTALL_DIR}/modules - -INSTALLS += qt_module - -PKG_MODULE_DEPENDS=$$find(QT, dtk*) - -#不能添加Qt包的依赖,无法单纯的从Qt模块名称获取其pkgconfig的pc文件名 -#for (qt_module, QT) { -# #DBus模块需要特殊处理 -# isEqual(qt_module, "dbus") { -# PKG_MODULE_DEPENDS+=Qt5DBus -# } else { -# suffix = $$str_member($$qt_module, -7, -1) -# #排除以private结尾的模块 -# !isEqual(suffix, "private"): PKG_MODULE_DEPENDS+=Qt5$$capitalizingString($$qt_module) -# } -#} - -PKG_MODULE_DEPENDS = $$unique(PKG_MODULE_DEPENDS) - -# ----------------------- -# Config pkg-config -QMAKE_PKGCONFIG_VERSION = $$VERSION -QMAKE_PKGCONFIG_DESTDIR = pkgconfig -QMAKE_PKGCONFIG_NAME = $$upper($$MODULE_ID) -QMAKE_PKGCONFIG_DESCRIPTION = Deepin Tool Kit $$MODULE_ID header files -QMAKE_PKGCONFIG_REQUIRES += $$join(PKG_MODULE_DEPENDS, ", ") -QMAKE_PKGCONFIG_INCDIR = $$includes.path -QMAKE_PKGCONFIG_LIBDIR = $$target.path diff -Nru dtkcore-5.4.20/src/log/LogManager.cpp dtkcore-5.5.17.1/src/log/LogManager.cpp --- dtkcore-5.4.20/src/log/LogManager.cpp 2021-07-27 03:14:17.000000000 +0000 +++ dtkcore-5.5.17.1/src/log/LogManager.cpp 2021-06-29 09:15:40.000000000 +0000 @@ -31,7 +31,7 @@ DLogManager::DLogManager() { #if !defined(QT_DEBUG) && !defined(QT_MESSAGELOGCONTEXT) - m_format = "%{time}{yyyy-MM-dd, HH:mm:ss.zzz} [%{type:-7}] %{message}\n"; + m_format = "%{time}{yyyy-MM-dd, HH:mm:ss.zzz} %{message}\n"; #else m_format = "%{time}{yyyy-MM-dd, HH:mm:ss.zzz} [%{type:-7}] [%{file:-20} %{function:-35} %{line}] %{message}\n"; #endif diff -Nru dtkcore-5.4.20/src/src.pro dtkcore-5.5.17.1/src/src.pro --- dtkcore-5.4.20/src/src.pro 2021-07-27 03:14:17.000000000 +0000 +++ dtkcore-5.5.17.1/src/src.pro 2021-06-29 09:15:40.000000000 +0000 @@ -18,7 +18,8 @@ SOURCES += \ dsysinfo.cpp \ dsecurestring.cpp \ - ddesktopentry.cpp + ddesktopentry.cpp \ + dtkcore_global.cpp include($$PWD/base/base.pri) include($$PWD/util/util.pri) @@ -52,3 +53,11 @@ #qt module load(dtk_module) + +# 支持上游一包多依赖 +load(dtk_multiversion) +# 5.5 5.6可通过重复调用此函数,来增加对更多版本的支持 +dtkBuildMultiVersion(5.5) + +# INSTALL变量增加多版本下的配置文件 +load(dtk_install_multiversion) diff -Nru dtkcore-5.4.20/src/util/dvtablehook.cpp dtkcore-5.5.17.1/src/util/dvtablehook.cpp --- dtkcore-5.4.20/src/util/dvtablehook.cpp 2021-07-27 03:14:17.000000000 +0000 +++ dtkcore-5.5.17.1/src/util/dvtablehook.cpp 2021-06-29 09:15:40.000000000 +0000 @@ -161,7 +161,7 @@ return; typedef void(*Destruct)(const void*); - Destruct destruct = *reinterpret_cast(&fun); + Destruct destruct = reinterpret_cast(fun); // call origin destruct function destruct(obj); diff -Nru dtkcore-5.4.20/src/util/dvtablehook.h dtkcore-5.5.17.1/src/util/dvtablehook.h --- dtkcore-5.4.20/src/util/dvtablehook.h 2021-07-27 03:14:17.000000000 +0000 +++ dtkcore-5.5.17.1/src/util/dvtablehook.h 2021-06-29 09:15:40.000000000 +0000 @@ -28,6 +28,7 @@ #include #include +#include DCORE_BEGIN_NAMESPACE @@ -172,7 +173,8 @@ typedef QtPrivate::List Arguments; }; template - static bool overrideVfptrFun(quintptr *vfptr_t1, Fun1 fun1, Fun2 fun2, bool forceWrite) + static typename std::enable_if::ArgumentCount >= 0, bool>::type + overrideVfptrFun(quintptr *vfptr_t1, Fun1 fun1, Fun2 fun2, bool forceWrite) { typedef QtPrivate::FunctionPointer FunInfo1; typedef QtPrivate::FunctionPointer FunInfo2; @@ -201,6 +203,52 @@ return true; } + template struct StdFunWrap {}; + template + struct StdFunWrap { + typedef std::function StdFunType; + static inline StdFunType fun(StdFunType f, bool check = true) { + static StdFunType fun = f; + static bool initialized = false; + if (initialized && check) { + qWarning("The StdFunWrap is dirty! Don't use std::bind(use lambda functions)."); + } + initialized = true; + return fun; + } + static Ret call(Obj *o, Args... args) { + return fun(call, false)(o, std::forward(args)...); + } + }; + template + struct StdFunWrap : StdFunWrap{}; + + template + static inline typename std::enable_if::ArgumentCount == -1, bool>::type + overrideVfptrFun(quintptr *vfptr_t1, Fun1 fun1, Fun2 fun2, bool forceWrite) + { + typedef QtPrivate::FunctionPointer FunInfo1; + const int FunctorArgumentCount = QtPrivate::ComputeFunctorArgumentCount::Arguments>::Value; + + Q_STATIC_ASSERT_X((FunctorArgumentCount >= 0), + "Function1 and Function2 arguments are not compatible."); + const int Fun2ArgumentCount = (FunctorArgumentCount >= 0) ? FunctorArgumentCount : 0; + typedef typename QtPrivate::FunctorReturnType::Arguments, Fun2ArgumentCount>::Value>::Value Fun2ReturnType; + + Q_STATIC_ASSERT_X((QtPrivate::AreArgumentsCompatible::value), + "Function1 and Function2 return type are not compatible."); + + StdFunWrap::fun(fun2); + return overrideVfptrFun(vfptr_t1, fun1, StdFunWrap::call, forceWrite); + } + + /*! + * \fn template static bool overrideVfptrFun(const typename QtPrivate::FunctionPointer::Object *t1, Fun1 fun1, Fun2 fun2) + * + * \note 重载多继承类中的多个虚函数时,fun1务必标记成一个类名的函数。否则可能出现内存泄露的情况 + * \note 例如 class A 继承于 B,C,D,当需要重载B中的foo1,C中的foo2时,以下函数的fun1需要统一标记为&A::foo1和&A::foo2 + * \note 因为如果分开写为&B::foo1和&C::foo2的话,指针转换内部会记录多张虚表,重载多份析构函数,可能导致最开始的部分无法正常析构! + */ template static bool overrideVfptrFun(const typename QtPrivate::FunctionPointer::Object *t1, Fun1 fun1, Fun2 fun2) { diff -Nru dtkcore-5.4.20/tests/main.cpp dtkcore-5.5.17.1/tests/main.cpp --- dtkcore-5.4.20/tests/main.cpp 2021-07-27 03:14:17.000000000 +0000 +++ dtkcore-5.5.17.1/tests/main.cpp 2021-06-29 09:15:40.000000000 +0000 @@ -18,10 +18,20 @@ #include "ut_dutil.h" #include +#ifdef QT_DEBUG +#include +#endif + int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); + int ret = RUN_ALL_TESTS(); + +#ifdef QT_DEBUG + __sanitizer_set_report_path("asan.log"); +#endif + + return ret; } diff -Nru dtkcore-5.4.20/tests/test-recoverage-qmake.sh dtkcore-5.5.17.1/tests/test-recoverage-qmake.sh --- dtkcore-5.4.20/tests/test-recoverage-qmake.sh 2021-07-27 03:14:17.000000000 +0000 +++ dtkcore-5.5.17.1/tests/test-recoverage-qmake.sh 2021-06-29 09:15:40.000000000 +0000 @@ -7,17 +7,16 @@ rm -rf $BUILD_DIR mkdir $BUILD_DIR cd $BUILD_DIR -qmake .. -make +qmake .. CONFIG+=debug +make -j$(nproc) cd ../tests/ rm -rf $BUILD_DIR mkdir $BUILD_DIR cd $BUILD_DIR - qmake ../ CONFIG+=debug export ASAN_OPTIONS=halt_on_error=0 -TESTARGS="--gtest_output=xml:dde_test_report_dtkcore.xml" make check -j$(nproc) +make check -j$(nproc) lcov -d ./ -c -o coverage_all.info #lcov --extract coverage_all.info $EXTRACT_ARGS --output-file coverage.info @@ -28,5 +27,5 @@ #rm -rf $BUILD_DIR #rm -rf ../$BUILD_DIR -test -e ./build/asan.log* && mv ./build/asan.log* ./build/asan_dtkcore.log || touch ./build/asan.log +test -e ./build/asan.log* && mv ./build/asan.log* ./build/asan_dtkcore.log || echo "Not detected any memory leak." diff -Nru dtkcore-5.4.20/tests/tests.pro dtkcore-5.5.17.1/tests/tests.pro --- dtkcore-5.4.20/tests/tests.pro 2021-07-27 03:14:17.000000000 +0000 +++ dtkcore-5.5.17.1/tests/tests.pro 2021-06-29 09:15:40.000000000 +0000 @@ -5,6 +5,13 @@ QMAKE_LFLAGS += -Wl,--export-dynamic +CONFIG(debug, debug|release) { +LIBS += -lgtest -lgmock +QMAKE_CXXFLAGS += -g -Wall -fprofile-arcs -ftest-coverage -fsanitize=address -fsanitize-recover=address -O2 +QMAKE_LFLAGS += -g -Wall -fprofile-arcs -ftest-coverage -fsanitize=address -fsanitize-recover=address -O2 +QMAKE_CXX += -g -fprofile-arcs -ftest-coverage -fsanitize=address -fsanitize-recover=address -O2 +} + load(dtk_testcase) # 指定moc文件生成目录和src一样 diff -Nru dtkcore-5.4.20/tests/ut_dthreadutils.cpp dtkcore-5.5.17.1/tests/ut_dthreadutils.cpp --- dtkcore-5.4.20/tests/ut_dthreadutils.cpp 2021-07-27 03:14:17.000000000 +0000 +++ dtkcore-5.5.17.1/tests/ut_dthreadutils.cpp 2021-06-29 09:15:40.000000000 +0000 @@ -46,12 +46,43 @@ auto fe = QtConcurrent::run([] { ASSERT_TRUE(DThreadUtil::runInMainThread([](QThread *thread) -> bool { return QThread::currentThread() == QCoreApplication::instance()->thread() && QThread::currentThread() != thread; - }, QThread::currentThread())); + }, + QThread::currentThread())); }); ASSERT_TRUE(QTest::qWaitFor([&] { return fe.isFinished(); })); + + { + // 测试target对象销毁后是否还会触发函数调用 + QPointer object = new QObject(); + bool test = true; + auto result1 = QtConcurrent::run([&test, object] { + test = DThreadUtil::runInMainThread(object, [object]() -> bool { + if (!object) + return false; + + delete object.data(); + return true; + }); + }); + auto result2 = QtConcurrent::run([&test, object] { + test = DThreadUtil::runInMainThread(object, [object]() -> bool { + if (!object) + return false; + + delete object.data(); + return true; + }); + }); + + ASSERT_TRUE(QTest::qWaitFor([&] { + return result1.isFinished() && result2.isFinished(); + })); + + ASSERT_TRUE(!test); + } } class ut_DThreadUtils : public testing::Test diff -Nru dtkcore-5.4.20/tests/ut_dvtablehook.cpp dtkcore-5.5.17.1/tests/ut_dvtablehook.cpp --- dtkcore-5.4.20/tests/ut_dvtablehook.cpp 2021-07-27 03:14:17.000000000 +0000 +++ dtkcore-5.5.17.1/tests/ut_dvtablehook.cpp 2021-06-29 09:15:40.000000000 +0000 @@ -64,6 +64,7 @@ } virtual void SetUp(); virtual void TearDown(); + virtual ~ut_DVtableHook() {} }; void ut_DVtableHook::SetUp() { @@ -81,6 +82,12 @@ return true; } +static bool test2(A *obj, int v, bool v2) +{ + qDebug() << Q_FUNC_INFO << obj << v << v2; + return v2; +} + TEST_F(ut_DVtableHook, objectFun2ObjectFun) { A *a = new A(); @@ -93,6 +100,7 @@ ASSERT_TRUE(!a->test(0)); delete a; ASSERT_TRUE(!DVtableHook::hasVtable(a)); + delete b; } TEST_F(ut_DVtableHook, objectFun2Fun) @@ -102,6 +110,44 @@ ASSERT_TRUE(a->test(1)); DVtableHook::resetVtable(a); ASSERT_TRUE(!DVtableHook::hasVtable(a)); + + delete a; +} + +TEST_F(ut_DVtableHook, objectFun2StdFun) +{ + A *a = new A(); + ASSERT_TRUE(DVtableHook::overrideVfptrFun(a, &A::test, std::bind(&test2, std::placeholders::_1, std::placeholders::_2, true))); + ASSERT_TRUE(a->test(2)); + DVtableHook::resetVtable(a); + ASSERT_TRUE(!DVtableHook::hasVtable(a)); + // not support + // A *a2 = new A(); + // ASSERT_TRUE(DVtableHook::overrideVfptrFun(a2, &A::test, std::bind(&test2, std::placeholders::_1, std::placeholders::_2, false))); + // ASSERT_TRUE(!a2->test(2)); + // DVtableHook::resetVtable(a2); + // ASSERT_TRUE(!DVtableHook::hasVtable(a2)); + delete a; +} + +TEST_F(ut_DVtableHook, objectFun2LambdaFun) +{ + A *a = new A(); + auto lambda1 = [a](A *obj, int v) { + qDebug() << Q_FUNC_INFO << obj << v; + return a == obj; + }; + auto lambda2 = [a](A *obj, int v) { + qDebug() << Q_FUNC_INFO << obj << v; + return a != obj; + }; + ASSERT_TRUE(DVtableHook::overrideVfptrFun(a, &A::test, lambda1)); + ASSERT_TRUE(a->test(3)); + ASSERT_TRUE(DVtableHook::overrideVfptrFun(a, &A::test, lambda2)); + ASSERT_TRUE(!a->test(3)); + DVtableHook::resetVtable(a); + ASSERT_TRUE(!DVtableHook::hasVtable(a)); + delete a; } TEST_F(ut_DVtableHook, fun2ObjectFun) @@ -120,4 +166,29 @@ ASSERT_TRUE(DVtableHook::overrideVfptrFun(&A::test, &test)); A *a = new A(); ASSERT_TRUE(a->test(5)); + delete a; +} + +TEST_F(ut_DVtableHook, fun2StdFun) +{ + A *a = new A(); + ASSERT_TRUE(DVtableHook::overrideVfptrFun(&A::test, std::bind(&test2, std::placeholders::_1, std::placeholders::_2, true))); + ASSERT_TRUE(a->test(6)); + DVtableHook::resetVtable(a); + ASSERT_TRUE(!DVtableHook::hasVtable(a)); + delete a; +} + +TEST_F(ut_DVtableHook, fun2LambdaFun) +{ + A *a = new A(); + auto lambda = [a](A *obj, int v) { + qDebug() << Q_FUNC_INFO << obj << v; + return a == obj; + }; + ASSERT_TRUE(DVtableHook::overrideVfptrFun(&A::test, lambda)); + ASSERT_TRUE(a->test(7)); + DVtableHook::resetVtable(a); + ASSERT_TRUE(!DVtableHook::hasVtable(a)); + delete a; }