Fix: pass private data to context callbacks
[lttng-ust.git] / liblttng-ust-java-agent / jni / common / lttng_ust_context.c
index 43d396d7dda17921f7e90e812838df855db2bf57..7ba4403a05588daee1176181671673de08fc4e9f 100644 (file)
@@ -44,6 +44,12 @@ struct lttng_ust_jni_ctx_entry {
        } value;
 } __attribute__((packed));
 
+struct lttng_ust_jni_provider {
+       struct lttng_ust_registered_context_provider *reg_provider;
+       char *name;
+       struct lttng_ust_context_provider provider;
+};
+
 /* TLS passing context info from JNI to callbacks. */
 __thread struct lttng_ust_jni_tls lttng_ust_context_info_tls;
 
@@ -73,15 +79,15 @@ static struct lttng_ust_jni_ctx_entry *lookup_ctx_by_name(const char *ctx_name)
        return NULL;
 }
 
-static size_t get_size_cb(struct lttng_ust_ctx_field *field, size_t offset)
+static size_t get_size_cb(void *priv, size_t offset)
 {
        struct lttng_ust_jni_ctx_entry *jctx;
        size_t size = 0;
-       const char *ctx_name = field->event_field->name;
+       struct lttng_ust_jni_provider *jni_provider = (struct lttng_ust_jni_provider *) priv;
+       const char *ctx_name = jni_provider->name;
        enum lttng_ust_jni_type jni_type;
 
-
-       size += lttng_ust_lib_ring_buffer_align(offset, lttng_alignof(char));
+       size += lttng_ust_lib_ring_buffer_align(offset, lttng_ust_rb_alignof(char));
        size += sizeof(char);           /* tag */
        jctx = lookup_ctx_by_name(ctx_name);
        if (!jctx) {
@@ -93,28 +99,28 @@ static size_t get_size_cb(struct lttng_ust_ctx_field *field, size_t offset)
        case JNI_TYPE_NULL:
                break;
        case JNI_TYPE_INTEGER:
-               size += lttng_ust_lib_ring_buffer_align(offset, lttng_alignof(int32_t));
+               size += lttng_ust_lib_ring_buffer_align(offset, lttng_ust_rb_alignof(int32_t));
                size += sizeof(int32_t);        /* variant */
                break;
        case JNI_TYPE_LONG:
-               size += lttng_ust_lib_ring_buffer_align(offset, lttng_alignof(int64_t));
+               size += lttng_ust_lib_ring_buffer_align(offset, lttng_ust_rb_alignof(int64_t));
                size += sizeof(int64_t);        /* variant */
                break;
        case JNI_TYPE_DOUBLE:
-               size += lttng_ust_lib_ring_buffer_align(offset, lttng_alignof(double));
+               size += lttng_ust_lib_ring_buffer_align(offset, lttng_ust_rb_alignof(double));
                size += sizeof(double);         /* variant */
                break;
        case JNI_TYPE_FLOAT:
-               size += lttng_ust_lib_ring_buffer_align(offset, lttng_alignof(float));
+               size += lttng_ust_lib_ring_buffer_align(offset, lttng_ust_rb_alignof(float));
                size += sizeof(float);          /* variant */
                break;
        case JNI_TYPE_SHORT:
-               size += lttng_ust_lib_ring_buffer_align(offset, lttng_alignof(int16_t));
+               size += lttng_ust_lib_ring_buffer_align(offset, lttng_ust_rb_alignof(int16_t));
                size += sizeof(int16_t);        /* variant */
                break;
        case JNI_TYPE_BYTE:             /* Fall-through. */
        case JNI_TYPE_BOOLEAN:
-               size += lttng_ust_lib_ring_buffer_align(offset, lttng_alignof(char));
+               size += lttng_ust_lib_ring_buffer_align(offset, lttng_ust_rb_alignof(char));
                size += sizeof(char);           /* variant */
                break;
        case JNI_TYPE_STRING:
@@ -135,12 +141,13 @@ static size_t get_size_cb(struct lttng_ust_ctx_field *field, size_t offset)
 
 }
 
-static void record_cb(struct lttng_ust_ctx_field *field,
+static void record_cb(void *priv,
                 struct lttng_ust_lib_ring_buffer_ctx *ctx,
                 struct lttng_ust_channel_buffer *lttng_chan_buf)
 {
        struct lttng_ust_jni_ctx_entry *jctx;
-       const char *ctx_name = field->event_field->name;
+       struct lttng_ust_jni_provider *jni_provider = (struct lttng_ust_jni_provider *) priv;
+       const char *ctx_name = jni_provider->name;
        enum lttng_ust_jni_type jni_type;
        char sel_char;
 
@@ -154,18 +161,15 @@ static void record_cb(struct lttng_ust_ctx_field *field,
        switch (jni_type) {
        case JNI_TYPE_NULL:
                sel_char = LTTNG_UST_DYNAMIC_TYPE_NONE;
-               lttng_ust_lib_ring_buffer_align_ctx(ctx, lttng_alignof(char));
-               lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char));
+               lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char), lttng_ust_rb_alignof(char));
                break;
        case JNI_TYPE_INTEGER:
        {
                int32_t v = jctx->value._integer;
 
                sel_char = LTTNG_UST_DYNAMIC_TYPE_S32;
-               lttng_ust_lib_ring_buffer_align_ctx(ctx, lttng_alignof(char));
-               lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char));
-               lttng_ust_lib_ring_buffer_align_ctx(ctx, lttng_alignof(v));
-               lttng_chan_buf->ops->event_write(ctx, &v, sizeof(v));
+               lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char), lttng_ust_rb_alignof(char));
+               lttng_chan_buf->ops->event_write(ctx, &v, sizeof(v), lttng_ust_rb_alignof(v));
                break;
        }
        case JNI_TYPE_LONG:
@@ -173,10 +177,8 @@ static void record_cb(struct lttng_ust_ctx_field *field,
                int64_t v = jctx->value._long;
 
                sel_char = LTTNG_UST_DYNAMIC_TYPE_S64;
-               lttng_ust_lib_ring_buffer_align_ctx(ctx, lttng_alignof(char));
-               lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char));
-               lttng_ust_lib_ring_buffer_align_ctx(ctx, lttng_alignof(v));
-               lttng_chan_buf->ops->event_write(ctx, &v, sizeof(v));
+               lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char), lttng_ust_rb_alignof(char));
+               lttng_chan_buf->ops->event_write(ctx, &v, sizeof(v), lttng_ust_rb_alignof(v));
                break;
        }
        case JNI_TYPE_DOUBLE:
@@ -184,10 +186,8 @@ static void record_cb(struct lttng_ust_ctx_field *field,
                double v = jctx->value._double;
 
                sel_char = LTTNG_UST_DYNAMIC_TYPE_DOUBLE;
-               lttng_ust_lib_ring_buffer_align_ctx(ctx, lttng_alignof(char));
-               lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char));
-               lttng_ust_lib_ring_buffer_align_ctx(ctx, lttng_alignof(v));
-               lttng_chan_buf->ops->event_write(ctx, &v, sizeof(v));
+               lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char), lttng_ust_rb_alignof(char));
+               lttng_chan_buf->ops->event_write(ctx, &v, sizeof(v), lttng_ust_rb_alignof(v));
                break;
        }
        case JNI_TYPE_FLOAT:
@@ -195,10 +195,8 @@ static void record_cb(struct lttng_ust_ctx_field *field,
                float v = jctx->value._float;
 
                sel_char = LTTNG_UST_DYNAMIC_TYPE_FLOAT;
-               lttng_ust_lib_ring_buffer_align_ctx(ctx, lttng_alignof(char));
-               lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char));
-               lttng_ust_lib_ring_buffer_align_ctx(ctx, lttng_alignof(v));
-               lttng_chan_buf->ops->event_write(ctx, &v, sizeof(v));
+               lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char), lttng_ust_rb_alignof(char));
+               lttng_chan_buf->ops->event_write(ctx, &v, sizeof(v), lttng_ust_rb_alignof(v));
                break;
        }
        case JNI_TYPE_SHORT:
@@ -206,10 +204,8 @@ static void record_cb(struct lttng_ust_ctx_field *field,
                int16_t v = jctx->value._short;
 
                sel_char = LTTNG_UST_DYNAMIC_TYPE_S16;
-               lttng_ust_lib_ring_buffer_align_ctx(ctx, lttng_alignof(char));
-               lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char));
-               lttng_ust_lib_ring_buffer_align_ctx(ctx, lttng_alignof(v));
-               lttng_chan_buf->ops->event_write(ctx, &v, sizeof(v));
+               lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char), lttng_ust_rb_alignof(char));
+               lttng_chan_buf->ops->event_write(ctx, &v, sizeof(v), lttng_ust_rb_alignof(v));
                break;
        }
        case JNI_TYPE_BYTE:
@@ -217,10 +213,8 @@ static void record_cb(struct lttng_ust_ctx_field *field,
                char v = jctx->value._byte;
 
                sel_char = LTTNG_UST_DYNAMIC_TYPE_S8;
-               lttng_ust_lib_ring_buffer_align_ctx(ctx, lttng_alignof(char));
-               lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char));
-               lttng_ust_lib_ring_buffer_align_ctx(ctx, lttng_alignof(v));
-               lttng_chan_buf->ops->event_write(ctx, &v, sizeof(v));
+               lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char), lttng_ust_rb_alignof(char));
+               lttng_chan_buf->ops->event_write(ctx, &v, sizeof(v), lttng_ust_rb_alignof(v));
                break;
        }
        case JNI_TYPE_BOOLEAN:
@@ -228,10 +222,8 @@ static void record_cb(struct lttng_ust_ctx_field *field,
                char v = jctx->value._boolean;
 
                sel_char = LTTNG_UST_DYNAMIC_TYPE_S8;
-               lttng_ust_lib_ring_buffer_align_ctx(ctx, lttng_alignof(char));
-               lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char));
-               lttng_ust_lib_ring_buffer_align_ctx(ctx, lttng_alignof(v));
-               lttng_chan_buf->ops->event_write(ctx, &v, sizeof(v));
+               lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char), lttng_ust_rb_alignof(char));
+               lttng_chan_buf->ops->event_write(ctx, &v, sizeof(v), lttng_ust_rb_alignof(v));
                break;
        }
        case JNI_TYPE_STRING:
@@ -244,10 +236,9 @@ static void record_cb(struct lttng_ust_ctx_field *field,
                        } else {
                                sel_char = LTTNG_UST_DYNAMIC_TYPE_NONE;
                        }
-                       lttng_ust_lib_ring_buffer_align_ctx(ctx, lttng_alignof(char));
-                       lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char));
+                       lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char), lttng_ust_rb_alignof(char));
                        if (str) {
-                               lttng_chan_buf->ops->event_write(ctx, str, strlen(str) + 1);
+                               lttng_chan_buf->ops->event_write(ctx, str, strlen(str) + 1, 1);
                        }
                        break;
        }
@@ -256,11 +247,11 @@ static void record_cb(struct lttng_ust_ctx_field *field,
        }
 }
 
-static void get_value_cb(struct lttng_ust_ctx_field *field,
-               struct lttng_ust_ctx_value *value)
+static void get_value_cb(void *priv, struct lttng_ust_ctx_value *value)
 {
+       struct lttng_ust_jni_provider *jni_provider = (struct lttng_ust_jni_provider *) priv;
        struct lttng_ust_jni_ctx_entry *jctx;
-       const char *ctx_name = field->event_field->name;
+       const char *ctx_name = jni_provider->name;
        enum lttng_ust_jni_type jni_type;
 
        jctx = lookup_ctx_by_name(ctx_name);
@@ -327,13 +318,14 @@ static void get_value_cb(struct lttng_ust_ctx_field *field,
  * so we create and register a corresponding provider on the C side.
  */
 JNIEXPORT jlong JNICALL Java_org_lttng_ust_agent_context_LttngContextApi_registerProvider(JNIEnv *env,
-                                               jobject jobj,
+                                               jobject jobj __attribute__((unused)),
                                                jstring provider_name)
 {
        jboolean iscopy;
        const char *provider_name_jstr;
        char *provider_name_cstr;
        struct lttng_ust_context_provider *provider;
+       struct lttng_ust_jni_provider *jni_provider;
        /*
         * Note: a "jlong" is 8 bytes on all architectures, whereas a
         * C "long" varies.
@@ -350,26 +342,30 @@ JNIEXPORT jlong JNICALL Java_org_lttng_ust_agent_context_LttngContextApi_registe
        if (!provider_name_cstr) {
                goto error_strdup;
        }
-       provider = zmalloc(sizeof(*provider));
-       if (!provider) {
+       jni_provider = zmalloc(sizeof(*jni_provider));
+       if (!jni_provider) {
                goto error_provider;
        }
+       provider = &jni_provider->provider;
        provider->struct_size = sizeof(*provider);
-       provider->name = provider_name_cstr;
+       jni_provider->name = provider_name_cstr;
+       provider->name = jni_provider->name;
        provider->get_size = get_size_cb;
        provider->record = record_cb;
        provider->get_value = get_value_cb;
+       provider->priv = jni_provider;
 
-       if (lttng_ust_context_provider_register(provider)) {
+       jni_provider->reg_provider = lttng_ust_context_provider_register(provider);
+       if (!jni_provider->reg_provider) {
                goto error_register;
        }
 
-       provider_ref = (jlong) (long) provider;
+       provider_ref = (jlong) (long) jni_provider;
        return provider_ref;
 
        /* Error handling. */
 error_register:
-       free(provider);
+       free(jni_provider);
 error_provider:
        free(provider_name_cstr);
 error_strdup:
@@ -383,19 +379,19 @@ error_jstr:
  * Called from the Java side when an application unregisters a context retriever,
  * so we unregister and delete the corresponding provider on the C side.
  */
-JNIEXPORT void JNICALL Java_org_lttng_ust_agent_context_LttngContextApi_unregisterProvider(JNIEnv *env,
-                                               jobject jobj,
+JNIEXPORT void JNICALL Java_org_lttng_ust_agent_context_LttngContextApi_unregisterProvider(JNIEnv *env __attribute__((unused)),
+                                               jobject jobj __attribute__((unused)),
                                                jlong provider_ref)
 {
-       struct lttng_ust_context_provider *provider =
-                       (struct lttng_ust_context_provider*) (unsigned long) provider_ref;
+       struct lttng_ust_jni_provider *jni_provider =
+                       (struct lttng_ust_jni_provider *) (unsigned long) provider_ref;
 
-       if (!provider) {
+       if (!jni_provider) {
                return;
        }
 
-       lttng_ust_context_provider_unregister(provider);
+       lttng_ust_context_provider_unregister(jni_provider->reg_provider);
 
-       free(provider->name);
-       free(provider);
+       free(jni_provider->name);
+       free(jni_provider);
 }
This page took 0.027123 seconds and 4 git commands to generate.