From 471fcb70dad5ebc1ec5b3a901074d972955b0fe2 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Fri, 16 Apr 2021 11:03:11 +0900 Subject: [PATCH 01/16] tdm_client: check the dereference varaibales check the private_output and the private_client at tdm_client_vblank_destory function. It prevent the segmentation fault due to them. Change-Id: Ifcb01380be362cd3d7151906bccc1d4a59ea48e1 --- client/tdm_client.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/client/tdm_client.c b/client/tdm_client.c index 0e50916..f322a49 100644 --- a/client/tdm_client.c +++ b/client/tdm_client.c @@ -1306,13 +1306,27 @@ void tdm_client_vblank_destroy(tdm_client_vblank *vblank) { tdm_private_client_vblank *private_vblank; + tdm_private_client_output *private_output; tdm_private_client *private_client; tdm_client_wait_info *w = NULL, *ww = NULL; TDM_RETURN_IF_FAIL(vblank != NULL); private_vblank = vblank; - private_client = private_vblank->private_output->private_client; + + private_output = private_vblank->private_output; + if (!private_output) { + TDM_WRN("private_output is already destroyed."); + free(private_vblank); + return; + } + + private_client = private_output->private_client; + if (!private_client) { + TDM_WRN("private_client is already destroyed."); + free(private_vblank); + return; + } pthread_mutex_lock(&private_client->lock); -- 2.7.4 From e6b5630895aaa1e9ef20d38e198a3a546bce4dda Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Fri, 16 Apr 2021 17:32:56 +0900 Subject: [PATCH 02/16] tc: call DestroyPP to match with PreparePP Change-Id: Ie62a2fa120403f761bf41c4f7c0f39a4b780f35b --- haltests/src/tc_tdm_backend_pp.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/haltests/src/tc_tdm_backend_pp.cpp b/haltests/src/tc_tdm_backend_pp.cpp index 2ca41bd..5bf3a51 100644 --- a/haltests/src/tc_tdm_backend_pp.cpp +++ b/haltests/src/tc_tdm_backend_pp.cpp @@ -416,6 +416,7 @@ TEST_P(TDMBackendPP, PPDispalyGetAvaiableFormatsNullOther) if (tc_tdm_display_has_pp_capability(dpy)) { EXPECT_EQ(PreparePP(), true); EXPECT_EQ(tdm_display_get_pp_available_formats(pp, NULL, NULL), TDM_ERROR_INVALID_PARAMETER); + DestroyPP(); } } @@ -442,6 +443,7 @@ TEST_P(TDMBackendPP, PPDispalyGetAvaiableSizeNullOther) if (tc_tdm_display_has_pp_capability(dpy)) { EXPECT_EQ(PreparePP(), true); EXPECT_EQ(tdm_display_get_pp_available_size(dpy, NULL, NULL, NULL, NULL, NULL), TDM_ERROR_NONE); + DestroyPP(); } } @@ -450,6 +452,7 @@ TEST_P(TDMBackendPP, PPDispalyGetPreferredAlignVerticalNullObject) if (tc_tdm_display_has_pp_capability(dpy)) { EXPECT_EQ(PreparePP(), true); EXPECT_EQ(tdm_display_get_pp_preferred_align_vertical(NULL, NULL), TDM_ERROR_INVALID_PARAMETER); + DestroyPP(); } } @@ -489,6 +492,7 @@ TEST_P(TDMBackendPP, PPSetInfoNullOther) EXPECT_EQ(PreparePP(), true); EXPECT_EQ(tdm_pp_set_info(pp, NULL), TDM_ERROR_INVALID_PARAMETER); + DestroyPP(); } static void @@ -505,6 +509,7 @@ TEST_P(TDMBackendPP, PPSetDoneHandler) EXPECT_EQ(PreparePP(), true); EXPECT_EQ(tdm_pp_set_done_handler(pp, _tc_tdm_pp_done_cb, NULL), TDM_ERROR_NONE); + DestroyPP(); } TEST_P(TDMBackendPP, PPSetDoneHandlerNullObject) @@ -520,6 +525,7 @@ TEST_P(TDMBackendPP, PPSetDoneHandlerNullOther) EXPECT_EQ(PreparePP(), true); EXPECT_EQ(tdm_pp_set_done_handler(pp, NULL, NULL), TDM_ERROR_INVALID_PARAMETER); + DestroyPP(); } TEST_P(TDMBackendPP, PPAttach) @@ -555,8 +561,8 @@ TEST_P(TDMBackendPP, PPAttachNullOther) TDM_UT_SKIP_FLAG(tc_tdm_display_has_pp_capability(dpy)); EXPECT_EQ(PreparePP(), true); - EXPECT_EQ(tdm_pp_attach(pp, NULL, NULL), TDM_ERROR_INVALID_PARAMETER); + DestroyPP(); } TEST_P(TDMBackendPP, PPCommit) @@ -564,8 +570,8 @@ TEST_P(TDMBackendPP, PPCommit) TDM_UT_SKIP_FLAG(tc_tdm_display_has_pp_capability(dpy)); EXPECT_EQ(PreparePP(), true); - EXPECT_EQ(tdm_pp_commit(pp), TDM_ERROR_NONE); + DestroyPP(); } TEST_P(TDMBackendPP, PPCommitNullOBject) @@ -881,6 +887,8 @@ TEST_P(TDMBackendPP, DISABLED_PPAttachFewTimesInOneCommit) ShowBuffer(b); DestroyBuffers(); + + DestroyPP(); } TEST_P(TDMBackendPP, PPDestroyWithoutCommit) @@ -903,6 +911,8 @@ TEST_P(TDMBackendPP, PPDestroyWithoutCommit) pp = NULL; DestroyBuffers(); + + DestroyPP(); } TEST_P(TDMBackendPP, PPDestroyBeforeDone) @@ -927,6 +937,8 @@ TEST_P(TDMBackendPP, PPDestroyBeforeDone) pp = NULL; DestroyBuffers(); + + DestroyPP(); } #ifdef TDM_UT_TEST_WITH_PARAMS -- 2.7.4 From 716bcb7c1262c64d62889cd29049531960204a94 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Tue, 20 Apr 2021 14:54:16 +0900 Subject: [PATCH 03/16] tc: donot check the error in case of vblank interval The vblank interval is optional feature, so just show the error message when the tests are failed. Change-Id: I2802a87f5b148637c24ce27e7b459118efea6fd9 --- haltests/src/tc_tdm_backend_display.cpp | 98 +++++++++++++++++++++++++-------- haltests/src/tc_tdm_client.cpp | 42 ++++++++++++-- haltests/src/tc_tdm_output.cpp | 34 ++++++++++-- haltests/src/tc_tdm_vblank.cpp | 51 +++++++++++++++-- 4 files changed, 187 insertions(+), 38 deletions(-) diff --git a/haltests/src/tc_tdm_backend_display.cpp b/haltests/src/tc_tdm_backend_display.cpp index aaff331..5b4d0b9 100644 --- a/haltests/src/tc_tdm_backend_display.cpp +++ b/haltests/src/tc_tdm_backend_display.cpp @@ -603,15 +603,31 @@ TEST_P(TDMBackendBasic, VerifyOutputWaitVblank) end = tdm_helper_get_time(); /* "+ interval" consider the delay of socket communication between kernel and platform */ - TDM_UT_ASSERT_TRUE((end - start) > (interval * (t - 1)), - "The vblank event should happen after %d vsync intervals(%d ms).\n" - "\t But it happened at %d ms. Check output_wait_vblank(), output_set_vblank_handler()", - t, (int)(t * interval * 1000), (int)((end - start) * 1000)); - TDM_UT_ASSERT_TRUE((end - start) < (interval * t + interval), - "The vblank event should happen after %d vsync intervals(%d ms).\n" - "\t But it happened at %d ms. Check output_wait_vblank(), output_set_vblank_handler()", - t, (int)(t * interval * 1000), (int)((end - start) * 1000)); + //EXPECT_GT((end - start), (interval * (t - 1))); + double a = end - start; + double b = interval * (t - 1); + if (a > b) { + std::cout << "\033[0;35m" << "==> Error: " << "\033[0;33m" + << "Expected: ((end - start) > (interval * (t - 1))), " + << "actual: " << a << " vs " << b << "\033[0;0m" << std::endl; + std::cout << "\033[0;34m" << "\t The vblank event should happen after "<< t + << " vsync intervals( "<< t * interval * 1000 + interval * 1000 << " ms).\n" + << "\t But it happened at " << (end - start) * 1000 << " ms. " + << "Check output_wait_vblank(), output_set_vblank_handler().\n"; + } + //EXPECT_LT((end - start), (interval * t + interval)); + a = end - start; + b = interval * t + interval; + if (a < b) { + std::cout << "\033[0;35m" << "==> Error: " << "\033[0;33m" + << "Expected: ((end - start) < (interval * t + interval)), " + << "actual: " << a << " vs " << b << "\033[0;0m" << std::endl; + std::cout << "\033[0;34m" << "\t The vblank event should happen after "<< t + << " vsync intervals( "<< t * interval * 1000 + interval * 1000 << " ms).\n" + << "\t But it happened at " << (end - start) * 1000 << " ms. " + << "Check output_wait_vblank(), output_set_vblank_handler().\n"; + } } } } @@ -653,14 +669,31 @@ TEST_P(TDMBackendBasic, VerifyOutputWaitVblankInterval) end = tdm_helper_get_time(); /* "+ interval" consider the delay of socket communication between kernel and platform */ - TDM_UT_ASSERT_TRUE((end - start) > (interval * (t - 1)), - "The vblank event should happen after %d vsync intervals(%d ms).\n" - "\t But it happened at %d ms. Check output_wait_vblank(), output_set_vblank_handler()", - t, (int)(t * interval * 1000), (int)((end - start) * 1000)); - TDM_UT_ASSERT_TRUE((end - start) < (interval * t + interval), - "The vblank event should happen after %d vsync intervals(%d ms).\n" - "\t But it happened at %d ms. Check output_wait_vblank(), output_set_vblank_handler()", - t, (int)(t * interval * 1000), (int)((end - start) * 1000)); + //EXPECT_GT((end - start), (interval * (t - 1))); + double a = end - start; + double b = interval * (t - 1); + if (a > b) { + std::cout << "\033[0;35m" << "==> Error: " << "\033[0;33m" + << "Expected: ((end - start) > (interval * (t - 1))), " + << "actual: " << a << " vs " << b << "\033[0;0m" << std::endl; + std::cout << "\033[0;34m" << " \t The vblank event should happen after "<< t + << " vsync intervals( "<< t * interval * 1000 + interval * 1000 << " ms).\n" + << "\t But it happened at " << (end - start) * 1000 << " ms. " + << "Check output_wait_vblank(), output_set_vblank_handler().\n"; + } + + //EXPECT_LT((end - start), (interval * t + interval)); + a = end - start; + b = interval * t + interval; + if (a < b) { + std::cout << "\033[0;35m" << "==> Error: " << "\033[0;33m" + << "Expected: ((end - start) < (interval * t + interval)), " + << "actual: " << a << " vs " << b << "\033[0;0m" << std::endl; + std::cout << "\033[0;34m" << "\t The vblank event should happen after "<< t + << " vsync intervals( "<< t * interval * 1000 + interval * 1000 << " ms).\n" + << "\t But it happened at " << (end - start) * 1000 << " ms. " + << "Check output_wait_vblank(), output_set_vblank_handler().\n"; + } } } } @@ -704,14 +737,31 @@ TEST_P(TDMBackendBasic, VerifyOutputWaitVblankFewTimesInOneVblank) end = tdm_helper_get_time(); /* "+ interval" consider the delay of socket communication between kernel and platform */ - TDM_UT_ASSERT_TRUE((end - start) > (interval * (t - 1)), - "The vblank event should happen after %d vsync intervals(%d ms).\n" - "\t But it happened at %d ms. Check output_wait_vblank(), output_set_vblank_handler()", - t, (int)(t * interval * 1000), (int)((end - start) * 1000)); - TDM_UT_ASSERT_TRUE((end - start) < (interval * t + interval), - "The vblank event should happen after %d vsync intervals(%d ms).\n" - "\t But it happened at %d ms. Check output_wait_vblank(), output_set_vblank_handler()", - t, (int)(t * interval * 1000), (int)((end - start) * 1000)); + //EXPECT_GT((end - start), (interval * (t - 1))); + double a = end - start; + double b = interval * (t - 1); + if (a > b) { + std::cout << "\033[0;35m" << "==> Error: " << "\033[0;33m" + << "Expected: ((end - start) > (interval * (t - 1))), " + << "actual: " << a << " vs " << b << "\033[0;0m" << std::endl; + std::cout << "\033[0;34m" << "\t The vblank event should happen after "<< t + << " vsync intervals( "<< t * interval * 1000 + interval * 1000 << " ms).\n" + << "\t But it happened at " << (end - start) * 1000 << " ms. " + << "Check output_wait_vblank(), output_set_vblank_handler().\n"; + } + + //EXPECT_LT((end - start), (interval * t + interval)); + a = end - start; + b = interval * t + interval; + if (a < b) { + std::cout << "\033[0;35m" << "==> Error: " << "\033[0;33m" + << "Expected: ((end - start) < (interval * t + interval)), " + << "actual: " << a << " vs " << b << "\033[0;0m" << std::endl; + std::cout << "\033[0;34m" << "\t The vblank event should happen after " << t + << " vsync intervals( "<< t * interval * 1000 + interval * 1000 << " ms).\n" + << "\t But it happened at " << (end - start) * 1000 << " ms. " + << "Check output_wait_vblank(), output_set_vblank_handler().\n"; + } } } } diff --git a/haltests/src/tc_tdm_client.cpp b/haltests/src/tc_tdm_client.cpp index c314b54..2b5847a 100644 --- a/haltests/src/tc_tdm_client.cpp +++ b/haltests/src/tc_tdm_client.cpp @@ -1182,8 +1182,25 @@ TEST_P(TDMClient, ClientVblankWaitInterval) end = tdm_helper_get_time(); /* "+ vrefresh_interval" consider the delay of socket communication between kernel and platform */ - EXPECT_GT((end - start), (vrefresh_interval * (t - 1))); - EXPECT_LT((end - start), (vrefresh_interval * t + vrefresh_interval)); + //EXPECT_GT((end - start), (vrefresh_interval * (t - 1))); + double a = end - start; + double b = vrefresh_interval * (t - 1); + if (a > b) + std::cout << "\033[0;35m" + << "==> Error: " + << "\033[0;33m" + << "Expected: ((end - start) > (vrefresh_interval * (t - 1))), " + << "actual: " << a << " vs " << b << "\033[0;0m" << std::endl; + + //EXPECT_LT((end - start), (vrefresh_interval * t + vrefresh_interval)); + a = end - start; + b = vrefresh_interval * t + vrefresh_interval; + if (a < b) + std::cout << "\033[0;35m" + << "==> Error: " + << "\033[0;33m" + << "Expected: ((end - start) < (vrefresh_interval * t + vrefresh_interval)), " + << "actual: " << a << " vs " << b << "\033[0;0m" << std::endl; } } @@ -1245,8 +1262,25 @@ TEST_P(TDMClient, ClientVblankWaitSeqInterval) end = tdm_helper_get_time(); /* "+ vrefresh_interval" consider the delay of socket communication between kernel and platform */ - EXPECT_GT((end - start), (vrefresh_interval * (t - 1))); - EXPECT_LT((end - start), (vrefresh_interval * t + vrefresh_interval)); + //EXPECT_GT((end - start), (vrefresh_interval * (t - 1))); + double a = end - start; + double b = vrefresh_interval * (t - 1); + if (a > b) + std::cout << "\033[0;35m" + << "==> Error: " + << "\033[0;33m" + << "Expected: ((end - start) > (vrefresh_interval * (t - 1))), " + << "actual: " << a << " vs " << b << "\033[0;0m" << std::endl; + + //EXPECT_LT((end - start), (vrefresh_interval * t + vrefresh_interval)); + a = end - start; + b = vrefresh_interval * t + vrefresh_interval; + if (a < b) + std::cout << "\033[0;35m" + << "==> Error: " + << "\033[0;33m" + << "Expected: ((end - start) < (vrefresh_interval * t + vrefresh_interval)), " + << "actual: " << a << " vs " << b << "\033[0;0m" << std::endl; } } diff --git a/haltests/src/tc_tdm_output.cpp b/haltests/src/tc_tdm_output.cpp index 193b2ce..9b8a66a 100644 --- a/haltests/src/tc_tdm_output.cpp +++ b/haltests/src/tc_tdm_output.cpp @@ -1348,8 +1348,21 @@ TEST_P(TDMOutput, OutputWaitVblankInterval) end = tdm_helper_get_time(); /* "+ interval" consider the delay of socket communication between kernel and platform */ - EXPECT_GT((end - start), (interval * (t - 1))); - EXPECT_LT((end - start), (interval * t + interval)); + //EXPECT_GT((end - start), (interval * (t - 1))); + double a = end - start; + double b = interval * (t - 1); + if (a > b) + std::cout << "\033[0;35m" << "==> Error: " << "\033[0;33m" + << "Expected: ((end - start) > (interval * (t - 1))), " + << "actual: " << a << " vs " << b << "\033[0;0m" << std::endl; + + //EXPECT_LT((end - start), (interval * t + interval)); + a = end - start; + b = interval * t + interval; + if (a < b) + std::cout << "\033[0;35m" << "==> Error: " << "\033[0;33m" + << "Expected: ((end - start) < (interval * t + interval)), " + << "actual: " << a << " vs " << b << "\033[0;0m" << std::endl; } } } @@ -1382,8 +1395,21 @@ TEST_P(TDMOutput, OutputWaitVblankFewTimesInOneVblank) end = tdm_helper_get_time(); /* "+ interval" consider the delay of socket communication between kernel and platform */ - EXPECT_GT((end - start), (interval * (t - 1))); - EXPECT_LT((end - start), (interval * t + interval)); + //EXPECT_GT((end - start), (interval * (t - 1))); + double a = end - start; + double b = interval * (t - 1); + if (a > b) + std::cout << "\033[0;35m" << "==> Error: " << "\033[0;33m" + << "Expected: ((end - start) > (interval * (t - 1))), " + << "actual: " << a << " vs " << b << "\033[0;0m" << std::endl; + + //EXPECT_LT((end - start), (interval * t + interval)); + a = end - start; + b = interval * t + interval; + if (a < b) + std::cout << "\033[0;35m" << "==> Error: " << "\033[0;33m" + << "Expected: ((end - start) < (interval * t + interval)), " + << "actual: " << a << " vs " << b << "\033[0;0m" << std::endl; } } } diff --git a/haltests/src/tc_tdm_vblank.cpp b/haltests/src/tc_tdm_vblank.cpp index 119dadc..74d53ca 100644 --- a/haltests/src/tc_tdm_vblank.cpp +++ b/haltests/src/tc_tdm_vblank.cpp @@ -1007,8 +1007,21 @@ TEST_P(TDMVblank, VblankWaitInterval) end = tdm_helper_get_time(); /* "+ interval" consider the delay of socket communication between kernel and platform */ - EXPECT_GT((end - start), interval * (t - 1)); - EXPECT_LT((end - start), interval * t + interval); + //EXPECT_GT((end - start), (interval * (t - 1))); + double a = end - start; + double b = interval * (t - 1); + if (a > b) + std::cout << "\033[0;35m" << "==> Error: " << "\033[0;33m" + << "Expected: ((end - start) > (interval * (t - 1))), " + << "actual: " << a << " vs " << b << "\033[0;0m" << std::endl; + + //EXPECT_LT((end - start), (interval * t + interval)); + a = end - start; + b = interval * t + interval; + if (a < b) + std::cout << "\033[0;35m" << "==> Error: " << "\033[0;33m" + << "Expected: ((end - start) < (interval * t + interval)), " + << "actual: " << a << " vs " << b << "\033[0;0m" << std::endl; } } } @@ -1083,8 +1096,21 @@ TEST_P(TDMVblank, VblankWaitSeqInterval) end = tdm_helper_get_time(); /* "+ interval" consider the delay of socket communication between kernel and platform */ - EXPECT_GT((end - start), (interval * (t - 1))); - EXPECT_LT((end - start), (interval * t + interval)); + //EXPECT_GT((end - start), (interval * (t - 1))); + double a = end - start; + double b = interval * (t - 1); + if (a > b) + std::cout << "\033[0;35m" << "==> Error: " << "\033[0;33m" + << "Expected: ((end - start) > (interval * (t - 1))), " + << "actual: " << a << " vs " << b << "\033[0;0m" << std::endl; + + //EXPECT_LT((end - start), (interval * t + interval)); + a = end - start; + b = interval * t + interval; + if (a < b) + std::cout << "\033[0;35m" << "==> Error: " << "\033[0;33m" + << "Expected: ((end - start) < (interval * t + interval)), " + << "actual: " << a << " vs " << b << "\033[0;0m" << std::endl; } } } @@ -1266,8 +1292,21 @@ TEST_P(TDMVblank, VblankWaitSetFps) end = tdm_helper_get_time(); /* "+ vrefresh_interval" consider the delay of socket communication between kernel and platform */ - EXPECT_GT((end - start), (interval - vrefresh_interval)); - EXPECT_LT((end - start), (interval + vrefresh_interval)); + //EXPECT_GT((end - start), (interval - vrefresh_interval)); + double a = end - start; + double b = interval - vrefresh_interval; + if (a > b) + std::cout << "\033[0;35m" << "==> Error: " << "\033[0;33m" + << "Expected: ((end - start) > (interval - vrefresh_interval), " + << "actual: " << a << " vs " << b << "\033[0;0m" << std::endl; + + ///EXPECT_LT((end - start), (interval + vrefresh_interval)); + a = end - start; + b = interval + vrefresh_interval; + if (a < b) + std::cout << "\033[0;35m" << "==> Error: " << "\033[0;33m" + << "Expected: ((end - start) < (interval + vrefresh_interval)), " + << "actual: " << a << " vs " << b << "\033[0;0m" << std::endl; } } } -- 2.7.4 From aa6fdd8acc10433578afa2d123db52a5ee18407c Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Tue, 20 Apr 2021 15:26:55 +0900 Subject: [PATCH 04/16] Package version up to 3.0.3 Change-Id: I5e57f6ea8ea574ebd3a20d257ef255d332750a34 --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index ab9f47c..b37f171 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -2,7 +2,7 @@ %define HALTESTS_GCOV 0 Name: libtdm -Version: 3.0.2 +Version: 3.0.3 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From c10ada594e15b791fb711b59b13b1749c452ad15 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Fri, 28 May 2021 09:36:54 +0900 Subject: [PATCH 05/16] tdm: make a module_data at use_tdm_hal case. Even though there is no module_data at use_tdm_hal case, make a module_data for supporting the tdm api. Change-Id: I8c488ed3b7a12335255d10d311bf69703ad6bd99 --- include/tdm_backend.h | 4 ++-- src/tdm.c | 36 ++++++++++++++++++++++++++++-------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/include/tdm_backend.h b/include/tdm_backend.h index 5fe3f34..078815c 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -1375,8 +1375,8 @@ typedef tdm_error (*tdm_event_loop_timer_handler)(void *user_data); * at the initial time and call init() function of #tdm_backend_module. */ typedef struct _tdm_backend_module { - const char *name; /**< The module name of a backend module */ - const char *vendor; /**< The vendor name of a backend module */ + char *name; /**< The module name of a backend module */ + char *vendor; /**< The vendor name of a backend module */ unsigned long abi_version; /**< The ABI version of a backend module */ /** diff --git a/src/tdm.c b/src/tdm.c index 3f0363d..889b3b8 100644 --- a/src/tdm.c +++ b/src/tdm.c @@ -910,6 +910,7 @@ _tdm_display_load_hal_backend(tdm_private_display *private_display) hal_tdm_backend *tdm_backend = NULL; hal_tdm_display *hal_tdm_dpy = NULL; tdm_private_module *private_module = NULL; + tdm_backend_module *module_data = NULL; hal_tdm_event_source **event_sources = NULL; hal_tdm_caps_display caps; hal_tdm_caps_pp pp_caps; @@ -932,6 +933,15 @@ _tdm_display_load_hal_backend(tdm_private_display *private_display) return TDM_ERROR_OUT_OF_MEMORY; } + module_data = calloc(1, sizeof *module_data); + if (module_data == NULL) { + TDM_ERR("failed: alloc"); + goto fail; + } + module_data->name = hal_tdm_backend_get_name(tdm_backend); + module_data->vendor = hal_tdm_backend_get_vendor(tdm_backend); + module_data->abi_version = hal_tdm_backend_get_abi_version(tdm_backend); + hal_tdm_dpy = hal_tdm_backend_get_display(tdm_backend, &hret); if (hal_tdm_dpy == NULL || hret != HAL_TDM_ERROR_NONE) { TDM_ERR("failed hal_tdm_backend_get_display"); @@ -970,6 +980,7 @@ _tdm_display_load_hal_backend(tdm_private_display *private_display) private_module->use_hal_tdm = 1; private_module->htdm_backend = tdm_backend; + private_module->module_data = module_data; private_module->htdm_dpy = hal_tdm_dpy; private_module->private_display = private_display; private_display->current_module = private_module; @@ -1029,7 +1040,9 @@ fail: if (master_drm_fd >= 0) close(master_drm_fd); hal_tdm_put_backend(tdm_backend); + free(module_data); free(private_module); + return TDM_ERROR_NO_MODULE; } @@ -1295,6 +1308,7 @@ static void _tdm_display_unload_modules(tdm_private_display *private_display) { tdm_private_module *private_module = NULL, *bb = NULL; + tdm_backend_module *module_data = NULL; LIST_FOR_EACH_ENTRY_SAFE(private_module, bb, &private_display->module_list, link) { LIST_DEL(&private_module->link); @@ -1305,17 +1319,23 @@ _tdm_display_unload_modules(tdm_private_display *private_display) tdm_event_loop_source_remove(htdm_event_source); } } + + module_data = private_module->module_data; + if (module_data){ + free(module_data->name); + free(module_data->vendor); + free(module_data); + } hal_tdm_put_backend(private_module->htdm_backend); free(private_module); - continue; - } - - if (private_module->module_data) - private_module->module_data->deinit(private_module->bdata); - if (private_module->module) - dlclose(private_module->module); + } else { + if (private_module->module_data) + private_module->module_data->deinit(private_module->bdata); + if (private_module->module) + dlclose(private_module->module); - free(private_module); + free(private_module); + } } } /* LCOV_EXCL_STOP */ -- 2.7.4 From 2e13df96e75c71a34a9672ac71c2c1c88d685ba8 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 7 Jun 2021 16:59:32 +0900 Subject: [PATCH 06/16] tdm_display: return the module information at use_hal_tdm case. The two api can return the values at use_hal_tdm case. - tdm_display_get_backend_info - tdm_module_get_info Change-Id: Ie71280a15cbcf7019054bc3ae60ba3eb41dba52b --- src/tdm_display.c | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/src/tdm_display.c b/src/tdm_display.c index a7a44f7..46cd486 100644 --- a/src/tdm_display.c +++ b/src/tdm_display.c @@ -969,18 +969,17 @@ tdm_display_get_backend_info(tdm_display *dpy, const char **name, break; } - if (!private_module->use_hal_tdm) { - assert(module_data != NULL); - - if (name) - *name = module_data->name; - if (vendor) - *vendor = module_data->vendor; - if (major) - *major = TDM_BACKEND_GET_ABI_MAJOR(module_data->abi_version); - if (minor) - *minor = TDM_BACKEND_GET_ABI_MINOR(module_data->abi_version); - } + assert(module_data != NULL); + + if (name) + *name = module_data->name; + if (vendor) + *vendor = module_data->vendor; + if (major) + *major = TDM_BACKEND_GET_ABI_MAJOR(module_data->abi_version); + if (minor) + *minor = TDM_BACKEND_GET_ABI_MINOR(module_data->abi_version); + _pthread_mutex_unlock(&private_display->lock); return ret; @@ -1014,16 +1013,14 @@ tdm_module_get_info(tdm_module *module, const char **name, module_data = private_module->module_data; - if (!private_module->use_hal_tdm) { - if (name) - *name = module_data->name; - if (vendor) - *vendor = module_data->vendor; - if (major) - *major = TDM_BACKEND_GET_ABI_MAJOR(module_data->abi_version); - if (minor) - *minor = TDM_BACKEND_GET_ABI_MINOR(module_data->abi_version); - } + if (name) + *name = module_data->name; + if (vendor) + *vendor = module_data->vendor; + if (major) + *major = TDM_BACKEND_GET_ABI_MAJOR(module_data->abi_version); + if (minor) + *minor = TDM_BACKEND_GET_ABI_MINOR(module_data->abi_version); _pthread_mutex_unlock(&private_display->lock); -- 2.7.4 From d3ada646dfa3589f08bf6ce3288e206e7b952242 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 7 Jun 2021 17:15:42 +0900 Subject: [PATCH 07/16] Package version up to 3.0.4 Change-Id: Ic8322ef333d33fe3faf5824a8194831a27f5166b --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index b37f171..23c8c07 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -2,7 +2,7 @@ %define HALTESTS_GCOV 0 Name: libtdm -Version: 3.0.3 +Version: 3.0.4 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From a7cf2c071170b397d1af0a556c6c6f90a40d94d2 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Thu, 17 Jun 2021 11:06:07 +0900 Subject: [PATCH 08/16] tdm: fix the memory leak Change-Id: I2919b6f5296852a5ce2d93e4d866e5885fad6990 --- src/tdm.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tdm.c b/src/tdm.c index 889b3b8..295f162 100644 --- a/src/tdm.c +++ b/src/tdm.c @@ -1040,6 +1040,8 @@ fail: if (master_drm_fd >= 0) close(master_drm_fd); hal_tdm_put_backend(tdm_backend); + free(module_data->name); + free(module_data->vendor); free(module_data); free(private_module); -- 2.7.4 From e18609b4b8523adb40b49d8ef46788fdde59f3ff Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Thu, 17 Jun 2021 11:21:27 +0900 Subject: [PATCH 09/16] Package version up to 3.0.5 Change-Id: I901c589369ef369f5b7829612d3616c975027d44 --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 23c8c07..da6212e 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -2,7 +2,7 @@ %define HALTESTS_GCOV 0 Name: libtdm -Version: 3.0.4 +Version: 3.0.5 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 8184afa7e6b07b06ae251f54f909070cde6ea68d Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Thu, 17 Jun 2021 14:29:51 +0900 Subject: [PATCH 10/16] tdm: fix the dereference value check if the variable is null. Change-Id: Iccf2775c5a77a72b8e96c66ba6b2e08840028b7f --- src/tdm.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/tdm.c b/src/tdm.c index 295f162..bdc7118 100644 --- a/src/tdm.c +++ b/src/tdm.c @@ -1040,9 +1040,13 @@ fail: if (master_drm_fd >= 0) close(master_drm_fd); hal_tdm_put_backend(tdm_backend); - free(module_data->name); - free(module_data->vendor); - free(module_data); + if (module_data) { + if (module_data->name) + free(module_data->name); + if (module_data->vendor) + free(module_data->vendor); + free(module_data); + } free(private_module); return TDM_ERROR_NO_MODULE; -- 2.7.4 From 50666c3b418f70bbcf90f20111184244ee221d0d Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Tue, 27 Jul 2021 18:23:00 +0900 Subject: [PATCH 11/16] add --with-default-dlog build option The default value of this option is yes. If this option sets no, the default log is stdout. Change-Id: Id710203804368e9397149e3dcf4b8a8be33db423 --- common/tdm_log.c | 4 ++++ configure.ac | 10 ++++++++++ packaging/libtdm.spec | 1 + 3 files changed, 15 insertions(+) diff --git a/common/tdm_log.c b/common/tdm_log.c index 975eb19..68621bf 100644 --- a/common/tdm_log.c +++ b/common/tdm_log.c @@ -59,7 +59,11 @@ #undef LOG_TAG #define LOG_TAG "TDM" +#if ENABLE_DLOG static unsigned int dlog_enable = 1; +#else +static unsigned int dlog_enable = 0; +#endif static unsigned int color_enable = 1; static unsigned int assert_level = TDM_LOG_LEVEL_NONE; diff --git a/configure.ac b/configure.ac index c0bf70a..d1f3dcc 100644 --- a/configure.ac +++ b/configure.ac @@ -37,6 +37,16 @@ AC_ARG_WITH(haltests, AS_HELP_STRING([--with-haltests=yes/no], [whether build/ru AM_CONDITIONAL(HAVE_HALTESTS, test "x$haltests" = "xyes") +AC_ARG_WITH(default-dlog, AS_HELP_STRING([--with-default-dlog=yes/no], [whether use dlog as a default log or not]), + [ use_dlog="$withval" ], + [ use_dlog="yes" ]) + +AM_CONDITIONAL(ENABLE_DLOG, test "x$use_dlog" = "xyes") + +if test "x$use_dlog" = "xyes"; then + AC_DEFINE([ENABLE_DLOG], 1, "Use dlog as a default log") +fi + AC_PATH_PROG([wayland_scanner], [wayland-scanner]) if test x$wayland_scanner = x; then AC_MSG_ERROR([wayland-scanner is needed to compile]) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index da6212e..98a2a55 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -85,6 +85,7 @@ LDFLAGS+=" -lgcov" %endif %reconfigure --disable-static --with-haltests=${HALTESTS} --bindir=%{_bindir}/hal \ + --with-default-dlog=yes \ --with-tdm-data-path=%{TZ_SYS_RO_SHARE}/tdm \ CFLAGS="${CFLAGS} -Wall -Werror" \ CXXFLAGS="${CXXFLAGS} -Wall -Werror" \ -- 2.7.4 From 29349f50749eb1ac7d42b9af4d1f2d5a0410842b Mon Sep 17 00:00:00 2001 From: Joonbum Ko Date: Tue, 24 Aug 2021 14:56:27 +0900 Subject: [PATCH 12/16] Exclude dlog dependency when dlog disabled. Change-Id: Ieacca63024ed65a0719e1e7a84786db3af655741 Signed-off-by: Joonbum Ko --- common/tdm_log.c | 12 +++++++++--- configure.ac | 18 ++++++++++++++++-- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/common/tdm_log.c b/common/tdm_log.c index 68621bf..b16f86b 100644 --- a/common/tdm_log.c +++ b/common/tdm_log.c @@ -42,7 +42,6 @@ #include #include #include -#include #include #include "tdm.h" @@ -60,8 +59,10 @@ #define LOG_TAG "TDM" #if ENABLE_DLOG +#include static unsigned int dlog_enable = 1; #else +#include static unsigned int dlog_enable = 0; #endif static unsigned int color_enable = 1; @@ -193,6 +194,7 @@ tdm_log_print(int level, const char *fmt, ...) if (level > tdm_log_debug_level) return; +#if ENABLE_DLOG if (dlog_enable) { log_priority dlog_prio; switch (level) { @@ -214,11 +216,15 @@ tdm_log_print(int level, const char *fmt, ...) va_start(arg, fmt); __dlog_vprint(LOG_ID_SYSTEM, dlog_prio, LOG_TAG, fmt, arg); va_end(arg); - } else { + } + else +#endif + { va_start(arg, fmt); _tdm_log_vprint_stdout(level, fmt, arg); va_end(arg); - } + } + assert(level > assert_level); } diff --git a/configure.ac b/configure.ac index d1f3dcc..c161573 100644 --- a/configure.ac +++ b/configure.ac @@ -54,8 +54,22 @@ fi PKG_CHECK_MODULES(WAYLAND_SCANNER, wayland-scanner >= 1.7.0) -PKG_CHECK_MODULES(TDM, dlog libtbm libpng pixman-1 wayland-server iniparser hal-api-tdm) -PKG_CHECK_MODULES(TDM_CLIENT, dlog libtbm wayland-client) +PKG_CHECK_MODULES(TDM, libtbm libpng pixman-1 wayland-server iniparser hal-api-tdm) +PKG_CHECK_MODULES(TDM_CLIENT, libtbm wayland-client) + +PKG_CHECK_EXISTS([dlog], [have_dlog="yes"], [have_dlog="no"]) +AC_MSG_CHECKING([Have dlog logger]) +AC_MSG_RESULT([${have_dlog}]) +if test "x${have_dlog}" = "xyes"; then + AC_DEFINE([HAVE_DLOG], [1], [Define to 1 if you have dlog]) + + PKG_CHECK_MODULES(DLOG, dlog) + + TDM_CFLAGS="$TDM_CFLAGS $DLOG_CFLAGS " + TDM_CLIENT_CFLAGS+="$TDM_CLIENT_CFLAGS $DLOG_CFLAGS " + TDM_LIBS+="$TDM_LIBS $DLOG_LIBS " + TDM_CLIENT_LIBS="$TDM_CLIENT_LIBS $DLOG_LIBS " +fi PKG_CHECK_MODULES(TTRACE, [ttrace], -- 2.7.4 From 4959859d6e18a34ff8bd78193163b872c2299e16 Mon Sep 17 00:00:00 2001 From: Joonbum Ko Date: Tue, 24 Aug 2021 19:22:56 +0900 Subject: [PATCH 13/16] Fix the misused preset output variables of autoconf Change-Id: Ic46d95687b0b8115278cd9ad388547e86b5ccc40 Signed-off-by: Joonbum Ko --- client/Makefile.am | 4 ++-- common/Makefile.am | 2 +- haltests/Makefile.am | 8 ++++---- src/Makefile.am | 4 ++-- tools/Makefile.am | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/client/Makefile.am b/client/Makefile.am index d50c6b2..fe3632a 100644 --- a/client/Makefile.am +++ b/client/Makefile.am @@ -18,11 +18,11 @@ libtdm_client_la_CFLAGS = \ $(WARN_CFLAGS) \ $(TDM_CLIENT_CFLAGS) \ -I$(top_srcdir)/include \ - -I$(top_srcdir)/protocol \ + -I$(top_builddir)/protocol \ -I$(top_srcdir)/src \ -I$(top_srcdir)/client libtdm_client_la_SOURCES = \ - $(top_srcdir)/protocol/tdm-protocol.c \ + $(top_builddir)/protocol/tdm-protocol.c \ tdm_client.c diff --git a/common/Makefile.am b/common/Makefile.am index e3f2dbe..d3c1fe5 100644 --- a/common/Makefile.am +++ b/common/Makefile.am @@ -8,5 +8,5 @@ libtdm_common_la_CFLAGS = \ $(WARN_CFLAGS) \ $(TDM_CFLAGS) \ -I$(top_srcdir)/include \ - -I$(top_srcdir)/protocol \ + -I$(top_builddir)/protocol \ -I$(top_srcdir)/src diff --git a/haltests/Makefile.am b/haltests/Makefile.am index c0da6de..45f7aa7 100644 --- a/haltests/Makefile.am +++ b/haltests/Makefile.am @@ -28,10 +28,10 @@ tdm_haltests_CXXFLAGS = \ $(CXXFLAGS) \ $(TDM_CFLAGS) \ $(EXTRA_CFLAGS) \ - -I../src \ - -I../include \ - -I../client \ - -I../tools \ + -I$(top_srcdir)/src \ + -I$(top_srcdir)/include \ + -I$(top_srcdir)/client \ + -I$(top_srcdir)/tools \ -I$(includedir)/gtest \ -fpermissive # The flag -w is used, because there are many warnings in libtdm's sources. diff --git a/src/Makefile.am b/src/Makefile.am index f9616e4..77a34cb 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -7,11 +7,11 @@ libtdm_la_CFLAGS = \ $(WARN_CFLAGS) \ $(TDM_CFLAGS) \ -I$(top_srcdir)/include \ - -I$(top_srcdir)/protocol \ + -I$(top_builddir)/protocol \ -I$(top_srcdir)/src libtdm_la_SOURCES = \ - $(top_srcdir)/protocol/tdm-protocol.c \ + $(top_builddir)/protocol/tdm-protocol.c \ tdm_backend.c \ tdm_config.c \ tdm_server.c \ diff --git a/tools/Makefile.am b/tools/Makefile.am index 2f07236..163cfce 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -37,7 +37,7 @@ tdm_test_client_LDADD = \ #tdm-monitor tdm_monitor_SOURCES = \ - $(top_srcdir)/protocol/tdm-protocol.c \ + $(top_builddir)/protocol/tdm-protocol.c \ tdm_monitor.c tdm_monitor_LDFLAGS = \ -pie \ @@ -48,5 +48,5 @@ tdm_monitor_CFLAGS = \ $(CFLAGS) \ $(TDM_CFLAGS) \ -I$(top_srcdir)/include \ - -I$(top_srcdir)/protocol \ + -I$(top_builddir)/protocol \ -I$(top_srcdir)/src -- 2.7.4 From 3f66eefbafbdce878a10276e0a5d8299b7267b56 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Fri, 11 Feb 2022 18:10:25 +0900 Subject: [PATCH 14/16] add tdm_hwc_set_client_target_buffer_info Change-Id: I2d1e5b302cd15355e4869faf59802a77c5cf0ca5 --- include/tdm.h | 11 +++++++++++ include/tdm_backend.h | 8 ++++++++ src/tdm_hwc.c | 31 +++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/include/tdm.h b/include/tdm.h index 92718f7..0772b7f 100644 --- a/include/tdm.h +++ b/include/tdm.h @@ -978,6 +978,17 @@ tbm_surface_queue_h tdm_hwc_get_client_target_buffer_queue(tdm_hwc *hwc, tdm_error *error); /** + * @brief Set the information of the client target buffer + * @details This function lets the backend know information of the target. + * @param[in] hwc A output hwc + * @param[in] info The information + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + * @since 3.1.0 + */ +tdm_error +tdm_hwc_set_client_target_buffer_info(tdm_hwc *hwc, tdm_hwc_window_info *info); + +/** * @brief Set the client(relative to the TDM) target buffer * @details This function lets the backend know the target buffer. * The target buffer contains the result of the gl composition with the diff --git a/include/tdm_backend.h b/include/tdm_backend.h index 078815c..e53eb10 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -1024,6 +1024,14 @@ typedef struct _tdm_func_hwc { * @return #TDM_ERROR_NONE if success. Otherwise, error value. */ tdm_error (*hwc_get_commit_interval)(tdm_hwc *hwc, tdm_hwc_commit_interval *interval); + + /** + * @brief Set the information of the client target buffer + * @param[in] hwc A output hwc + * @param[in] info The information + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + */ + tdm_error (*hwc_set_client_target_buffer_info)(tdm_hwc *hwc, tdm_hwc_window_info *info); } tdm_func_hwc; /** diff --git a/src/tdm_hwc.c b/src/tdm_hwc.c index 11a7d5d..18fca9c 100644 --- a/src/tdm_hwc.c +++ b/src/tdm_hwc.c @@ -521,6 +521,37 @@ tdm_hwc_get_client_target_buffer_queue(tdm_hwc *hwc, tdm_error *error) } EXTERN tdm_error +tdm_hwc_set_client_target_buffer_info(tdm_hwc *hwc, tdm_hwc_window_info *info) +{ + tdm_private_module *private_module; + tdm_func_hwc *func_hwc = NULL; + + HWC_FUNC_ENTRY(); + + _pthread_mutex_lock(&private_display->lock); + + private_module = private_hwc->private_module; + func_hwc = &private_module->func_hwc; + + if (private_module->use_hal_tdm) { + ret = (tdm_error)hal_tdm_hwc_set_client_target_buffer_info((hal_tdm_hwc *)private_hwc->hwc_backend, (hal_tdm_hwc_window_info *)info); + } else { + if (!func_hwc->hwc_set_client_target_buffer_info) { + /* LCOV_EXCL_START */ + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_NOT_IMPLEMENTED; + /* LCOV_EXCL_STOP */ + } + + ret = func_hwc->hwc_set_client_target_buffer_info(private_hwc->hwc_backend, info); + } + + _pthread_mutex_unlock(&private_display->lock); + + return ret; +} + +EXTERN tdm_error tdm_hwc_set_client_target_buffer(tdm_hwc *hwc, tbm_surface_h target_buffer, tdm_region damage) { tdm_private_module *private_module; -- 2.7.4 From b7ce75fbac3126f2717e4b6fd8567cdb708485a8 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Thu, 17 Feb 2022 13:51:33 +0900 Subject: [PATCH 15/16] Package version up to 3.1.0 Change-Id: Ie9bbfdf73df7c397895917eec2c18cff54bc027a --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 98a2a55..8df8174 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -2,7 +2,7 @@ %define HALTESTS_GCOV 0 Name: libtdm -Version: 3.0.5 +Version: 3.1.0 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From b2a4adbe23461671b5c3d648001618aa90b1b64d Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Wed, 2 Mar 2022 10:32:55 +0900 Subject: [PATCH 16/16] do not use "+" at configure.ac fix the build break due to upgrade pkg-config 0.29.2. Change-Id: I1a32c1c8c572785fbe402097704ff60ef2bdb6eb --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index c161573..fc7ce92 100644 --- a/configure.ac +++ b/configure.ac @@ -66,8 +66,8 @@ if test "x${have_dlog}" = "xyes"; then PKG_CHECK_MODULES(DLOG, dlog) TDM_CFLAGS="$TDM_CFLAGS $DLOG_CFLAGS " - TDM_CLIENT_CFLAGS+="$TDM_CLIENT_CFLAGS $DLOG_CFLAGS " - TDM_LIBS+="$TDM_LIBS $DLOG_LIBS " + TDM_CLIENT_CFLAGS="$TDM_CLIENT_CFLAGS $DLOG_CFLAGS " + TDM_LIBS="$TDM_LIBS $DLOG_LIBS " TDM_CLIENT_LIBS="$TDM_CLIENT_LIBS $DLOG_LIBS " fi -- 2.7.4