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.
This commit is contained in:
Christian Kellner 2019-07-02 17:25:50 +02:00
parent 455ea0c72e
commit 208f37b7d1
2 changed files with 34 additions and 0 deletions

View File

@ -45,6 +45,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include <fcntl.h> #include <fcntl.h>
#include <pthread.h> #include <pthread.h>
#include <stdatomic.h> #include <stdatomic.h>
#include <stdlib.h>
#include <systemd/sd-daemon.h> /* TODO: Move usage to gamemode-dbus.c */ #include <systemd/sd-daemon.h> /* TODO: Move usage to gamemode-dbus.c */
#include <unistd.h> #include <unistd.h>
@ -332,6 +333,31 @@ int game_mode_context_num_clients(GameModeContext *self)
return atomic_load(&self->refcount); 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) static int game_mode_apply_client_optimisations(GameModeContext *self, pid_t client)
{ {
/* Store current renice and apply */ /* Store current renice and apply */

View File

@ -95,6 +95,14 @@ void game_mode_context_destroy(GameModeContext *self);
*/ */
int game_mode_context_num_clients(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 * Register a new game client with the context
* *