Add is_pic field to statedump soinfo event
[lttng-ust.git] / liblttng-ust / lttng-ust-statedump.c
index 0c0a7bddaa5329004e2ced770a0dfc1e7a018577..b160e197376f70116ad6a34e304f399a92daeea0 100644 (file)
@@ -52,6 +52,7 @@ struct soinfo_data {
        size_t build_id_len;
        int vdso;
        uint32_t crc;
+       uint8_t is_pic;
 };
 
 typedef void (*tracepoint_cb)(struct lttng_session *session, void *priv);
@@ -66,14 +67,6 @@ int trace_statedump_event(tracepoint_cb tp_cb, void *owner, void *priv)
        struct cds_list_head *sessionsp;
        struct lttng_session *session;
 
-       /*
-        * UST lock nests within dynamic loader lock.
-        */
-       if (ust_lock()) {
-               ust_unlock();
-               return 1;
-       }
-
        sessionsp = _lttng_get_sessions();
        cds_list_for_each_entry(session, sessionsp, node) {
                if (session->owner != owner)
@@ -82,7 +75,6 @@ int trace_statedump_event(tracepoint_cb tp_cb, void *owner, void *priv)
                        continue;
                tp_cb(session, priv);
        }
-       ust_unlock();
        return 0;
 }
 
@@ -93,7 +85,7 @@ void trace_soinfo_cb(struct lttng_session *session, void *priv)
 
        tracepoint(lttng_ust_statedump, soinfo,
                session, so_data->base_addr_ptr,
-               so_data->resolved_path, so_data->memsz);
+               so_data->resolved_path, so_data->memsz, so_data->is_pic);
 }
 
 static
@@ -156,6 +148,8 @@ int get_elf_info(struct soinfo_data *so_data, int *has_build_id,
                goto end;
        }
 
+       so_data->is_pic = lttng_ust_elf_is_pic(elf);
+
 end:
        lttng_ust_elf_destroy(elf);
        return ret;
@@ -217,9 +211,20 @@ int trace_statedump_end(void *owner)
 static
 int extract_soinfo_events(struct dl_phdr_info *info, size_t size, void *_data)
 {
-       int j;
+       int j, ret = 0;
        struct dl_iterate_data *data = _data;
 
+       /*
+        * UST lock nests within dynamic loader lock.
+        *
+        * Hold this lock across handling of the entire module to
+        * protect memory allocation at early process start, due to
+        * interactions with libc-wrapper lttng malloc instrumentation.
+        */
+       if (ust_lock()) {
+               goto end;
+       }
+
        for (j = 0; j < info->dlpi_phnum; j++) {
                struct soinfo_data so_data;
                char resolved_path[PATH_MAX];
@@ -276,10 +281,12 @@ int extract_soinfo_events(struct dl_phdr_info *info, size_t size, void *_data)
                so_data.owner = data->owner;
                so_data.base_addr_ptr = base_addr_ptr;
                so_data.resolved_path = resolved_path;
-               return trace_baddr(&so_data);
+               ret = trace_baddr(&so_data);
+               break;
        }
-
-       return 0;
+end:
+       ust_unlock();
+       return ret;
 }
 
 /*
This page took 0.041684 seconds and 4 git commands to generate.