#define _LGPL_SOURCE
-#include <common/common.h>
-#include <common/utils.h>
+#include <common/common.hpp>
+#include <common/utils.hpp>
#include <urcu/rculist.h>
-#include "ctf-trace.h"
-#include "lttng-relayd.h"
-#include "stream.h"
+#include "ctf-trace.hpp"
+#include "lttng-relayd.hpp"
+#include "stream.hpp"
static uint64_t last_relay_ctf_trace_id;
static pthread_mutex_t last_relay_ctf_trace_id_lock = PTHREAD_MUTEX_INITIALIZER;
static void rcu_destroy_ctf_trace(struct rcu_head *rcu_head)
{
struct ctf_trace *trace =
- caa_container_of(rcu_head, struct ctf_trace, rcu_node);
+ lttng::utils::container_of(rcu_head, &ctf_trace::rcu_node);
free(trace);
}
* control side.
*/
LTTNG_ASSERT(cds_list_empty(&trace->stream_list));
+ ASSERT_RCU_READ_LOCKED();
+
session_put(trace->session);
trace->session = NULL;
free(trace->path);
static void ctf_trace_release(struct urcu_ref *ref)
{
struct ctf_trace *trace =
- caa_container_of(ref, struct ctf_trace, ref);
+ lttng::utils::container_of(ref, &ctf_trace::ref);
int ret;
struct lttng_ht_iter iter;
}
/*
- * Should be called with RCU read-side lock held.
+ * The caller must either:
+ * - hold the RCU read side lock, or
+ * - guarantee the existence of the object by already holding a reference to
+ * the object.
*/
bool ctf_trace_get(struct ctf_trace *trace)
{
- return urcu_ref_get_unless_zero(&trace->ref);
+ const bool ref = urcu_ref_get_unless_zero(&trace->ref);
+
+ if (!ref) {
+ /*
+ * The ref count is already zero. It means the object is being
+ * torn down concurently.
+ * This is only acceptable if we hold the RCU read-side lock,
+ * else it's a logic error.
+ */
+ ASSERT_RCU_READ_LOCKED();
+ }
+
+ return ref;
}
/*
{
struct ctf_trace *trace;
- trace = (ctf_trace *) zmalloc(sizeof(*trace));
+ trace = zmalloc<ctf_trace>();
if (!trace) {
PERROR("Failed to allocate ctf_trace");
goto end;
DBG("CTF Trace path %s not found", subpath);
goto end;
}
- trace = caa_container_of(node, struct ctf_trace, node);
+ trace = lttng::utils::container_of(node, &ctf_trace::node);
if (!ctf_trace_get(trace)) {
trace = NULL;
}