All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH lttng-tools 2.2] Fix: sessiond: use uint64_t for all session ids
@ 2013-06-28 16:19 Mathieu Desnoyers
  0 siblings, 0 replies; only message in thread
From: Mathieu Desnoyers @ 2013-06-28 16:19 UTC (permalink / raw)
  To: dgoulet; +Cc: lttng-dev

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
---
diff --git a/src/bin/lttng-sessiond/buffer-registry.c b/src/bin/lttng-sessiond/buffer-registry.c
index e64e437..93da2f1 100644
--- a/src/bin/lttng-sessiond/buffer-registry.c
+++ b/src/bin/lttng-sessiond/buffer-registry.c
@@ -104,7 +104,7 @@ void buffer_reg_init_uid_registry(void)
  *
  * Return 0 on success else a negative value and regp is untouched.
  */
-int buffer_reg_uid_create(int session_id, uint32_t bits_per_long, uid_t uid,
+int buffer_reg_uid_create(uint64_t session_id, uint32_t bits_per_long, uid_t uid,
 		enum lttng_domain_type domain, struct buffer_reg_uid **regp)
 {
 	int ret = 0;
@@ -140,7 +140,7 @@ int buffer_reg_uid_create(int session_id, uint32_t bits_per_long, uid_t uid,
 	cds_lfht_node_init(&reg->node.node);
 	*regp = reg;
 
-	DBG3("Buffer registry per UID created id: %d, ABI: %u, uid: %d, domain: %d",
+	DBG3("Buffer registry per UID created id: %" PRIu64 ", ABI: %u, uid: %d, domain: %d",
 			session_id, bits_per_long, uid, domain);
 
 	return 0;
@@ -162,7 +162,7 @@ void buffer_reg_uid_add(struct buffer_reg_uid *reg)
 
 	assert(reg);
 
-	DBG3("Buffer registry per UID adding to global registry with id: %d",
+	DBG3("Buffer registry per UID adding to global registry with id: %" PRIu64 ,
 			reg->session_id);
 
 	rcu_read_lock();
@@ -178,7 +178,7 @@ void buffer_reg_uid_add(struct buffer_reg_uid *reg)
  *
  * Return the object pointer or NULL on error.
  */
-struct buffer_reg_uid *buffer_reg_uid_find(int session_id,
+struct buffer_reg_uid *buffer_reg_uid_find(uint64_t session_id,
 		uint32_t bits_per_long, uid_t uid)
 {
 	struct lttng_ht_node_u64 *node;
@@ -191,7 +191,7 @@ struct buffer_reg_uid *buffer_reg_uid_find(int session_id,
 	key.bits_per_long = bits_per_long;
 	key.uid = uid;
 
-	DBG3("Buffer registry per UID find id: %d, ABI: %u, uid: %d",
+	DBG3("Buffer registry per UID find id: %" PRIu64 ", ABI: %u, uid: %d",
 			session_id, bits_per_long, uid);
 
 	/* Custom lookup function since it's a different key. */
@@ -214,7 +214,7 @@ void buffer_reg_init_pid_registry(void)
 {
 	/* Should be called once. */
 	assert(!buffer_registry_pid);
-	buffer_registry_pid = lttng_ht_new(0, LTTNG_HT_TYPE_ULONG);
+	buffer_registry_pid = lttng_ht_new(0, LTTNG_HT_TYPE_U64);
 	assert(buffer_registry_pid);
 
 	DBG3("Global buffer per PID registry initialized");
@@ -225,7 +225,7 @@ void buffer_reg_init_pid_registry(void)
  *
  * Return 0 on success else a negative value and regp is untouched.
  */
-int buffer_reg_pid_create(int session_id, struct buffer_reg_pid **regp)
+int buffer_reg_pid_create(uint64_t session_id, struct buffer_reg_pid **regp)
 {
 	int ret = 0;
 	struct buffer_reg_pid *reg = NULL;
@@ -255,10 +255,11 @@ int buffer_reg_pid_create(int session_id, struct buffer_reg_pid **regp)
 		goto error_session;
 	}
 
-	lttng_ht_node_init_ulong(&reg->node, reg->session_id);
+	lttng_ht_node_init_u64(&reg->node, reg->session_id);
 	*regp = reg;
 
-	DBG3("Buffer registry per PID created with session id: %d", session_id);
+	DBG3("Buffer registry per PID created with session id: %" PRIu64,
+			session_id);
 
 	return 0;
 
@@ -276,11 +277,11 @@ void buffer_reg_pid_add(struct buffer_reg_pid *reg)
 {
 	assert(reg);
 
-	DBG3("Buffer registry per PID adding to global registry with id: %d",
+	DBG3("Buffer registry per PID adding to global registry with id: %" PRIu64,
 			reg->session_id);
 
 	rcu_read_lock();
-	lttng_ht_add_unique_ulong(buffer_registry_pid, &reg->node);
+	lttng_ht_add_unique_u64(buffer_registry_pid, &reg->node);
 	rcu_read_unlock();
 }
 
@@ -290,17 +291,17 @@ void buffer_reg_pid_add(struct buffer_reg_pid *reg)
  *
  * Return the object pointer or NULL on error.
  */
-struct buffer_reg_pid *buffer_reg_pid_find(int session_id)
+struct buffer_reg_pid *buffer_reg_pid_find(uint64_t session_id)
 {
-	struct lttng_ht_node_ulong *node;
+	struct lttng_ht_node_u64 *node;
 	struct lttng_ht_iter iter;
 	struct buffer_reg_pid *reg = NULL;
 	struct lttng_ht *ht = buffer_registry_pid;
 
-	DBG3("Buffer registry per PID find id: %d", session_id);
+	DBG3("Buffer registry per PID find id: %" PRIu64, session_id);
 
-	lttng_ht_lookup(ht, (void *)((unsigned long) session_id), &iter);
-	node = lttng_ht_iter_get_node_ulong(&iter);
+	lttng_ht_lookup(ht, &session_id, &iter);
+	node = lttng_ht_iter_get_node_u64(&iter);
 	if (!node) {
 		goto end;
 	}
@@ -594,8 +595,8 @@ static void rcu_free_buffer_reg_uid(struct rcu_head *head)
 
 static void rcu_free_buffer_reg_pid(struct rcu_head *head)
 {
-	struct lttng_ht_node_ulong *node =
-		caa_container_of(head, struct lttng_ht_node_ulong, head);
+	struct lttng_ht_node_u64 *node =
+		caa_container_of(head, struct lttng_ht_node_u64, head);
 	struct buffer_reg_pid *reg =
 		caa_container_of(node, struct buffer_reg_pid, node);
 
@@ -617,7 +618,7 @@ void buffer_reg_uid_destroy(struct buffer_reg_uid *regp,
 		return;
 	}
 
-	DBG3("Buffer registry per UID destroy with id: %d, ABI: %u, uid: %d",
+	DBG3("Buffer registry per UID destroy with id: %" PRIu64 ", ABI: %u, uid: %d",
 			regp->session_id, regp->bits_per_long, regp->uid);
 
 	if (!consumer) {
@@ -679,7 +680,8 @@ void buffer_reg_pid_destroy(struct buffer_reg_pid *regp)
 		return;
 	}
 
-	DBG3("Buffer registry per PID destroy with id: %d", regp->session_id);
+	DBG3("Buffer registry per PID destroy with id: %" PRIu64,
+			regp->session_id);
 
 	/* This registry is only used by UST. */
 	call_rcu(&regp->node.head, rcu_free_buffer_reg_pid);
diff --git a/src/bin/lttng-sessiond/buffer-registry.h b/src/bin/lttng-sessiond/buffer-registry.h
index d77a071..cb976dc 100644
--- a/src/bin/lttng-sessiond/buffer-registry.h
+++ b/src/bin/lttng-sessiond/buffer-registry.h
@@ -71,7 +71,7 @@ struct buffer_reg_uid {
 	 * Keys to match this object in a hash table. The following three variables
 	 * identify a unique per UID buffer registry.
 	 */
-	int session_id;		/* Unique tracing session id. */
+	uint64_t session_id;	/* Unique tracing session id. */
 	int bits_per_long;	/* ABI */
 	uid_t uid;			/* Owner. */
 
@@ -88,20 +88,20 @@ struct buffer_reg_uid {
  * Registry object for per PID buffers.
  */
 struct buffer_reg_pid {
-	int session_id;
+	uint64_t session_id;
 
 	struct buffer_reg_session *registry;
 
 	/* Indexed by session id. */
-	struct lttng_ht_node_ulong node;
+	struct lttng_ht_node_u64 node;
 };
 
 /* Buffer registry per UID. */
 void buffer_reg_init_uid_registry(void);
-int buffer_reg_uid_create(int session_id, uint32_t bits_per_long, uid_t uid,
+int buffer_reg_uid_create(uint64_t session_id, uint32_t bits_per_long, uid_t uid,
 		enum lttng_domain_type domain, struct buffer_reg_uid **regp);
 void buffer_reg_uid_add(struct buffer_reg_uid *reg);
-struct buffer_reg_uid *buffer_reg_uid_find(int session_id,
+struct buffer_reg_uid *buffer_reg_uid_find(uint64_t session_id,
 		uint32_t bits_per_long, uid_t uid);
 void buffer_reg_uid_remove(struct buffer_reg_uid *regp);
 void buffer_reg_uid_destroy(struct buffer_reg_uid *regp,
@@ -109,9 +109,9 @@ void buffer_reg_uid_destroy(struct buffer_reg_uid *regp,
 
 /* Buffer registry per PID. */
 void buffer_reg_init_pid_registry(void);
-int buffer_reg_pid_create(int session_id, struct buffer_reg_pid **regp);
+int buffer_reg_pid_create(uint64_t session_id, struct buffer_reg_pid **regp);
 void buffer_reg_pid_add(struct buffer_reg_pid *reg);
-struct buffer_reg_pid *buffer_reg_pid_find(int session_id);
+struct buffer_reg_pid *buffer_reg_pid_find(uint64_t session_id);
 void buffer_reg_pid_remove(struct buffer_reg_pid *regp);
 void buffer_reg_pid_destroy(struct buffer_reg_pid *regp);
 
diff --git a/src/bin/lttng-sessiond/trace-ust.c b/src/bin/lttng-sessiond/trace-ust.c
index 2c63ef0..65fe84b 100644
--- a/src/bin/lttng-sessiond/trace-ust.c
+++ b/src/bin/lttng-sessiond/trace-ust.c
@@ -20,6 +20,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <inttypes.h>
 
 #include <common/common.h>
 #include <common/defaults.h>
@@ -181,7 +182,7 @@ error:
  *
  * Return pointer to structure or NULL.
  */
-struct ltt_ust_session *trace_ust_create_session(unsigned int session_id)
+struct ltt_ust_session *trace_ust_create_session(uint64_t session_id)
 {
 	struct ltt_ust_session *lus;
 
@@ -646,7 +647,7 @@ void trace_ust_destroy_session(struct ltt_ust_session *session)
 
 	assert(session);
 
-	DBG2("Trace UST destroy session %u", session->id);
+	DBG2("Trace UST destroy session %" PRIu64, session->id);
 
 	/* Cleaning up UST domain */
 	destroy_domain_global(&session->domain_global);
diff --git a/src/bin/lttng-sessiond/trace-ust.h b/src/bin/lttng-sessiond/trace-ust.h
index dcb45c2..f5df133 100644
--- a/src/bin/lttng-sessiond/trace-ust.h
+++ b/src/bin/lttng-sessiond/trace-ust.h
@@ -79,7 +79,7 @@ struct ltt_ust_domain_global {
 
 /* UST session */
 struct ltt_ust_session {
-	int id;    /* Unique identifier of session */
+	uint64_t id;    /* Unique identifier of session */
 	int start_trace;
 	struct ltt_ust_domain_global domain_global;
 	/* UID/GID of the user owning the session */
@@ -153,7 +153,7 @@ struct ltt_ust_channel *trace_ust_find_channel_by_name(struct lttng_ht *ht,
 /*
  * Create functions malloc() the data structure.
  */
-struct ltt_ust_session *trace_ust_create_session(unsigned int session_id);
+struct ltt_ust_session *trace_ust_create_session(uint64_t session_id);
 struct ltt_ust_channel *trace_ust_create_channel(struct lttng_channel *attr);
 struct ltt_ust_event *trace_ust_create_event(struct lttng_event *ev,
 		struct lttng_filter_bytecode *filter);
diff --git a/src/bin/lttng-sessiond/ust-app.c b/src/bin/lttng-sessiond/ust-app.c
index 0f553a6..eea0d8c 100644
--- a/src/bin/lttng-sessiond/ust-app.c
+++ b/src/bin/lttng-sessiond/ust-app.c
@@ -40,24 +40,38 @@
 #include "ust-ctl.h"
 #include "utils.h"
 
-/* Next available channel key. */
-static unsigned long next_channel_key;
-static unsigned long next_session_id;
+/* Next available channel key. Access under next_channel_key_lock. */
+static uint64_t _next_channel_key;
+static pthread_mutex_t next_channel_key_lock = PTHREAD_MUTEX_INITIALIZER;
+
+/* Next available session ID. Access under next_session_id_lock. */
+static uint64_t _next_session_id;
+static pthread_mutex_t next_session_id_lock = PTHREAD_MUTEX_INITIALIZER;
 
 /*
- * Return the atomically incremented value of next_channel_key.
+ * Return the incremented value of next_channel_key.
  */
-static inline unsigned long get_next_channel_key(void)
+static uint64_t get_next_channel_key(void)
 {
-	return uatomic_add_return(&next_channel_key, 1);
+	uint64_t ret;
+
+	pthread_mutex_lock(&next_channel_key_lock);
+	ret = ++_next_channel_key;
+	pthread_mutex_unlock(&next_channel_key_lock);
+	return ret;
 }
 
 /*
  * Return the atomically incremented value of next_session_id.
  */
-static inline unsigned long get_next_session_id(void)
+static uint64_t get_next_session_id(void)
 {
-	return uatomic_add_return(&next_session_id, 1);
+	uint64_t ret;
+
+	pthread_mutex_lock(&next_session_id_lock);
+	ret = ++_next_session_id;
+	pthread_mutex_unlock(&next_session_id_lock);
+	return ret;
 }
 
 static void copy_channel_attr_to_ustctl(
@@ -1503,7 +1517,7 @@ void __lookup_session_by_app(struct ltt_ust_session *usess,
 			struct ust_app *app, struct lttng_ht_iter *iter)
 {
 	/* Get right UST app session from app */
-	lttng_ht_lookup(app->sessions, (void *)((unsigned long) usess->id), iter);
+	lttng_ht_lookup(app->sessions, &usess->id, iter);
 }
 
 /*
@@ -1514,10 +1528,10 @@ static struct ust_app_session *lookup_session_by_app(
 		struct ltt_ust_session *usess, struct ust_app *app)
 {
 	struct lttng_ht_iter iter;
-	struct lttng_ht_node_ulong *node;
+	struct lttng_ht_node_u64 *node;
 
 	__lookup_session_by_app(usess, app, &iter);
-	node = lttng_ht_iter_get_node_ulong(&iter);
+	node = lttng_ht_iter_get_node_u64(&iter);
 	if (node == NULL) {
 		goto error;
 	}
@@ -1667,7 +1681,7 @@ static int create_ust_app_session(struct ltt_ust_session *usess,
 
 	ua_sess = lookup_session_by_app(usess, app);
 	if (ua_sess == NULL) {
-		DBG2("UST app pid: %d session id %d not found, creating it",
+		DBG2("UST app pid: %d session id %" PRIu64 " not found, creating it",
 				app->pid, usess->id);
 		ua_sess = alloc_ust_app_session(app);
 		if (ua_sess == NULL) {
@@ -1725,9 +1739,9 @@ static int create_ust_app_session(struct ltt_ust_session *usess,
 		ua_sess->handle = ret;
 
 		/* Add ust app session to app's HT */
-		lttng_ht_node_init_ulong(&ua_sess->node,
-				(unsigned long) ua_sess->tracing_id);
-		lttng_ht_add_unique_ulong(app->sessions, &ua_sess->node);
+		lttng_ht_node_init_u64(&ua_sess->node,
+				ua_sess->tracing_id);
+		lttng_ht_add_unique_u64(app->sessions, &ua_sess->node);
 
 		DBG2("UST app session created successfully with handle %d", ret);
 	}
@@ -1864,7 +1878,7 @@ static int enable_ust_app_channel(struct ust_app_session *ua_sess,
 	lttng_ht_lookup(ua_sess->channels, (void *)uchan->name, &iter);
 	ua_chan_node = lttng_ht_iter_get_node_str(&iter);
 	if (ua_chan_node == NULL) {
-		DBG2("Unable to find channel %s in ust session id %u",
+		DBG2("Unable to find channel %s in ust session id %" PRIu64,
 				uchan->name, ua_sess->tracing_id);
 		goto error;
 	}
@@ -2719,7 +2733,7 @@ struct ust_app *ust_app_create(struct ust_register_msg *msg, int sock)
 
 	lta->v_major = msg->major;
 	lta->v_minor = msg->minor;
-	lta->sessions = lttng_ht_new(0, LTTNG_HT_TYPE_ULONG);
+	lta->sessions = lttng_ht_new(0, LTTNG_HT_TYPE_U64);
 	lta->ust_objd = lttng_ht_new(0, LTTNG_HT_TYPE_ULONG);
 	lta->notify_sock = -1;
 
@@ -3188,7 +3202,7 @@ int ust_app_disable_channel_glb(struct ltt_ust_session *usess,
 		goto error;
 	}
 
-	DBG2("UST app disabling channel %s from global domain for session id %d",
+	DBG2("UST app disabling channel %s from global domain for session id %" PRIu64,
 			uchan->name, usess->id);
 
 	rcu_read_lock();
@@ -3249,7 +3263,7 @@ int ust_app_enable_channel_glb(struct ltt_ust_session *usess,
 		goto error;
 	}
 
-	DBG2("UST app enabling channel %s to global domain for session id %d",
+	DBG2("UST app enabling channel %s to global domain for session id %" PRIu64,
 			uchan->name, usess->id);
 
 	rcu_read_lock();
@@ -3297,7 +3311,8 @@ int ust_app_disable_event_glb(struct ltt_ust_session *usess,
 	struct ust_app_event *ua_event;
 
 	DBG("UST app disabling event %s for all apps in channel "
-			"%s for session id %d", uevent->attr.name, uchan->name, usess->id);
+			"%s for session id %" PRIu64,
+			uevent->attr.name, uchan->name, usess->id);
 
 	rcu_read_lock();
 
@@ -3320,7 +3335,7 @@ int ust_app_disable_event_glb(struct ltt_ust_session *usess,
 		lttng_ht_lookup(ua_sess->channels, (void *)uchan->name, &uiter);
 		ua_chan_node = lttng_ht_iter_get_node_str(&uiter);
 		if (ua_chan_node == NULL) {
-			DBG2("Channel %s not found in session id %d for app pid %d."
+			DBG2("Channel %s not found in session id %" PRIu64 " for app pid %d."
 					"Skipping", uchan->name, usess->id, app->pid);
 			continue;
 		}
@@ -3363,7 +3378,7 @@ int ust_app_disable_all_event_glb(struct ltt_ust_session *usess,
 	struct ust_app_event *ua_event;
 
 	DBG("UST app disabling all event for all apps in channel "
-			"%s for session id %d", uchan->name, usess->id);
+			"%s for session id %" PRIu64, uchan->name, usess->id);
 
 	rcu_read_lock();
 
@@ -3421,7 +3436,7 @@ int ust_app_create_channel_glb(struct ltt_ust_session *usess,
 	assert(usess);
 	assert(uchan);
 
-	DBG2("UST app adding channel %s to UST domain for session id %d",
+	DBG2("UST app adding channel %s to UST domain for session id %" PRIu64,
 			uchan->name, usess->id);
 
 	rcu_read_lock();
@@ -3501,7 +3516,7 @@ int ust_app_enable_event_glb(struct ltt_ust_session *usess,
 	struct ust_app_channel *ua_chan;
 	struct ust_app_event *ua_event;
 
-	DBG("UST app enabling event %s for all apps for session id %d",
+	DBG("UST app enabling event %s for all apps for session id %" PRIu64,
 			uevent->attr.name, usess->id);
 
 	/*
@@ -3574,7 +3589,7 @@ int ust_app_create_event_glb(struct ltt_ust_session *usess,
 	struct ust_app_session *ua_sess;
 	struct ust_app_channel *ua_chan;
 
-	DBG("UST app creating event %s for all apps for session id %d",
+	DBG("UST app creating event %s for all apps for session id %" PRIu64,
 			uevent->attr.name, usess->id);
 
 	rcu_read_lock();
@@ -3861,7 +3876,7 @@ static int destroy_trace(struct ltt_ust_session *usess, struct ust_app *app)
 	int ret;
 	struct ust_app_session *ua_sess;
 	struct lttng_ht_iter iter;
-	struct lttng_ht_node_ulong *node;
+	struct lttng_ht_node_u64 *node;
 
 	DBG("Destroy tracing for ust app pid %d", app->pid);
 
@@ -3872,7 +3887,7 @@ static int destroy_trace(struct ltt_ust_session *usess, struct ust_app *app)
 	}
 
 	__lookup_session_by_app(usess, app, &iter);
-	node = lttng_ht_iter_get_node_ulong(&iter);
+	node = lttng_ht_iter_get_node_u64(&iter);
 	if (node == NULL) {
 		/* Session is being or is deleted. */
 		goto end;
@@ -4035,7 +4050,7 @@ void ust_app_global_update(struct ltt_ust_session *usess, int sock)
 	assert(usess);
 	assert(sock >= 0);
 
-	DBG2("UST app global update for app sock %d for session id %d", sock,
+	DBG2("UST app global update for app sock %d for session id %" PRIu64, sock,
 			usess->id);
 
 	rcu_read_lock();
diff --git a/src/bin/lttng-sessiond/ust-app.h b/src/bin/lttng-sessiond/ust-app.h
index 30835e0..c533fbf 100644
--- a/src/bin/lttng-sessiond/ust-app.h
+++ b/src/bin/lttng-sessiond/ust-app.h
@@ -175,10 +175,10 @@ struct ust_app_session {
 	 * Tracing session ID. Multiple ust app session can have the same tracing
 	 * session id making this value NOT unique to the object.
 	 */
-	int tracing_id;
+	uint64_t tracing_id;
 	uint64_t id;	/* Unique session identifier */
 	struct lttng_ht *channels; /* Registered channels */
-	struct lttng_ht_node_ulong node;
+	struct lttng_ht_node_u64 node;
 	char path[PATH_MAX];
 	/* UID/GID of the application owning the session */
 	uid_t uid;

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2013-06-28 16:19 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-06-28 16:19 [PATCH lttng-tools 2.2] Fix: sessiond: use uint64_t for all session ids Mathieu Desnoyers

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.