*/
#define _LGPL_SOURCE
-#include <common/common.h>
-#include <urcu/rculist.h>
+#include "ctf-trace.hpp"
+#include "lttng-relayd.hpp"
+#include "session.hpp"
+#include "stream.hpp"
+#include "viewer-session.hpp"
+#include "viewer-stream.hpp"
+
+#include <common/common.hpp>
+#include <common/urcu.hpp>
-#include "lttng-relayd.h"
-#include "ctf-trace.h"
-#include "session.h"
-#include "viewer-session.h"
-#include "viewer-stream.h"
-#include "stream.h"
+#include <urcu/rculist.h>
-struct relay_viewer_session *viewer_session_create(void)
+struct relay_viewer_session *viewer_session_create()
{
struct relay_viewer_session *vsession;
- vsession = (relay_viewer_session *) zmalloc(sizeof(*vsession));
+ vsession = zmalloc<relay_viewer_session>();
if (!vsession) {
goto end;
}
}
int viewer_session_set_trace_chunk_copy(struct relay_viewer_session *vsession,
- struct lttng_trace_chunk *relay_session_trace_chunk)
+ struct lttng_trace_chunk *relay_session_trace_chunk)
{
int ret = 0;
struct lttng_trace_chunk *viewer_chunk;
lttng_trace_chunk_put(vsession->current_trace_chunk);
- vsession->current_trace_chunk = NULL;
+ vsession->current_trace_chunk = nullptr;
DBG("Copying relay session's current trace chunk to the viewer session");
if (!relay_session_trace_chunk) {
}
/* The existence of session must be guaranteed by the caller. */
-enum lttng_viewer_attach_return_code viewer_session_attach(
- struct relay_viewer_session *vsession,
- struct relay_session *session)
+enum lttng_viewer_attach_return_code viewer_session_attach(struct relay_viewer_session *vsession,
+ struct relay_session *session)
{
- enum lttng_viewer_attach_return_code viewer_attach_status =
- LTTNG_VIEWER_ATTACH_OK;
+ enum lttng_viewer_attach_return_code viewer_attach_status = LTTNG_VIEWER_ATTACH_OK;
ASSERT_LOCKED(session->lock);
session->viewer_attached = true;
- ret = viewer_session_set_trace_chunk_copy(vsession,
- session->current_trace_chunk);
+ ret = viewer_session_set_trace_chunk_copy(vsession, session->current_trace_chunk);
if (ret) {
/*
* The live protocol does not define a generic error
* failure as if the session didn't exist anymore.
*/
DBG("Failed to create a viewer trace chunk from the current trace chunk of session \"%s\", returning LTTNG_VIEWER_ATTACH_UNK",
- session->session_name);
+ session->session_name);
viewer_attach_status = LTTNG_VIEWER_ATTACH_UNK;
}
}
if (viewer_attach_status == LTTNG_VIEWER_ATTACH_OK) {
pthread_mutex_lock(&vsession->session_list_lock);
/* Ownership is transfered to the list. */
- cds_list_add_rcu(&session->viewer_session_node,
- &vsession->session_list);
+ cds_list_add_rcu(&session->viewer_session_node, &vsession->session_list);
pthread_mutex_unlock(&vsession->session_list_lock);
} else {
/* Put our local ref. */
/* The existence of session must be guaranteed by the caller. */
static int viewer_session_detach(struct relay_viewer_session *vsession,
- struct relay_session *session)
+ struct relay_session *session)
{
int ret = 0;
* Release ownership of all the streams of one session and detach the viewer.
*/
void viewer_session_close_one_session(struct relay_viewer_session *vsession,
- struct relay_session *session)
+ struct relay_session *session)
{
struct lttng_ht_iter iter;
struct relay_viewer_stream *vstream;
* TODO: improvement: create more efficient list of
* vstream per session.
*/
- cds_lfht_for_each_entry(viewer_streams_ht->ht, &iter.iter,
- vstream, stream_n.node) {
- if (!viewer_stream_get(vstream)) {
- continue;
- }
- if (vstream->stream->trace->session != session) {
+ {
+ lttng::urcu::read_lock_guard read_guard;
+
+ cds_lfht_for_each_entry (
+ viewer_streams_ht->ht, &iter.iter, vstream, stream_n.node) {
+ if (!viewer_stream_get(vstream)) {
+ continue;
+ }
+ if (vstream->stream->trace->session != session) {
+ viewer_stream_put(vstream);
+ continue;
+ }
+ /* Put local reference. */
+ viewer_stream_put(vstream);
+ /*
+ * We have reached one of the viewer stream's lifetime
+ * end condition. This "put" will cause the proper
+ * teardown of the viewer stream.
+ */
viewer_stream_put(vstream);
- continue;
}
- /* Put local reference. */
- viewer_stream_put(vstream);
- /*
- * We have reached one of the viewer stream's lifetime
- * end condition. This "put" will cause the proper
- * teardown of the viewer stream.
- */
- viewer_stream_put(vstream);
}
+
lttng_trace_chunk_put(vsession->current_trace_chunk);
- vsession->current_trace_chunk = NULL;
+ vsession->current_trace_chunk = nullptr;
viewer_session_detach(vsession, session);
}
{
struct relay_session *session;
- rcu_read_lock();
- cds_list_for_each_entry_rcu(session,
- &vsession->session_list, viewer_session_node) {
- viewer_session_close_one_session(vsession, session);
+ {
+ lttng::urcu::read_lock_guard read_lock;
+
+ cds_list_for_each_entry_rcu(session, &vsession->session_list, viewer_session_node)
+ {
+ viewer_session_close_one_session(vsession, session);
+ }
}
- rcu_read_unlock();
}
/*
* Check if a connection is attached to a session.
* Return 1 if attached, 0 if not attached, a negative value on error.
*/
-int viewer_session_is_attached(struct relay_viewer_session *vsession,
- struct relay_session *session)
+int viewer_session_is_attached(struct relay_viewer_session *vsession, struct relay_session *session)
{
struct relay_session *iter;
int found = 0;
if (!session->viewer_attached) {
goto end;
}
- rcu_read_lock();
- cds_list_for_each_entry_rcu(iter,
- &vsession->session_list,
- viewer_session_node) {
- if (session == iter) {
- found = 1;
- goto end_rcu_unlock;
+
+ {
+ lttng::urcu::read_lock_guard read_lock;
+ cds_list_for_each_entry_rcu(iter, &vsession->session_list, viewer_session_node)
+ {
+ if (session == iter) {
+ found = 1;
+ break;
+ }
}
}
-end_rcu_unlock:
- rcu_read_unlock();
+
end:
pthread_mutex_unlock(&session->lock);
return found;