#include "wait.h"
#include "../libringbuffer/shm.h"
#include "../libringbuffer/frontend_types.h"
+#include "../libringbuffer/frontend.h"
#include "../libcounter/counter.h"
#include "jhash.h"
#include <lttng/ust-abi.h>
+#include "context-provider-internal.h"
/*
* All operations within this file are called by the communication
void register_event(struct lttng_ust_event_common *event)
{
int ret;
- struct lttng_ust_event_desc *desc;
+ const struct lttng_ust_event_desc *desc;
char name[LTTNG_UST_ABI_SYM_NAME_LEN];
assert(event->priv->registered == 0);
void unregister_event(struct lttng_ust_event_common *event)
{
int ret;
- struct lttng_ust_event_desc *desc;
+ const struct lttng_ust_event_desc *desc;
char name[LTTNG_UST_ABI_SYM_NAME_LEN];
assert(event->priv->registered == 1);
}
static
-int lttng_enum_create(struct lttng_ust_enum_desc *desc,
+int lttng_enum_create(const struct lttng_ust_enum_desc *desc,
struct lttng_ust_session *session)
{
const char *enum_name = desc->name;
}
static
-int lttng_create_enum_check(struct lttng_ust_type_common *type,
+int lttng_create_enum_check(const struct lttng_ust_type_common *type,
struct lttng_ust_session *session)
{
switch (type->type) {
case lttng_ust_type_enum:
{
- struct lttng_ust_enum_desc *enum_desc;
+ const struct lttng_ust_enum_desc *enum_desc;
int ret;
enum_desc = lttng_ust_get_type_enum(type)->desc;
}
case lttng_ust_type_dynamic:
{
- struct lttng_ust_event_field *tag_field_generic;
- struct lttng_ust_enum_desc *enum_desc;
+ const struct lttng_ust_event_field *tag_field_generic;
+ const struct lttng_ust_enum_desc *enum_desc;
int ret;
tag_field_generic = lttng_ust_dynamic_type_tag_field();
static
int lttng_create_all_event_enums(size_t nr_fields,
- struct lttng_ust_event_field **event_fields,
+ const struct lttng_ust_event_field **event_fields,
struct lttng_ust_session *session)
{
size_t i;
/* For each field, ensure enum is part of the session. */
for (i = 0; i < nr_fields; i++) {
- struct lttng_ust_type_common *type = event_fields[i]->type;
+ const struct lttng_ust_type_common *type = event_fields[i]->type;
ret = lttng_create_enum_check(type, session);
if (ret)
static
int lttng_create_all_ctx_enums(size_t nr_fields,
- struct lttng_ust_ctx_field **ctx_fields,
+ struct lttng_ust_ctx_field *ctx_fields,
struct lttng_ust_session *session)
{
size_t i;
/* For each field, ensure enum is part of the session. */
for (i = 0; i < nr_fields; i++) {
- struct lttng_ust_type_common *type = ctx_fields[i]->event_field->type;
+ const struct lttng_ust_type_common *type = ctx_fields[i].event_field->type;
ret = lttng_create_enum_check(type, session);
if (ret)
*/
cds_list_for_each_entry(chan, &session->priv->chan_head, node) {
struct lttng_ust_ctx *ctx;
- struct lttng_ust_ctx_field **fields = NULL;
+ struct lttng_ust_ctx_field *fields = NULL;
size_t nr_fields = 0;
uint32_t chan_id;
struct cds_hlist_head *borrow_hash_table_bucket(
struct cds_hlist_head *hash_table,
unsigned int hash_table_size,
- struct lttng_ust_event_desc *desc)
+ const struct lttng_ust_event_desc *desc)
{
char name[LTTNG_UST_ABI_SYM_NAME_LEN];
size_t name_len;
* Supports event creation while tracing session is active.
*/
static
-int lttng_event_recorder_create(struct lttng_ust_event_desc *desc,
+int lttng_event_recorder_create(const struct lttng_ust_event_desc *desc,
struct lttng_ust_channel_buffer *chan)
{
char name[LTTNG_UST_ABI_SYM_NAME_LEN];
desc->nr_fields,
desc->fields,
uri,
- &event_recorder->id);
+ &event_recorder->priv->id);
if (ret < 0) {
DBG("Error (%d) registering event to sessiond", ret);
goto sessiond_register_error;
}
static
-int lttng_event_notifier_create(struct lttng_ust_event_desc *desc,
+int lttng_event_notifier_create(const struct lttng_ust_event_desc *desc,
uint64_t token, uint64_t error_counter_index,
struct lttng_event_notifier_group *event_notifier_group)
{
}
static
-int lttng_desc_match_star_glob_enabler(struct lttng_ust_event_desc *desc,
+int lttng_desc_match_star_glob_enabler(const struct lttng_ust_event_desc *desc,
struct lttng_enabler *enabler)
{
char name[LTTNG_UST_ABI_SYM_NAME_LEN];
}
static
-int lttng_desc_match_event_enabler(struct lttng_ust_event_desc *desc,
+int lttng_desc_match_event_enabler(const struct lttng_ust_event_desc *desc,
struct lttng_enabler *enabler)
{
char name[LTTNG_UST_ABI_SYM_NAME_LEN];
}
static
-int lttng_desc_match_enabler(struct lttng_ust_event_desc *desc,
+int lttng_desc_match_enabler(const struct lttng_ust_event_desc *desc,
struct lttng_enabler *enabler)
{
switch (enabler->format_type) {
void lttng_create_event_recorder_if_missing(struct lttng_event_enabler *event_enabler)
{
struct lttng_ust_session *session = event_enabler->chan->parent->session;
- struct lttng_ust_probe_desc *probe_desc;
- struct lttng_ust_event_desc *desc;
+ struct lttng_ust_registered_probe *reg_probe;
+ const struct lttng_ust_event_desc *desc;
struct lttng_ust_event_recorder_private *event_recorder_priv;
int i;
struct cds_list_head *probe_list;
* our enabler, create an associated lttng_event if not
* already present.
*/
- cds_list_for_each_entry(probe_desc, probe_list, head) {
+ cds_list_for_each_entry(reg_probe, probe_list, head) {
+ const struct lttng_ust_probe_desc *probe_desc = reg_probe->desc;
+
for (i = 0; i < probe_desc->nr_events; i++) {
int ret;
bool found = false;
}
static
-void probe_provider_event_for_each(struct lttng_ust_probe_desc *provider_desc,
+void probe_provider_event_for_each(const struct lttng_ust_probe_desc *provider_desc,
void (*event_func)(struct lttng_ust_event_common *event))
{
struct cds_hlist_node *node, *tmp_node;
* sessions to queue the unregistration of the events.
*/
for (i = 0; i < provider_desc->nr_events; i++) {
- struct lttng_ust_event_desc *event_desc;
+ const struct lttng_ust_event_desc *event_desc;
struct lttng_event_notifier_group *event_notifier_group;
struct lttng_ust_event_recorder_private *event_recorder_priv;
struct lttng_ust_event_notifier_private *event_notifier_priv;
/* Destroy enums of the current event. */
for (i = 0; i < event_recorder->parent->priv->desc->nr_fields; i++) {
- struct lttng_ust_enum_desc *enum_desc;
- struct lttng_ust_event_field *field;
+ const struct lttng_ust_enum_desc *enum_desc;
+ const struct lttng_ust_event_field *field;
struct lttng_enum *curr_enum;
field = event_recorder->parent->priv->desc->fields[i];
* ust_lock held.
*/
void lttng_probe_provider_unregister_events(
- struct lttng_ust_probe_desc *provider_desc)
+ const struct lttng_ust_probe_desc *provider_desc)
{
/*
* Iterate over all events in the probe provider descriptions and sessions
}
}
-int lttng_event_enabler_attach_context(struct lttng_event_enabler *enabler,
- struct lttng_ust_abi_context *context_param)
+int lttng_event_enabler_attach_context(
+ struct lttng_event_enabler *enabler __attribute__((unused)),
+ struct lttng_ust_abi_context *context_param __attribute__((unused)))
{
return -ENOSYS;
}
/* Support for event notifier is introduced by probe provider major version 2. */
static
-bool lttng_ust_probe_supports_event_notifier(struct lttng_ust_probe_desc *probe_desc)
+bool lttng_ust_probe_supports_event_notifier(const struct lttng_ust_probe_desc *probe_desc)
{
return probe_desc->major >= 2;
}
struct lttng_event_notifier_enabler *event_notifier_enabler)
{
struct lttng_event_notifier_group *event_notifier_group = event_notifier_enabler->group;
- struct lttng_ust_probe_desc *probe_desc;
+ struct lttng_ust_registered_probe *reg_probe;
struct cds_list_head *probe_list;
int i;
probe_list = lttng_get_probe_list_head();
- cds_list_for_each_entry(probe_desc, probe_list, head) {
+ cds_list_for_each_entry(reg_probe, probe_list, head) {
+ const struct lttng_ust_probe_desc *probe_desc = reg_probe->desc;
+
for (i = 0; i < probe_desc->nr_events; i++) {
int ret;
bool found = false;
- struct lttng_ust_event_desc *desc;
+ const struct lttng_ust_event_desc *desc;
struct lttng_ust_event_notifier_private *event_notifier_priv;
struct cds_hlist_head *head;
struct cds_hlist_node *node;
* context (either app context callbacks, or dummy callbacks).
*/
void lttng_ust_context_set_session_provider(const char *name,
- size_t (*get_size)(struct lttng_ust_ctx_field *field, size_t offset),
- void (*record)(struct lttng_ust_ctx_field *field,
- struct lttng_ust_lib_ring_buffer_ctx *ctx,
+ size_t (*get_size)(void *priv, size_t offset),
+ void (*record)(void *priv, struct lttng_ust_lib_ring_buffer_ctx *ctx,
struct lttng_ust_channel_buffer *chan),
- void (*get_value)(struct lttng_ust_ctx_field *field,
- struct lttng_ust_ctx_value *value))
+ void (*get_value)(void *priv, struct lttng_ust_ctx_value *value),
+ void *priv)
{
struct lttng_ust_session_private *session_priv;
int ret;
ret = lttng_ust_context_set_provider_rcu(&session_priv->ctx,
- name, get_size, record, get_value);
+ name, get_size, record, get_value, priv);
if (ret)
abort();
cds_list_for_each_entry(chan, &session_priv->chan_head, node) {
ret = lttng_ust_context_set_provider_rcu(&chan->ctx,
- name, get_size, record, get_value);
+ name, get_size, record, get_value, priv);
if (ret)
abort();
}
cds_list_for_each_entry(event_recorder_priv, &session_priv->events_head, node) {
ret = lttng_ust_context_set_provider_rcu(&event_recorder_priv->ctx,
- name, get_size, record, get_value);
+ name, get_size, record, get_value, priv);
if (ret)
abort();
}
* context (either app context callbacks, or dummy callbacks).
*/
void lttng_ust_context_set_event_notifier_group_provider(const char *name,
- size_t (*get_size)(struct lttng_ust_ctx_field *field, size_t offset),
- void (*record)(struct lttng_ust_ctx_field *field,
- struct lttng_ust_lib_ring_buffer_ctx *ctx,
+ size_t (*get_size)(void *priv, size_t offset),
+ void (*record)(void *priv, struct lttng_ust_lib_ring_buffer_ctx *ctx,
struct lttng_ust_channel_buffer *chan),
- void (*get_value)(struct lttng_ust_ctx_field *field,
- struct lttng_ust_ctx_value *value))
+ void (*get_value)(void *priv, struct lttng_ust_ctx_value *value),
+ void *priv)
{
struct lttng_event_notifier_group *event_notifier_group;
ret = lttng_ust_context_set_provider_rcu(
&event_notifier_group->ctx,
- name, get_size, record, get_value);
+ name, get_size, record, get_value, priv);
if (ret)
abort();
}