mirror of
https://github.com/libratbag/libratbag.git
synced 2026-11-07 23:23:52 +01:00
ratbagd: introduce ref/unref for ratbagd_device pointers
We'll need to keep references around to devices even when caller is done with them. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
@@ -41,6 +41,8 @@
|
||||
#include "libratbag-util.h"
|
||||
|
||||
struct ratbagd_device {
|
||||
unsigned int refcount;
|
||||
|
||||
struct ratbagd *ctx;
|
||||
RBNode node;
|
||||
char *sysname;
|
||||
@@ -230,7 +232,7 @@ int ratbagd_device_new(struct ratbagd_device **out,
|
||||
const char *sysname,
|
||||
struct ratbag_device *lib_device)
|
||||
{
|
||||
_cleanup_(ratbagd_device_freep) struct ratbagd_device *device = NULL;
|
||||
_cleanup_(ratbagd_device_unrefp) struct ratbagd_device *device = NULL;
|
||||
struct ratbag_profile *profile;
|
||||
unsigned int i;
|
||||
int r;
|
||||
@@ -240,6 +242,7 @@ int ratbagd_device_new(struct ratbagd_device **out,
|
||||
assert(sysname);
|
||||
|
||||
device = zalloc(sizeof(*device));
|
||||
device->refcount = 1;
|
||||
device->ctx = ctx;
|
||||
rbnode_init(&device->node);
|
||||
device->lib_device = ratbag_device_ref(lib_device);
|
||||
@@ -282,12 +285,12 @@ int ratbagd_device_new(struct ratbagd_device **out,
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct ratbagd_device *ratbagd_device_free(struct ratbagd_device *device)
|
||||
static void ratbagd_device_free(struct ratbagd_device *device)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if (!device)
|
||||
return NULL;
|
||||
return;
|
||||
|
||||
assert(!ratbagd_device_linked(device));
|
||||
|
||||
@@ -301,7 +304,26 @@ struct ratbagd_device *ratbagd_device_free(struct ratbagd_device *device)
|
||||
|
||||
assert(!device->lib_device); /* ratbag yields !NULL if still pinned */
|
||||
|
||||
return mfree(device);
|
||||
mfree(device);
|
||||
}
|
||||
|
||||
struct ratbagd_device *ratbagd_device_ref(struct ratbagd_device *device)
|
||||
{
|
||||
assert(device->refcount > 0);
|
||||
|
||||
++device->refcount;
|
||||
return device;
|
||||
}
|
||||
|
||||
struct ratbagd_device *ratbagd_device_unref(struct ratbagd_device *device)
|
||||
{
|
||||
assert(device->refcount > 0);
|
||||
|
||||
--device->refcount;
|
||||
if (device->refcount == 0)
|
||||
ratbagd_device_free(device);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char *ratbagd_device_get_sysname(struct ratbagd_device *device)
|
||||
|
||||
@@ -185,7 +185,7 @@ int ratbagd_reset_test_device(sd_bus_message *m,
|
||||
|
||||
if (ratbagd_test_device) {
|
||||
ratbagd_device_unlink(ratbagd_test_device);
|
||||
ratbagd_device_free(ratbagd_test_device);
|
||||
ratbagd_device_unref(ratbagd_test_device);
|
||||
|
||||
(void) sd_bus_emit_properties_changed(ctx->bus,
|
||||
RATBAGD_OBJ_ROOT,
|
||||
|
||||
@@ -200,7 +200,7 @@ static void ratbagd_process_device(struct ratbagd *ctx,
|
||||
/* device was removed, unlink it and destroy our context */
|
||||
if (device) {
|
||||
ratbagd_device_unlink(device);
|
||||
ratbagd_device_free(device);
|
||||
ratbagd_device_unref(device);
|
||||
|
||||
(void) sd_bus_emit_properties_changed(ctx->bus,
|
||||
RATBAGD_OBJ_ROOT,
|
||||
@@ -283,7 +283,7 @@ static struct ratbagd *ratbagd_free(struct ratbagd *ctx)
|
||||
|
||||
RATBAGD_DEVICE_FOREACH_SAFE(device, tmp, ctx) {
|
||||
ratbagd_device_unlink(device);
|
||||
ratbagd_device_free(device);
|
||||
ratbagd_device_unref(device);
|
||||
}
|
||||
|
||||
ctx->bus = sd_bus_flush_close_unref(ctx->bus);
|
||||
|
||||
@@ -170,7 +170,8 @@ int ratbagd_device_new(struct ratbagd_device **out,
|
||||
struct ratbagd *ctx,
|
||||
const char *sysname,
|
||||
struct ratbag_device *lib_device);
|
||||
struct ratbagd_device *ratbagd_device_free(struct ratbagd_device *device);
|
||||
struct ratbagd_device *ratbagd_device_ref(struct ratbagd_device *device);
|
||||
struct ratbagd_device *ratbagd_device_unref(struct ratbagd_device *device);
|
||||
const char *ratbagd_device_get_sysname(struct ratbagd_device *device);
|
||||
const char *ratbagd_device_get_path(struct ratbagd_device *device);
|
||||
unsigned int ratbagd_device_get_num_buttons(struct ratbagd_device *device);
|
||||
@@ -181,7 +182,7 @@ bool ratbagd_device_linked(struct ratbagd_device *device);
|
||||
void ratbagd_device_link(struct ratbagd_device *device);
|
||||
void ratbagd_device_unlink(struct ratbagd_device *device);
|
||||
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(struct ratbagd_device *, ratbagd_device_free);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(struct ratbagd_device *, ratbagd_device_unref);
|
||||
|
||||
struct ratbagd_device *ratbagd_device_lookup(struct ratbagd *ctx,
|
||||
const char *name);
|
||||
|
||||
Reference in New Issue
Block a user