Add get proc name wrapper for FreeBSD
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 21 Feb 2012 00:52:30 +0000 (19:52 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 22 Feb 2012 22:27:24 +0000 (17:27 -0500)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
liblttng-ust/compat.h
liblttng-ust/ltt-events.c
liblttng-ust/lttng-context-procname.c
liblttng-ust/lttng-ust-comm.c

index 8ee4470a0b381289986e48742274fa287d835e1a..05b85a930615516da7175af84661ce144f7d5127 100644 (file)
  * modified is included with the above copyright notice.
  */
 
-#include <sys/syscall.h>
+/*
+ * sched_getcpu.
+ */
+#ifdef __linux__
 
 #ifdef __UCLIBC__
+#include <sys/syscall.h>
 #define __getcpu(cpu, node, cache)     syscall(__NR_getcpu, cpu, node, cache)
 static inline
 int sched_getcpu(void)
@@ -27,4 +31,50 @@ int sched_getcpu(void)
        return (s == -1) ? s : c;
 }
 #endif /* __UCLIBC__ */
+
+#else
+#error "Please add support for your OS into liblttng-ust/compat.h."
+#endif
+
+/*
+ * lttng_ust_getprocname.
+ */
+#ifdef __linux__
+
+#include <sys/prctl.h>
+
+#define LTTNG_UST_PROCNAME_LEN 17
+
+static inline
+void lttng_ust_getprocname(char *name)
+{
+       (void) prctl(PR_GET_NAME, (unsigned long) name, 0, 0, 0);
+}
+
+#elif defined(__FreeBSD__)
+#include <stdlib.h>
+#include <string.h>
+
+/*
+ * Limit imposed by Linux UST-sessiond ABI.
+ */
+#define LTTNG_UST_PROCNAME_LEN 17
+
+/*
+ * Acts like linux prctl, the string is not necessarily 0-terminated if
+ * 16-byte long.
+ */
+static inline
+void lttng_ust_getprocname(char *name)
+{
+       const char *bsd_name;
+
+       bsd_name = getprogname();
+       if (!bsd_name)
+               name[0] = '\0';
+       memcpy(name, bsd_name, LTTNG_UST_PROCNAME_LEN - 1);
+}
+
+#endif
+
 #endif /* _UST_COMPAT_H */
index e42b6de64314c914a1c67908f128e628bd2b1ad1..c9d35dde199e11929e6307cfe3eb31c1dc272406 100644 (file)
@@ -21,7 +21,6 @@
 #include <stddef.h>
 #include <inttypes.h>
 #include <time.h>
-#include <sys/prctl.h>
 #include <lttng/ust-endian.h>
 #include "clock.h"
 
@@ -36,6 +35,7 @@
 #include <usterr-signal-safe.h>
 #include <helper.h>
 #include "error.h"
+#include "compat.h"
 
 #include "tracepoint-internal.h"
 #include "ltt-tracer.h"
@@ -44,8 +44,6 @@
 #include "../libringbuffer/shm.h"
 #include "jhash.h"
 
-#define PROCNAME_LEN 17
-
 /*
  * The sessions mutex is the centralized mutex across UST tracing
  * control and probe registration. All operations within this file are
@@ -1093,7 +1091,7 @@ int _ltt_session_metadata_statedump(struct ltt_session *session)
        struct ltt_channel *chan;
        struct ltt_event *event;
        int ret = 0;
-       char procname[PROCNAME_LEN] = "";
+       char procname[LTTNG_UST_PROCNAME_LEN] = "";
 
        if (!CMM_ACCESS_ONCE(session->active))
                return 0;
@@ -1147,8 +1145,8 @@ int _ltt_session_metadata_statedump(struct ltt_session *session)
                goto end;
 
        /* ignore error, just use empty string if error. */
-       (void) prctl(PR_GET_NAME, (unsigned long) procname, 0, 0, 0);
-       procname[PROCNAME_LEN - 1] = '\0';
+       lttng_ust_getprocname(procname);
+       procname[LTTNG_UST_PROCNAME_LEN - 1] = '\0';
        ret = lttng_metadata_printf(session,
                "env {\n"
                "       vpid = %d;\n"
index b9bae82eba91be79fdd2ca1749fe2e5f2066b570..b737084bf69aae013cee43c11e7ffa3484067ce5 100644 (file)
@@ -7,13 +7,11 @@
  * Dual LGPL v2.1/GPL v2 license.
  */
 
-#include <sys/prctl.h>
 #include <lttng/ust-events.h>
 #include <lttng/ust-tracer.h>
 #include <lttng/ringbuffer-config.h>
 #include <assert.h>
-
-#define PROCNAME_LEN   17      /* includes \0 */
+#include "compat.h"
 
 /*
  * We cache the result to ensure we don't trigger a system call for
@@ -26,12 +24,9 @@ static char cached_procname[17];
 static inline
 char *wrapper_getprocname(void)
 {
-       int ret;
-
        if (caa_unlikely(!cached_procname[0])) {
-               ret = prctl(PR_GET_NAME, (unsigned long) cached_procname,
-                       0, 0, 0);
-               assert(!ret);
+               lttng_ust_getprocname(cached_procname);
+               cached_procname[LTTNG_UST_PROCNAME_LEN - 1] = '\0';
        }
        return cached_procname;
 }
@@ -46,7 +41,7 @@ size_t procname_get_size(size_t offset)
 {
        size_t size = 0;
 
-       size += PROCNAME_LEN;
+       size += LTTNG_UST_PROCNAME_LEN;
        return size;
 }
 
@@ -58,7 +53,7 @@ void procname_record(struct lttng_ctx_field *field,
        char *procname;
 
        procname = wrapper_getprocname();
-       chan->ops->event_write(ctx, procname, PROCNAME_LEN);
+       chan->ops->event_write(ctx, procname, LTTNG_UST_PROCNAME_LEN);
 }
 
 int lttng_add_procname_to_ctx(struct lttng_ctx **ctx)
@@ -81,7 +76,7 @@ int lttng_add_procname_to_ctx(struct lttng_ctx **ctx)
        field->event_field.type.u.array.elem_type.u.basic.integer.reverse_byte_order = 0;
        field->event_field.type.u.array.elem_type.u.basic.integer.base = 10;
        field->event_field.type.u.array.elem_type.u.basic.integer.encoding = lttng_encode_UTF8;
-       field->event_field.type.u.array.length = PROCNAME_LEN;
+       field->event_field.type.u.array.length = LTTNG_UST_PROCNAME_LEN;
        field->get_size = procname_get_size;
        field->record = procname_record;
        return 0;
index b3567dda36f0c14042546f41d62656fcbadf79f0..86cce18d57fe658588db907ed8016f39e95f975f 100644 (file)
@@ -22,7 +22,6 @@
 #define _LGPL_SOURCE
 #include <sys/types.h>
 #include <sys/socket.h>
-#include <sys/prctl.h>
 #include <sys/mman.h>
 #include <sys/stat.h>
 #include <sys/types.h>
@@ -46,6 +45,7 @@
 #include <usterr-signal-safe.h>
 #include "tracepoint-internal.h"
 #include "ltt-tracer-core.h"
+#include "compat.h"
 
 /*
  * Has lttng ust comm constructor been called ?
@@ -159,7 +159,6 @@ static
 int register_app_to_sessiond(int socket)
 {
        ssize_t ret;
-       int prctl_ret;
        struct {
                uint32_t major;
                uint32_t minor;
@@ -178,11 +177,7 @@ int register_app_to_sessiond(int socket)
        reg_msg.uid = getuid();
        reg_msg.gid = getgid();
        reg_msg.bits_per_long = CAA_BITS_PER_LONG;
-       prctl_ret = prctl(PR_GET_NAME, (unsigned long) reg_msg.name, 0, 0, 0);
-       if (prctl_ret) {
-               ERR("Error executing prctl");
-               return -errno;
-       }
+       lttng_ust_getprocname(reg_msg.name);
 
        ret = ustcomm_send_unix_sock(socket, &reg_msg, sizeof(reg_msg));
        if (ret >= 0 && ret != sizeof(reg_msg))
This page took 0.029613 seconds and 4 git commands to generate.