X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=liblttng-ust-java-agent%2Fjni%2Fcommon%2Flttng_ust_context.c;h=7ba4403a05588daee1176181671673de08fc4e9f;hb=6ba6fd60507f8e045bdc4f1be14e9d99c6a15f7f;hp=ae478ba3c407c26ccd015ea9a2232454e763c5c7;hpb=e016c06adf51c2e213303343026c2b5d3d7776e1;p=lttng-ust.git diff --git a/liblttng-ust-java-agent/jni/common/lttng_ust_context.c b/liblttng-ust-java-agent/jni/common/lttng_ust_context.c index ae478ba3..7ba4403a 100644 --- a/liblttng-ust-java-agent/jni/common/lttng_ust_context.c +++ b/liblttng-ust-java-agent/jni/common/lttng_ust_context.c @@ -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 += 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 += 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 += 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 += 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 += 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 += 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 += 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; - 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; - lib_ring_buffer_align_ctx(ctx, lttng_alignof(char)); - lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char)); - 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; - lib_ring_buffer_align_ctx(ctx, lttng_alignof(char)); - lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char)); - 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; - lib_ring_buffer_align_ctx(ctx, lttng_alignof(char)); - lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char)); - 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; - lib_ring_buffer_align_ctx(ctx, lttng_alignof(char)); - lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char)); - 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; - lib_ring_buffer_align_ctx(ctx, lttng_alignof(char)); - lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char)); - 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; - lib_ring_buffer_align_ctx(ctx, lttng_alignof(char)); - lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char)); - 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; - lib_ring_buffer_align_ctx(ctx, lttng_alignof(char)); - lttng_chan_buf->ops->event_write(ctx, &sel_char, sizeof(sel_char)); - 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; } - 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); }