Refactoring: remove struct_size from struct lttng_ust_ctx_value
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 17 Mar 2021 02:12:13 +0000 (22:12 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 17 Mar 2021 02:12:13 +0000 (22:12 -0400)
The struct_size scheme is not appropriate to extend struct
lttng_ust_ctx_value because its type selector and union already
act as a mean to extend it. When new entries are added to the union,
the size of that union may increase, thus shifting the offset of
fields following that union. It is therefore not possible to extend
it by adding fields after the union, thus making the struct_size
scheme irrelevant.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I9e80e0ea87c3df3fe76863ed5343de733210045e

include/ust-context-provider.h
liblttng-ust/lttng-bytecode-interpreter.c

index 3b41a66e5322f610dac233565b9a912dab54afec..e62950e1e81c7b9b7d7b77e9a62eb3ca7dd60356 100644 (file)
  * Context value
  *
  * IMPORTANT: this structure is part of the ABI between the probe and
- * UST. Fields need to be only added at the end, never reordered, never
- * removed.
- *
- * The field @struct_size should be used to determine the size of the
- * structure. It should be queried before using additional fields added
- * at the end of the structure.
+ * UST. Additional selectors may be added in the future, mapping to new
+ * union fields, which means the overall size of this structure may
+ * increase. This means this structure should never be nested within a
+ * public structure interface, nor embedded in an array.
  */
 
 struct lttng_ust_ctx_value {
-       uint32_t struct_size;
-
-       enum lttng_ust_dynamic_type sel;
+       enum lttng_ust_dynamic_type sel;        /* Type selector */
        union {
                int64_t s64;
                uint64_t u64;
                const char *str;
                double d;
        } u;
-
-       /* End of base ABI. Fields below should be used after checking struct_size. */
 };
 
 /*
index 5b2dc51a05950b0c951a6a54d887d2ae618977ef..947da3eede2d8f86293781c1e74132c50f4079ec 100644 (file)
@@ -226,7 +226,6 @@ static int context_get_index(struct lttng_ust_ctx *ctx,
        struct lttng_ust_event_field *field;
        struct lttng_ust_ctx_value v;
 
-       v.struct_size = sizeof(struct lttng_ust_ctx_value);
        ctx_field = ctx->fields[idx];
        field = ctx_field->event_field;
        ptr->type = LOAD_OBJECT;
@@ -2140,7 +2139,6 @@ uint64_t bytecode_interpret(void *interpreter_data,
                        struct lttng_ust_ctx_field *ctx_field;
                        struct lttng_ust_ctx_value v;
 
-                       v.struct_size = sizeof(struct lttng_ust_ctx_value);
                        dbg_printf("get context ref offset %u type dynamic\n",
                                ref->offset);
                        ctx_field = ctx->fields[ref->offset];
@@ -2189,7 +2187,6 @@ uint64_t bytecode_interpret(void *interpreter_data,
                        struct lttng_ust_ctx_field *ctx_field;
                        struct lttng_ust_ctx_value v;
 
-                       v.struct_size = sizeof(struct lttng_ust_ctx_value);
                        dbg_printf("get context ref offset %u type string\n",
                                ref->offset);
                        ctx_field = ctx->fields[ref->offset];
@@ -2217,7 +2214,6 @@ uint64_t bytecode_interpret(void *interpreter_data,
                        struct lttng_ust_ctx_field *ctx_field;
                        struct lttng_ust_ctx_value v;
 
-                       v.struct_size = sizeof(struct lttng_ust_ctx_value);
                        dbg_printf("get context ref offset %u type s64\n",
                                ref->offset);
                        ctx_field = ctx->fields[ref->offset];
@@ -2237,7 +2233,6 @@ uint64_t bytecode_interpret(void *interpreter_data,
                        struct lttng_ust_ctx_field *ctx_field;
                        struct lttng_ust_ctx_value v;
 
-                       v.struct_size = sizeof(struct lttng_ust_ctx_value);
                        dbg_printf("get context ref offset %u type double\n",
                                ref->offset);
                        ctx_field = ctx->fields[ref->offset];
This page took 0.028852 seconds and 4 git commands to generate.