/*
- * Copyright (C) 2013 - David Goulet <dgoulet@efficios.com>
+ * Copyright (C) 2013 David Goulet <dgoulet@efficios.com>
*
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License, version 2 only, as
- * published by the Free Software Foundation.
+ * SPDX-License-Identifier: GPL-2.0-only
*
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc., 51
- * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#define _LGPL_SOURCE
-#include <assert.h>
#include <inttypes.h>
#include <common/common.h>
struct ust_registry_event *event;
int i;
- assert(node);
- assert(_key);
+ LTTNG_ASSERT(node);
+ LTTNG_ASSERT(_key);
event = caa_container_of(node, struct ust_registry_event, node.node);
- assert(event);
+ LTTNG_ASSERT(event);
key = _key;
/* It has to be a perfect match. First, compare the event names. */
/* Compare each field individually. */
for (i = 0; i < event->nr_fields; i++) {
- if (!match_ustctl_field(&event->fields[i], &key->fields[i])) {
+ if (!match_lttng_ust_ctl_field(&event->fields[i], &key->fields[i])) {
goto no_match;
}
}
uint64_t hashed_key;
const struct ust_registry_event *key = _key;
- assert(key);
+ LTTNG_ASSERT(key);
hashed_key = (uint64_t) hash_key_str(key->name, seed);
int ret = 0;
size_t i;
- assert(strcmp(reg_enum_a->name, reg_enum_b->name) == 0);
+ LTTNG_ASSERT(strcmp(reg_enum_a->name, reg_enum_b->name) == 0);
if (reg_enum_a->nr_entries != reg_enum_b->nr_entries) {
ret = -1;
goto end;
}
for (i = 0; i < reg_enum_a->nr_entries; i++) {
- const struct ustctl_enum_entry *entries_a, *entries_b;
+ const struct lttng_ust_ctl_enum_entry *entries_a, *entries_b;
entries_a = ®_enum_a->entries[i];
entries_b = ®_enum_b->entries[i];
struct ust_registry_enum *_enum;
const struct ust_registry_enum *key;
- assert(node);
- assert(_key);
+ LTTNG_ASSERT(node);
+ LTTNG_ASSERT(_key);
_enum = caa_container_of(node, struct ust_registry_enum,
node.node);
- assert(_enum);
+ LTTNG_ASSERT(_enum);
key = _key;
- if (strncmp(_enum->name, key->name, LTTNG_UST_SYM_NAME_LEN)) {
+ if (strncmp(_enum->name, key->name, LTTNG_UST_ABI_SYM_NAME_LEN)) {
goto no_match;
}
if (compare_enums(_enum, key)) {
struct ust_registry_enum *_enum;
const struct ust_registry_enum *key = _key;
- assert(node);
- assert(_key);
+ LTTNG_ASSERT(node);
+ LTTNG_ASSERT(_key);
_enum = caa_container_of(node, struct ust_registry_enum, node.node);
- assert(_enum);
+ LTTNG_ASSERT(_enum);
if (_enum->id != key->id) {
goto no_match;
{
struct ust_registry_enum *key = _key;
- assert(key);
+ LTTNG_ASSERT(key);
return hash_key_str(key->name, seed);
}
* trace reader.
*/
static
-int validate_event_field(struct ustctl_field *field,
+int validate_event_field(struct lttng_ust_ctl_field *field,
const char *event_name,
struct ust_app *app)
{
int ret = 0;
switch(field->type.atype) {
- case ustctl_atype_integer:
- case ustctl_atype_enum:
- case ustctl_atype_array:
- case ustctl_atype_sequence:
- case ustctl_atype_string:
- case ustctl_atype_variant:
+ case lttng_ust_ctl_atype_integer:
+ case lttng_ust_ctl_atype_enum:
+ case lttng_ust_ctl_atype_array:
+ case lttng_ust_ctl_atype_sequence:
+ case lttng_ust_ctl_atype_string:
+ case lttng_ust_ctl_atype_variant:
+ case lttng_ust_ctl_atype_array_nestable:
+ case lttng_ust_ctl_atype_sequence_nestable:
+ case lttng_ust_ctl_atype_enum_nestable:
+ case lttng_ust_ctl_atype_variant_nestable:
break;
- case ustctl_atype_struct:
- if (field->type.u._struct.nr_fields != 0) {
+ case lttng_ust_ctl_atype_struct:
+ if (field->type.u.legacy._struct.nr_fields != 0) {
+ WARN("Unsupported non-empty struct field.");
+ ret = -EINVAL;
+ goto end;
+ }
+ break;
+ case lttng_ust_ctl_atype_struct_nestable:
+ if (field->type.u.struct_nestable.nr_fields != 0) {
WARN("Unsupported non-empty struct field.");
ret = -EINVAL;
goto end;
}
break;
- case ustctl_atype_float:
- switch (field->type.u.basic._float.mant_dig) {
+ case lttng_ust_ctl_atype_float:
+ switch (field->type.u._float.mant_dig) {
case 0:
WARN("UST application '%s' (pid: %d) has unknown float mantissa '%u' "
"in field '%s', rejecting event '%s'",
app->name, app->pid,
- field->type.u.basic._float.mant_dig,
+ field->type.u._float.mant_dig,
field->name,
event_name);
ret = -EINVAL;
}
static
-int validate_event_fields(size_t nr_fields, struct ustctl_field *fields,
+int validate_event_fields(size_t nr_fields, struct lttng_ust_ctl_field *fields,
const char *event_name, struct ust_app *app)
{
unsigned int i;
*/
static struct ust_registry_event *alloc_event(int session_objd,
int channel_objd, char *name, char *sig, size_t nr_fields,
- struct ustctl_field *fields, int loglevel_value,
+ struct lttng_ust_ctl_field *fields, int loglevel_value,
char *model_emf_uri, struct ust_app *app)
{
struct ust_registry_event *event = NULL;
struct ust_registry_event *event = NULL;
struct ust_registry_event key;
- assert(chan);
- assert(name);
- assert(sig);
+ LTTNG_ASSERT(chan);
+ LTTNG_ASSERT(name);
+ LTTNG_ASSERT(sig);
/* Setup key for the match function. */
strncpy(key.name, name, sizeof(key.name));
*/
int ust_registry_create_event(struct ust_registry_session *session,
uint64_t chan_key, int session_objd, int channel_objd, char *name,
- char *sig, size_t nr_fields, struct ustctl_field *fields,
+ char *sig, size_t nr_fields, struct lttng_ust_ctl_field *fields,
int loglevel_value, char *model_emf_uri, int buffer_type,
uint32_t *event_id_p, struct ust_app *app)
{
struct ust_registry_event *event = NULL;
struct ust_registry_channel *chan;
- assert(session);
- assert(name);
- assert(sig);
- assert(event_id_p);
+ LTTNG_ASSERT(session);
+ LTTNG_ASSERT(name);
+ LTTNG_ASSERT(sig);
+ LTTNG_ASSERT(event_id_p);
rcu_read_lock();
destroy_event(event);
event = caa_container_of(nptr, struct ust_registry_event,
node.node);
- assert(event);
+ LTTNG_ASSERT(event);
event_id = event->id;
} else {
ERR("UST registry create event add unique failed for event: %s, "
int ret;
struct lttng_ht_iter iter;
- assert(chan);
- assert(event);
+ LTTNG_ASSERT(chan);
+ LTTNG_ASSERT(event);
/* Delete the node first. */
iter.iter.node = &event->node.node;
ret = lttng_ht_del(chan->ht, &iter);
- assert(!ret);
+ LTTNG_ASSERT(!ret);
call_rcu(&event->node.head, destroy_event_rcu);
struct ust_registry_enum reg_enum_lookup;
memset(®_enum_lookup, 0, sizeof(reg_enum_lookup));
- strncpy(reg_enum_lookup.name, enum_name, LTTNG_UST_SYM_NAME_LEN);
- reg_enum_lookup.name[LTTNG_UST_SYM_NAME_LEN - 1] = '\0';
+ strncpy(reg_enum_lookup.name, enum_name, LTTNG_UST_ABI_SYM_NAME_LEN);
+ reg_enum_lookup.name[LTTNG_UST_ABI_SYM_NAME_LEN - 1] = '\0';
reg_enum_lookup.id = enum_id;
cds_lfht_lookup(session->enums->ht,
ht_hash_enum((void *) ®_enum_lookup, lttng_ht_seed),
*/
int ust_registry_create_or_find_enum(struct ust_registry_session *session,
int session_objd, char *enum_name,
- struct ustctl_enum_entry *entries, size_t nr_entries,
+ struct lttng_ust_ctl_enum_entry *entries, size_t nr_entries,
uint64_t *enum_id)
{
int ret = 0;
struct cds_lfht_node *nodep;
struct ust_registry_enum *reg_enum = NULL, *old_reg_enum;
- assert(session);
- assert(enum_name);
+ LTTNG_ASSERT(session);
+ LTTNG_ASSERT(enum_name);
rcu_read_lock();
ret = -ENOMEM;
goto end;
}
- strncpy(reg_enum->name, enum_name, LTTNG_UST_SYM_NAME_LEN);
- reg_enum->name[LTTNG_UST_SYM_NAME_LEN - 1] = '\0';
+ strncpy(reg_enum->name, enum_name, LTTNG_UST_ABI_SYM_NAME_LEN);
+ reg_enum->name[LTTNG_UST_ABI_SYM_NAME_LEN - 1] = '\0';
/* entries will be owned by reg_enum. */
reg_enum->entries = entries;
reg_enum->nr_entries = nr_entries;
ht_hash_enum(reg_enum, lttng_ht_seed),
ht_match_enum_id, reg_enum,
®_enum->node.node);
- assert(nodep == ®_enum->node.node);
+ LTTNG_ASSERT(nodep == ®_enum->node.node);
}
DBG("UST registry reply with enum %s with id %" PRIu64 " in sess_objd: %u",
enum_name, reg_enum->id, session_objd);
int ret;
struct lttng_ht_iter iter;
- assert(reg_session);
- assert(reg_enum);
+ LTTNG_ASSERT(reg_session);
+ LTTNG_ASSERT(reg_enum);
/* Delete the node first. */
iter.iter.node = ®_enum->node.node;
ret = lttng_ht_del(reg_session->enums, &iter);
- assert(!ret);
+ LTTNG_ASSERT(!ret);
call_rcu(®_enum->rcu_head, destroy_enum_rcu);
}
struct ust_registry_event *event;
enum lttng_error_code cmd_ret;
- assert(chan);
+ LTTNG_ASSERT(chan);
if (notif) {
cmd_ret = notification_thread_command_remove_channel(
- notification_thread_handle, chan->consumer_key,
- LTTNG_DOMAIN_UST);
+ the_notification_thread_handle,
+ chan->consumer_key, LTTNG_DOMAIN_UST);
if (cmd_ret != LTTNG_OK) {
ERR("Failed to remove channel from notification thread");
}
}
- rcu_read_lock();
- /* Destroy all event associated with this registry. */
- cds_lfht_for_each_entry(chan->ht->ht, &iter.iter, event, node.node) {
- /* Delete the node from the ht and free it. */
- ust_registry_destroy_event(chan, event);
+ if (chan->ht) {
+ rcu_read_lock();
+ /* Destroy all event associated with this registry. */
+ cds_lfht_for_each_entry(
+ chan->ht->ht, &iter.iter, event, node.node) {
+ /* Delete the node from the ht and free it. */
+ ust_registry_destroy_event(chan, event);
+ }
+ rcu_read_unlock();
}
- rcu_read_unlock();
call_rcu(&chan->rcu_head, destroy_channel_rcu);
}
int ret = 0;
struct ust_registry_channel *chan;
- assert(session);
+ LTTNG_ASSERT(session);
chan = zmalloc(sizeof(*chan));
if (!chan) {
struct lttng_ht_iter iter;
struct ust_registry_channel *chan = NULL;
- assert(session);
- assert(session->channels);
+ LTTNG_ASSERT(session);
+ LTTNG_ASSERT(session->channels);
DBG3("UST registry channel finding key %" PRIu64, key);
struct ust_registry_channel *chan;
int ret;
- assert(session);
+ LTTNG_ASSERT(session);
rcu_read_lock();
chan = ust_registry_channel_find(session, key);
iter.iter.node = &chan->node.node;
ret = lttng_ht_del(session->channels, &iter);
- assert(!ret);
+ LTTNG_ASSERT(!ret);
rcu_read_unlock();
destroy_channel(chan, notif);
int ret;
struct ust_registry_session *session;
- assert(sessionp);
+ LTTNG_ASSERT(sessionp);
session = zmalloc(sizeof(*session));
if (!session) {
/* On error, EBUSY can be returned if lock. Code flow error. */
ret = pthread_mutex_destroy(®->lock);
- assert(!ret);
+ LTTNG_ASSERT(!ret);
if (reg->channels) {
rcu_read_lock();
node.node) {
/* Delete the node from the ht and free it. */
ret = lttng_ht_del(reg->channels, &iter);
- assert(!ret);
+ LTTNG_ASSERT(!ret);
destroy_channel(chan, true);
}
rcu_read_unlock();