Move to kernel style SPDX license identifiers
[lttng-ust.git] / liblttng-ust / lttng-context-vpid.c
index db76747a6445c9beb8cbd07ba0940b79fbb60e24..d4b4a2cf9da81414f949f584d2d9cc1bb65fda23 100644 (file)
@@ -1,29 +1,19 @@
 /*
- * (C) Copyright       2009-2011 -
- *             Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ * SPDX-License-Identifier: LGPL-2.1-only
  *
- * LTTng UST vpid context.
+ * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
  *
- * Dual LGPL v2.1/GPL v2 license.
+ * LTTng UST vpid context.
  */
 
+#define _LGPL_SOURCE
+#include <stddef.h>
 #include <sys/types.h>
 #include <unistd.h>
 #include <lttng/ust-events.h>
 #include <lttng/ust-tracer.h>
 #include <lttng/ringbuffer-config.h>
 
-#ifdef __linux__
-static inline
-pid_t wrapper_getpid(void)
-{
-       return getpid();
-}
-
-void lttng_context_vpid_reset(void)
-{
-}
-#else
 /*
  * We cache the result to ensure we don't trigger a system call for
  * each event.
@@ -31,11 +21,16 @@ void lttng_context_vpid_reset(void)
 static pid_t cached_vpid;
 
 static inline
-pid_t wrapper_getpid(void)
+pid_t wrapper_getvpid(void)
 {
-       if (caa_unlikely(!cached_vpid))
-               cached_vpid = getpid();
-       return cached_vpid;
+       pid_t vpid;
+
+       vpid = CMM_LOAD_SHARED(cached_vpid);
+       if (caa_unlikely(!vpid)) {
+               vpid = getpid();
+               CMM_STORE_SHARED(cached_vpid, vpid);
+       }
+       return vpid;
 }
 
 /*
@@ -44,12 +39,11 @@ pid_t wrapper_getpid(void)
  */
 void lttng_context_vpid_reset(void)
 {
-       cached_vpid = 0;
+       CMM_STORE_SHARED(cached_vpid, 0);
 }
-#endif
 
 static
-size_t vpid_get_size(size_t offset)
+size_t vpid_get_size(struct lttng_ctx_field *field, size_t offset)
 {
        size_t size = 0;
 
@@ -61,13 +55,19 @@ size_t vpid_get_size(size_t offset)
 static
 void vpid_record(struct lttng_ctx_field *field,
                 struct lttng_ust_lib_ring_buffer_ctx *ctx,
-                struct ltt_channel *chan)
+                struct lttng_channel *chan)
 {
-       pid_t pid;
+       pid_t vpid = wrapper_getvpid();
 
-       pid = wrapper_getpid();
-       lib_ring_buffer_align_ctx(ctx, lttng_alignof(pid));
-       chan->ops->event_write(ctx, &pid, sizeof(pid));
+       lib_ring_buffer_align_ctx(ctx, lttng_alignof(vpid));
+       chan->ops->event_write(ctx, &vpid, sizeof(vpid));
+}
+
+static
+void vpid_get_value(struct lttng_ctx_field *field,
+               struct lttng_ctx_value *value)
+{
+       value->u.s64 = wrapper_getvpid();
 }
 
 int lttng_add_vpid_to_ctx(struct lttng_ctx **ctx)
@@ -83,13 +83,15 @@ int lttng_add_vpid_to_ctx(struct lttng_ctx **ctx)
        }
        field->event_field.name = "vpid";
        field->event_field.type.atype = atype_integer;
-       field->event_field.type.u.basic.integer.size = sizeof(pid_t) * CHAR_BIT;
-       field->event_field.type.u.basic.integer.alignment = lttng_alignof(pid_t) * CHAR_BIT;
-       field->event_field.type.u.basic.integer.signedness = lttng_is_signed_type(pid_t);
-       field->event_field.type.u.basic.integer.reverse_byte_order = 0;
-       field->event_field.type.u.basic.integer.base = 10;
-       field->event_field.type.u.basic.integer.encoding = lttng_encode_none;
+       field->event_field.type.u.integer.size = sizeof(pid_t) * CHAR_BIT;
+       field->event_field.type.u.integer.alignment = lttng_alignof(pid_t) * CHAR_BIT;
+       field->event_field.type.u.integer.signedness = lttng_is_signed_type(pid_t);
+       field->event_field.type.u.integer.reverse_byte_order = 0;
+       field->event_field.type.u.integer.base = 10;
+       field->event_field.type.u.integer.encoding = lttng_encode_none;
        field->get_size = vpid_get_size;
        field->record = vpid_record;
+       field->get_value = vpid_get_value;
+       lttng_context_update(*ctx);
        return 0;
 }
This page took 0.025621 seconds and 4 git commands to generate.