From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dd14210.kasserver.com (dd14210.kasserver.com [85.13.138.83]) by sourceware.org (Postfix) with ESMTPS id 0AFE43856094 for ; Thu, 7 Jul 2022 14:46:55 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 0AFE43856094 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=milianw.de Authentication-Results: sourceware.org; spf=none smtp.mailfrom=milianw.de Received: from milian-workstation.localnet (p54a1bbed.dip0.t-ipconnect.de [84.161.187.237]) by dd14210.kasserver.com (Postfix) with ESMTPSA id 8FE272401E7 for ; Thu, 7 Jul 2022 16:46:52 +0200 (CEST) From: Milian Wolff To: elfutils-devel@sourceware.org Subject: [PATCH] Introduce public dwfl_get_debuginfod_client API Date: Thu, 07 Jul 2022 16:46:52 +0200 Message-ID: <3003776.hSsdSGGBHf@milian-workstation> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart3873567.Nxe0qQJ9Tg"; micalg="pgp-sha256"; protocol="application/pgp-signature" X-Spamd-Bar: - X-Spam-Status: No, score=-8.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_LOW, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: elfutils-devel@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Elfutils-devel mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 07 Jul 2022 14:46:57 -0000 --nextPart3873567.Nxe0qQJ9Tg Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii"; protected-headers="v1" From: Milian Wolff To: elfutils-devel@sourceware.org Subject: [PATCH] Introduce public dwfl_get_debuginfod_client API Date: Thu, 07 Jul 2022 16:46:52 +0200 Message-ID: <3003776.hSsdSGGBHf@milian-workstation> MIME-Version: 1.0 Dwfl can use debuginfod internally, which was so far totally opaque to the outside. While the functionality is great for users of the dwfl API, the long wait times induced by downloading of data over debuginfod lead to complaints by endusers. To offer them a bit more insight into the internal ongoings, one can now use e.g. `debuginfod_set_progressfn` on the handle returned by `dwfl_get_debuginfod_client` to report download progress. Rename get_client to dwfl_get_debuginfod_client and make it public. Unconditionally compile debuginfod-client.c and stub the new public function and always return NULL when debuginfod integration was disabled. Signed-off-by: Milian Wolff --- libdw/libdw.map | 5 +++++ libdwfl/ChangeLog | 5 +++++ libdwfl/Makefile.am | 5 +---- libdwfl/debuginfod-client.c | 23 ++++++++++++++++++----- libdwfl/libdwfl.h | 10 ++++++++++ libdwfl/libdwflP.h | 1 + 6 files changed, 40 insertions(+), 9 deletions(-) diff --git a/libdw/libdw.map b/libdw/libdw.map index 4f530378..3fdf3f93 100644 --- a/libdw/libdw.map +++ b/libdw/libdw.map @@ -366,3 +366,8 @@ ELFUTILS_0.186 { dwarf_linecontext; dwarf_linefunctionname; } ELFUTILS_0.177; + +ELFUTILS_0.187 { + global: + dwfl_get_debuginfod_client; +} ELFUTILS_0.186; diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog index b3ca56cb..890df156 100644 --- a/libdwfl/ChangeLog +++ b/libdwfl/ChangeLog @@ -1,3 +1,8 @@ +2022-06-22 Milian Wolff + + * libdwfl.h, debuginfod-client.c (dwfl_get_debuginfod_client): + Rename get_client to dwfl_get_debuginfod_client and make it public. + 2022-05-15 Mark Wielaard * libdwfl.h (dwfl_module_addrinfo): Update docs and nonnull diff --git a/libdwfl/Makefile.am b/libdwfl/Makefile.am index a0013e41..3278358d 100644 --- a/libdwfl/Makefile.am +++ b/libdwfl/Makefile.am @@ -70,7 +70,7 @@ libdwfl_a_SOURCES = dwfl_begin.c dwfl_end.c dwfl_error.c dwfl_version.c \ link_map.c core-file.c open.c image-header.c \ dwfl_frame.c frame_unwind.c dwfl_frame_pc.c \ linux-pid-attach.c linux-core-attach.c dwfl_frame_regs.c \ - gzip.c + gzip.c debuginfod-client.c if BZLIB libdwfl_a_SOURCES += bzip2.c @@ -81,9 +81,6 @@ endif if ZSTD libdwfl_a_SOURCES += zstd.c endif -if LIBDEBUGINFOD -libdwfl_a_SOURCES += debuginfod-client.c -endif libdwfl = $(libdw) libdw = ../libdw/libdw.so diff --git a/libdwfl/debuginfod-client.c b/libdwfl/debuginfod-client.c index 153260c3..813043b1 100644 --- a/libdwfl/debuginfod-client.c +++ b/libdwfl/debuginfod-client.c @@ -32,6 +32,9 @@ #endif #include "libdwflP.h" + +#ifdef ENABLE_LIBDEBUGINFOD + #include #include @@ -46,8 +49,8 @@ static pthread_once_t init_control = PTHREAD_ONCE_INIT; /* NB: this is slightly thread-unsafe */ -static debuginfod_client * -get_client (Dwfl *dwfl) +debuginfod_client * +dwfl_get_debuginfod_client (Dwfl *dwfl) { if (dwfl->debuginfod != NULL) return dwfl->debuginfod; @@ -71,7 +74,7 @@ __libdwfl_debuginfod_find_executable (Dwfl *dwfl, int fd = -1; if (build_id_len > 0) { - debuginfod_client *c = get_client (dwfl); + debuginfod_client *c = dwfl_get_debuginfod_client (dwfl); if (c != NULL) fd = (*fp_debuginfod_find_executable) (c, build_id_bits, build_id_len, NULL); @@ -88,7 +91,7 @@ __libdwfl_debuginfod_find_debuginfo (Dwfl *dwfl, int fd = -1; if (build_id_len > 0) { - debuginfod_client *c = get_client (dwfl); + debuginfod_client *c = dwfl_get_debuginfod_client (dwfl); if (c != NULL) fd = (*fp_debuginfod_find_debuginfo) (c, build_id_bits, build_id_len, NULL); @@ -105,7 +108,7 @@ __libdwfl_debuginfod_end (debuginfod_client *c) } /* Try to get the libdebuginfod library functions. - Only needs to be called once from get_client. */ + Only needs to be called once from dwfl_get_debuginfod_client. */ static void __libdwfl_debuginfod_init (void) { @@ -134,3 +137,13 @@ __libdwfl_debuginfod_init (void) } } } + +#else // ENABLE_LIBDEBUGINFOD + +debuginfod_client * +dwfl_get_debuginfod_client (Dwfl *) +{ + return NULL; +} + +#endif // ENABLE_LIBDEBUGINFOD diff --git a/libdwfl/libdwfl.h b/libdwfl/libdwfl.h index c55a8eaa..b323e8fb 100644 --- a/libdwfl/libdwfl.h +++ b/libdwfl/libdwfl.h @@ -49,6 +49,9 @@ typedef struct Dwfl_Thread Dwfl_Thread; PC location described by an FDE belonging to Dwfl_Thread. */ typedef struct Dwfl_Frame Dwfl_Frame; +/* Handle for debuginfod-client connection. */ +typedef struct debuginfod_client debuginfod_client; + /* Callbacks. */ typedef struct { @@ -795,6 +798,13 @@ int dwfl_getthread_frames (Dwfl *dwfl, pid_t tid, bool dwfl_frame_pc (Dwfl_Frame *state, Dwarf_Addr *pc, bool *isactivation) __nonnull_attribute__ (1, 2); +/* Return the internal debuginfod-client connection handle for the DWFL session. + When the client connection has not yet been initialized, it will be done on the + first call to this function. If elfutils is compiled without support for debuginfod, + NULL will be returned. + */ +extern debuginfod_client *dwfl_get_debuginfod_client (Dwfl *dwfl); + #ifdef __cplusplus } #endif diff --git a/libdwfl/libdwflP.h b/libdwfl/libdwflP.h index 7503a627..9f598370 100644 --- a/libdwfl/libdwflP.h +++ b/libdwfl/libdwflP.h @@ -786,6 +786,7 @@ INTDECL (dwfl_getthread_frames) INTDECL (dwfl_getthreads) INTDECL (dwfl_thread_getframes) INTDECL (dwfl_frame_pc) +INTDECL (dwfl_get_debuginfod_client) /* Leading arguments standard to callbacks passed a Dwfl_Module. */ #define MODCB_ARGS(mod) (mod), &(mod)->userdata, (mod)->name, (mod)->low_addr -- 2.37.0 --nextPart3873567.Nxe0qQJ9Tg Content-Type: application/pgp-signature; name="signature.asc" Content-Description: This is a digitally signed message part. Content-Transfer-Encoding: 7Bit -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEezawi1aUvUGg3A1+8zYW/HGdOX8FAmLG8dwACgkQ8zYW/HGd OX/3yhAAzOtdA01E+XI22RXjc18utqLsj+EVoZEFIz732uHNYvlbT+dtlKEWjElp EIfOTO2Zvs4eU5abj32EFQDt47BoVAZvESzZ5fMAg1C+oe4SRxoJXJhZRI+Twx6s Nr5DypPcAFcUMxNjDpCWB+rRrjNoAyFlip6oVjIODaRWDeSb2EkjNa8bg4FwUc74 qdvHS7WhKutib2Wb5SaU75EOCgroQlp5L7oD466Nb6EVk+Jf0UEkstd9L/uyAFas tNEPsYwFr6Zpm4UpxyUmzpKxSgWRNCxQ2UyPcHx+xyRADsa/LQQCl9EfVhwt4NQH XBWW3v39UYamHuQi8xOoVkahWnB68NATOuVRK/qppupGgcKoADCLzORBLm/r27T7 JO8jrvU35ygCpbLMVBYF0s/yDPXiCxu0570K0LFtep1P21ohGc6Bc9KbLI0QR5VF tpTyc9sKgACpeGawCP3quFf1jnxrEWjJY8TwlMujJliu6d3boVlQgeDzES9ucNBl nJ5TDz8XEIw9gInMkVkZpBuT/pvMrWRW/HjbfANJKWjG4ydVc1ds3edaCkysZ9la nk8bPi0TBq/ZyEedXM8/Fo96Ge/pWbDsUphzlC9FTLCFVFYGp/UYcUWo1Cg5/hDq gv8qjOCfWTole3GXccTMG3a0850nLp86eWq03a4SHKfgWY1fPFw= =nwQV -----END PGP SIGNATURE----- --nextPart3873567.Nxe0qQJ9Tg--