]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
Introduce public dwfl_get_debuginfod_client API
authorMilian Wolff <mail@milianw.de>
Thu, 7 Jul 2022 17:33:35 +0000 (19:33 +0200)
committerAaron Merey <amerey@redhat.com>
Wed, 13 Jul 2022 18:15:28 +0000 (14:15 -0400)
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 <mail@milianw.de>
libdw/libdw.map
libdwfl/ChangeLog
libdwfl/Makefile.am
libdwfl/debuginfod-client.c
libdwfl/libdwfl.h
libdwfl/libdwflP.h

index 4f530378ef2d94f7a86026f45ae6e2f0d5174f8b..3fdf3f936716ef6e81c0660d671bf86cc1f080a5 100644 (file)
@@ -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;
index b3ca56cb4e3c8ee738a0cb081a25ccfd6af78584..890df156e6a93f085a6185e25a5d563983438fcc 100644 (file)
@@ -1,3 +1,8 @@
+2022-06-22  Milian Wolff <mail@milianw.de>
+
+       * 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  <mark@klomp.org>
 
        * libdwfl.h (dwfl_module_addrinfo): Update docs and nonnull
index a0013e410bb62ca2fc626884baa9cbe05b5145ff..3278358d80271053bd9f7095ba2dbd0eeb803ce5 100644 (file)
@@ -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
index 153260c3febca031f25a7ddc390d8abd94efd532..813043b13123c51d4ca6710e915012d70f80f905 100644 (file)
@@ -32,6 +32,9 @@
 #endif
 
 #include "libdwflP.h"
+
+#ifdef ENABLE_LIBDEBUGINFOD
+
 #include <pthread.h>
 #include <dlfcn.h>
 
@@ -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
index c55a8eaa3907c0f6d699e6bea37ec471c82b1cc1..b323e8fb9f017363ad71cf1c1f89650750cea52e 100644 (file)
@@ -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
index 7503a6273065b8614ffa4d75fe90514522109dbf..9f598370f9d3703a8d88fb4eb939db3d3fa365cc 100644 (file)
@@ -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