* Place - Suite 330, Boston, MA 02111-1307, USA.
*/
+#define _GNU_SOURCE
#include <errno.h>
#include <urcu/list.h>
#include <string.h>
#include <lttng/lttng.h>
+#include <lttng-ht.h>
#include <lttng-sessiond-comm.h>
#include <lttngerr.h>
#include "channel.h"
#include "event.h"
-#include "hashtable.h"
#include "kernel.h"
#include "ust-ctl.h"
#include "ust-app.h"
{
int ret, i;
size_t size;
- struct cds_lfht_iter iter;
+ struct lttng_ht_iter iter;
struct ltt_ust_event *uevent = NULL;
struct lttng_event *events = NULL;
case LTTNG_DOMAIN_UST:
{
/* Enable existing events */
- cds_lfht_for_each_entry(uchan->events, &iter, uevent, node) {
+ cds_lfht_for_each_entry(uchan->events->ht, &iter.iter, uevent,
+ node.node) {
if (uevent->enabled == 0) {
ret = ust_app_enable_event_glb(usess, uchan, uevent);
if (ret < 0) {
uevent->enabled = 1;
/* Add ltt ust event to channel */
rcu_read_lock();
- hashtable_add_unique(uchan->events, &uevent->node);
+ lttng_ht_add_unique_str(uchan->events, &uevent->node);
rcu_read_unlock();
}
int event_ust_enable_tracepoint(struct ltt_ust_session *usess, int domain,
struct ltt_ust_channel *uchan, struct lttng_event *event)
{
- int ret, to_create = 0;
+ int ret = LTTCOMM_OK, to_create = 0;
struct ltt_ust_event *uevent;
uevent = trace_ust_find_event_by_name(uchan->events, event->name);
ret = LTTCOMM_FATAL;
goto error;
}
+ /* Valid to set it after the goto error since uevent is still NULL */
to_create = 1;
}
if (uevent->enabled) {
/* It's already enabled so everything is OK */
- ret = LTTCOMM_OK;
goto end;
}
+ uevent->enabled = 1;
+
switch (domain) {
case LTTNG_DOMAIN_UST:
{
goto end;
}
- uevent->enabled = 1;
- /* Add ltt ust event to channel */
if (to_create) {
rcu_read_lock();
- hashtable_add_unique(uchan->events, &uevent->node);
+ /* Add ltt ust event to channel */
+ lttng_ht_add_unique_str(uchan->events, &uevent->node);
rcu_read_unlock();
}
- ret = LTTCOMM_OK;
-
-end:
DBG("Event UST %s %s in channel %s", uevent->attr.name,
to_create ? "created" : "enabled", uchan->name);
+ ret = LTTCOMM_OK;
+
+end:
return ret;
error:
- trace_ust_destroy_event(uevent);
+ /*
+ * Only destroy event on creation time (not enabling time) because if the
+ * event is found in the channel (to_create == 0), it means that at some
+ * point the enable_event worked and it's thus valid to keep it alive.
+ * Destroying it also implies that we also destroy it's shadow copy to sync
+ * everyone up.
+ */
+ if (to_create) {
+ /* In this code path, the uevent was not added to the hash table */
+ trace_ust_destroy_event(uevent);
+ }
return ret;
}
{
int ret, i;
size_t size;
- struct cds_lfht_iter iter;
+ struct lttng_ht_iter iter;
struct ltt_ust_event *uevent = NULL;
struct lttng_event *events = NULL;
case LTTNG_DOMAIN_UST:
{
/* Disabling existing events */
- cds_lfht_for_each_entry(uchan->events, &iter, uevent, node) {
+ cds_lfht_for_each_entry(uchan->events->ht, &iter.iter, uevent,
+ node.node) {
if (uevent->enabled == 1) {
ret = ust_app_disable_event_glb(usess, uchan, uevent);
if (ret < 0) {