Re: [PATCH BlueZ 1/3] obexd: Pass at_(un)register value to logind callbacks

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Andrew,

On Tue, Jun 3, 2025 at 11:17 AM Andrew Sayers
<kernel.org@xxxxxxxxxxxxxxx> wrote:
>
> Logind (un)registers callbacks that it calls when the user's state changes.
> Callbacks may also be called during (un)registration.
> Clients may need to handle those initial/final calls specially.
>
> Pass an argument indicating whether this is being called during
> (un)registration, and modify existing callbacks to ignore that argument.
>
> Signed-off-by: Andrew Sayers <kernel.org@xxxxxxxxxxxxxxx>
> ---
>  obexd/client/pbap.c       |  6 ++++--
>  obexd/plugins/bluetooth.c |  6 ++++--
>  obexd/src/logind.c        | 14 +++++++-------
>  obexd/src/logind.h        |  8 ++++----
>  4 files changed, 19 insertions(+), 15 deletions(-)
>
> diff --git a/obexd/client/pbap.c b/obexd/client/pbap.c
> index 51b523592..64bb8ff72 100644
> --- a/obexd/client/pbap.c
> +++ b/obexd/client/pbap.c
> @@ -1455,8 +1455,9 @@ static struct obc_driver pbap = {
>         .remove = pbap_remove
>  };
>
> -static int pbap_init_cb(void)
> +static int pbap_init_cb(gboolean at_register)
>  {
> +       (void)at_register;
>         int err;
>
>         DBG("");
> @@ -1482,8 +1483,9 @@ static int pbap_init_cb(void)
>         return 0;
>  }
>
> -static void pbap_exit_cb(void)
> +static void pbap_exit_cb(gboolean at_unregister)
>  {
> +       (void)at_unregister;
>         DBG("");
>
>         g_dbus_remove_watch(system_conn, listener_id);
> diff --git a/obexd/plugins/bluetooth.c b/obexd/plugins/bluetooth.c
> index 7ff27a8a8..ad37e636d 100644
> --- a/obexd/plugins/bluetooth.c
> +++ b/obexd/plugins/bluetooth.c
> @@ -427,8 +427,9 @@ static const struct obex_transport_driver driver = {
>
>  static unsigned int listener_id = 0;
>
> -static int bluetooth_init_cb(void)
> +static int bluetooth_init_cb(gboolean at_register)
>  {
> +       (void)at_register;
>         connection = g_dbus_setup_private(DBUS_BUS_SYSTEM, NULL, NULL);
>         if (connection == NULL)
>                 return -EPERM;
> @@ -439,8 +440,9 @@ static int bluetooth_init_cb(void)
>         return obex_transport_driver_register(&driver);
>  }
>
> -static void bluetooth_exit_cb(void)
> +static void bluetooth_exit_cb(gboolean at_unregister)
>  {
> +       (void)at_unregister;
>         GSList *l;
>
>         g_dbus_remove_watch(connection, listener_id);
> diff --git a/obexd/src/logind.c b/obexd/src/logind.c
> index a0eb62b1e..b4279b209 100644
> --- a/obexd/src/logind.c
> +++ b/obexd/src/logind.c
> @@ -43,13 +43,13 @@ static void call_init_cb(gpointer data, gpointer user_data)
>  {
>         int res;
>
> -       res = ((struct callback_pair *)data)->init_cb();
> +       res = ((struct callback_pair *)data)->init_cb(FALSE);
>         if (res)
>                 *(int *)user_data = res;
>  }
>  static void call_exit_cb(gpointer data, gpointer user_data)
>  {
> -       ((struct callback_pair *)data)->exit_cb();
> +       ((struct callback_pair *)data)->exit_cb(FALSE);
>  }
>
>  static int update(void)
> @@ -229,7 +229,7 @@ int logind_register(logind_init_cb init_cb, logind_exit_cb exit_cb)
>         struct callback_pair *cbs;
>
>         if (!monitoring_enabled)
> -               return init_cb();
> +               return init_cb(TRUE);
>         if (callbacks == NULL) {
>                 int res;
>
> @@ -237,23 +237,23 @@ int logind_register(logind_init_cb init_cb, logind_exit_cb exit_cb)
>                 if (res) {
>                         error("logind_init(): %s - login detection disabled",
>                                 strerror(-res));
> -                       return init_cb();
> +                       return init_cb(TRUE);
>                 }
>         }
>         cbs = g_new(struct callback_pair, 1);
>         cbs->init_cb = init_cb;
>         cbs->exit_cb = exit_cb;
>         callbacks = g_slist_prepend(callbacks, cbs);
> -       return active ? init_cb() : 0;
> +       return active ? init_cb(TRUE) : 0;
>  }
>  void logind_unregister(logind_init_cb init_cb, logind_exit_cb exit_cb)
>  {
>         GSList *cb_node;
>
>         if (!monitoring_enabled)
> -               return exit_cb();
> +               return exit_cb(TRUE);
>         if (active)
> -               exit_cb();
> +               exit_cb(TRUE);
>         cb_node = g_slist_find_custom(callbacks, init_cb, find_cb);
>         if (cb_node != NULL)
>                 callbacks = g_slist_delete_link(callbacks, cb_node);
> diff --git a/obexd/src/logind.h b/obexd/src/logind.h
> index eb3ff8d7b..3cdb03338 100644
> --- a/obexd/src/logind.h
> +++ b/obexd/src/logind.h
> @@ -8,8 +8,8 @@
>   *
>   */
>
> -typedef int (*logind_init_cb)(void);
> -typedef void (*logind_exit_cb)(void);
> +typedef int (*logind_init_cb)(gboolean at_register);
> +typedef void (*logind_exit_cb)(gboolean at_unregister);
>
>  #ifdef SYSTEMD
>
> @@ -22,12 +22,12 @@ int logind_set(gboolean enabled);
>  static inline int logind_register(logind_init_cb init_cb,
>                                         logind_exit_cb exit_cb)
>  {
> -       return init_cb();
> +       return init_cb(TRUE);
>  }
>  static inline void logind_unregister(logind_init_cb init_cb,
>                                         logind_exit_cb exit_cb)
>  {
> -       return exit_cb();
> +       return exit_cb(TRUE);
>  }
>  static inline int logind_set(gboolean enabled)
>  {
> --
> 2.49.0

This is not going very well in my opinion, it looks like we missed the
opportunity to integrate the logind directly into obc_driver so we
don't have to duplicate code for each coded, so we keep just doing
plugin_init->obc_driver_register/plugin_exit->obc_driver_unregister
and that internally can detect when it shall be registered with the
Bluetoothd, etc, plugin_exit->obc_driver_unregister can actually be
assumed to be exit rather than just D-Bus unregister which happens
when seat is not longer active.

-- 
Luiz Augusto von Dentz





[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux