Browse Source

daemon: method to list all registered clients

Return an array of pid_t elements containing the process ids of
all registered clients. Memory ownership is transferred to the
client and must be freed.
Christian Kellner 5 years ago
parent
commit
208f37b7d1
2 changed files with 34 additions and 0 deletions
  1. 26 0
      daemon/gamemode-context.c
  2. 8 0
      daemon/gamemode.h

+ 26 - 0
daemon/gamemode-context.c

@@ -45,6 +45,7 @@ POSSIBILITY OF SUCH DAMAGE.
 #include <fcntl.h>
 #include <pthread.h>
 #include <stdatomic.h>
+#include <stdlib.h>
 #include <systemd/sd-daemon.h> /* TODO: Move usage to gamemode-dbus.c */
 #include <unistd.h>
 
@@ -332,6 +333,31 @@ int game_mode_context_num_clients(GameModeContext *self)
 	return atomic_load(&self->refcount);
 }
 
+pid_t *game_mode_context_list_clients(GameModeContext *self, unsigned int *count)
+{
+	pid_t *res = NULL;
+	unsigned int i = 0;
+	unsigned int n;
+
+	pthread_rwlock_rdlock(&self->rwlock);
+	n = (unsigned int)atomic_load(&self->refcount);
+
+	if (n > 0)
+		res = (pid_t *)malloc(n * sizeof(pid_t));
+
+	for (GameModeClient *cl = self->client; cl; cl = cl->next) {
+		assert(n > i);
+
+		res[i] = cl->pid;
+		i++;
+	}
+
+	*count = i;
+
+	pthread_rwlock_unlock(&self->rwlock);
+	return res;
+}
+
 static int game_mode_apply_client_optimisations(GameModeContext *self, pid_t client)
 {
 	/* Store current renice and apply */

+ 8 - 0
daemon/gamemode.h

@@ -95,6 +95,14 @@ void game_mode_context_destroy(GameModeContext *self);
  */
 int game_mode_context_num_clients(GameModeContext *self);
 
+/**
+ * List the currently active clients.
+ * @param out holds the number of active clients.
+ *
+ * @returns A array of pid_t or NULL if there are no active clients.
+ */
+pid_t *game_mode_context_list_clients(GameModeContext *self, unsigned int *count);
+
 /**
  * Register a new game client with the context
  *