Cleanup vtid/vpid context caches
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 14 Feb 2019 20:47:34 +0000 (15:47 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 14 Feb 2019 20:47:34 +0000 (15:47 -0500)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
liblttng-ust/lttng-context-vpid.c
liblttng-ust/lttng-context-vtid.c

index 53fb314b8c0da1bdf353f00c59c953879b4ed150..11978e6e33d8e0f93ac4fb0bd34e12495790d7e4 100644 (file)
 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;
 }
 
 /*
@@ -47,7 +52,7 @@ pid_t wrapper_getpid(void)
  */
 void lttng_context_vpid_reset(void)
 {
-       cached_vpid = 0;
+       CMM_STORE_SHARED(cached_vpid, 0);
 }
 
 static
@@ -65,21 +70,17 @@ void vpid_record(struct lttng_ctx_field *field,
                 struct lttng_ust_lib_ring_buffer_ctx *ctx,
                 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)
 {
-       pid_t pid;
-
-       pid = wrapper_getpid();
-       value->u.s64 = pid;
+       value->u.s64 = wrapper_getvpid();
 }
 
 int lttng_add_vpid_to_ctx(struct lttng_ctx **ctx)
index f28e470a38c91be3e88c7b1d1fcd42c591d73c67..5cefe9538486a38ffba957fe06b8601b907ff744 100644 (file)
@@ -43,7 +43,7 @@ static DEFINE_URCU_TLS(pid_t, cached_vtid);
  */
 void lttng_context_vtid_reset(void)
 {
-       URCU_TLS(cached_vtid) = 0;
+       CMM_STORE_SHARED(URCU_TLS(cached_vtid), 0);
 }
 
 static
@@ -56,25 +56,35 @@ size_t vtid_get_size(struct lttng_ctx_field *field, size_t offset)
        return size;
 }
 
+static inline
+pid_t wrapper_getvtid(void)
+{
+       pid_t vtid;
+
+       vtid = CMM_LOAD_SHARED(URCU_TLS(cached_vtid));
+       if (caa_unlikely(!vtid)) {
+               vtid = getpid();
+               CMM_STORE_SHARED(URCU_TLS(cached_vtid), vtid);
+       }
+       return vtid;
+}
+
 static
 void vtid_record(struct lttng_ctx_field *field,
                 struct lttng_ust_lib_ring_buffer_ctx *ctx,
                 struct lttng_channel *chan)
 {
-       if (caa_unlikely(!URCU_TLS(cached_vtid)))
-               URCU_TLS(cached_vtid) = gettid();
-       lib_ring_buffer_align_ctx(ctx, lttng_alignof(URCU_TLS(cached_vtid)));
-       chan->ops->event_write(ctx, &URCU_TLS(cached_vtid),
-               sizeof(URCU_TLS(cached_vtid)));
+       pid_t vtid = wrapper_getvtid();
+
+       lib_ring_buffer_align_ctx(ctx, lttng_alignof(vtid));
+       chan->ops->event_write(ctx, &vtid, sizeof(vtid));
 }
 
 static
 void vtid_get_value(struct lttng_ctx_field *field,
                struct lttng_ctx_value *value)
 {
-       if (caa_unlikely(!URCU_TLS(cached_vtid)))
-               URCU_TLS(cached_vtid) = gettid();
-       value->u.s64 = URCU_TLS(cached_vtid);
+       value->u.s64 = wrapper_getvtid();
 }
 
 int lttng_add_vtid_to_ctx(struct lttng_ctx **ctx)
This page took 0.033498 seconds and 4 git commands to generate.