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]

 



On Tue, Jun 03, 2025 at 12:01:08PM -0400, Luiz Augusto von Dentz wrote:
> 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
> 

If I understand correctly, you want something like this:

 static struct obc_driver pbap = {
 	.service = "PBAP",
 	.uuid = PBAP_UUID,
 	.target = OBEX_PBAP_UUID,
 	.target_len = OBEX_PBAP_UUID_LEN,
 	.supported_features = pbap_supported_features,
 	.probe = pbap_probe,
 	.remove = pbap_remove,
+ 	.seated = pbap_seated,
+ 	.unseated = pbap_unseated
 };

That's fine, but it sounds like version 2.  Would it be better to get this
bugfix ready to commit first, then talk about architecture in another thread?
I only see a couple of mistakes from bluez test bot (both "mixed declarations
and code"), but the new architecture will take a lot of work and may not be
right first time.  Having a commit with no known bugs will make bisecting
easier, and having a fix out sooner will help users.

As an example of the problems to discuss in version 2 - bluetooth.c uses
obex_transport_driver instead of obc_driver, so the changes would need to go there too.  
Getting that right will take more time and discussion, and could lead to some knock-on
change that adds more again.




[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