[PATCH 01/12] dbus-core: Move to hw/xfree86/common dir

Daniel Stone daniel at fooishbar.org
Fri Jan 17 05:08:39 PST 2014


Hi,

On 15 January 2014 14:32, Hans de Goede <hdegoede at redhat.com> wrote:
> With systemd-logind the dbus-core will be used for more then just config.
>
> This patch also makes the building of the dbus-core and udev no longer
> mutually exclusive and removes the config_ prefix from the dbus-core symbols.

The rest of your patchset looks good to me, but I'd rather this not
get moved to hw/xfree86/.  Historically, hw/xfree86/ has been a bit of
a ghetto that we've tried to move things out of, because the majority
of code in there is really terrible.  It also means you can't use HAL
support on non-XFree86 DDXes, which I admit is entirely a theoretical
concern atm, but still ...

Cheers,
Daniel

> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> ---
>  config/Makefile.am            |  12 +--
>  config/config-backends.h      |  30 +-----
>  config/config.c               |  18 +---
>  config/dbus-core.c            | 246 ------------------------------------------
>  config/hal.c                  |   7 +-
>  configure.ac                  |   8 +-
>  hw/xfree86/common/Makefile.am |   6 ++
>  hw/xfree86/common/dbus-core.c | 246 ++++++++++++++++++++++++++++++++++++++++++
>  hw/xfree86/common/xf86Init.c  |   5 +
>  include/Makefile.am           |   2 +-
>  include/dbus-core.h           |  56 ++++++++++
>  include/dix-config.h.in       |   4 +-
>  12 files changed, 333 insertions(+), 307 deletions(-)
>  delete mode 100644 config/dbus-core.c
>  create mode 100644 hw/xfree86/common/dbus-core.c
>  create mode 100644 include/dbus-core.h
>
> diff --git a/config/Makefile.am b/config/Makefile.am
> index 0740e46..c5cd4fe 100644
> --- a/config/Makefile.am
> +++ b/config/Makefile.am
> @@ -16,16 +16,10 @@ endif
>
>  else
>
> -if CONFIG_NEED_DBUS
> -AM_CFLAGS += $(DBUS_CFLAGS)
> -libconfig_la_SOURCES += dbus-core.c
> -libconfig_la_LIBADD = $(DBUS_LIBS)
> -
>  if CONFIG_HAL
> -AM_CFLAGS += $(HAL_CFLAGS)
> +AM_CFLAGS += $(DBUS_CFLAGS) $(HAL_CFLAGS)
>  libconfig_la_SOURCES += hal.c
> -libconfig_la_LIBADD += $(HAL_LIBS)
> -endif
> +libconfig_la_LIBADD = $(HAL_LIBS)
>
>  else
>
> @@ -33,7 +27,7 @@ if CONFIG_WSCONS
>  libconfig_la_SOURCES += wscons.c
>  endif # CONFIG_WSCONS
>
> -endif # CONFIG_NEED_DBUS
> +endif # !CONFIG_HAL
>
>  endif # !CONFIG_UDEV
>
> diff --git a/config/config-backends.h b/config/config-backends.h
> index 5a715b3..5f07557 100644
> --- a/config/config-backends.h
> +++ b/config/config-backends.h
> @@ -37,36 +37,10 @@ int config_udev_pre_init(void);
>  int config_udev_init(void);
>  void config_udev_fini(void);
>  void config_udev_odev_probe(config_odev_probe_proc_ptr probe_callback);
> -#else
> -
> -#ifdef CONFIG_NEED_DBUS
> -#include <dbus/dbus.h>
> -
> -typedef void (*config_dbus_core_connect_hook) (DBusConnection * connection,
> -                                               void *data);
> -typedef void (*config_dbus_core_disconnect_hook) (void *data);
> -
> -struct config_dbus_core_hook {
> -    config_dbus_core_connect_hook connect;
> -    config_dbus_core_disconnect_hook disconnect;
> -    void *data;
> -
> -    struct config_dbus_core_hook *next;
> -};
> -
> -int config_dbus_core_init(void);
> -void config_dbus_core_fini(void);
> -int config_dbus_core_add_hook(struct config_dbus_core_hook *hook);
> -void config_dbus_core_remove_hook(struct config_dbus_core_hook *hook);
> -#endif
> -
> -#ifdef CONFIG_HAL
> +#elif defined(CONFIG_HAL)
>  int config_hal_init(void);
>  void config_hal_fini(void);
> -#endif
> -#endif
> -
> -#ifdef CONFIG_WSCONS
> +#elif defined(CONFIG_WSCONS)
>  int config_wscons_init(void);
>  void config_wscons_fini(void);
>  #endif
> diff --git a/config/config.c b/config/config.c
> index 554069f..760cf19 100644
> --- a/config/config.c
> +++ b/config/config.c
> @@ -47,16 +47,9 @@ config_init(void)
>  #ifdef CONFIG_UDEV
>      if (!config_udev_init())
>          ErrorF("[config] failed to initialise udev\n");
> -#elif defined(CONFIG_NEED_DBUS)
> -    if (config_dbus_core_init()) {
> -#ifdef CONFIG_HAL
> -        if (!config_hal_init())
> -            ErrorF("[config] failed to initialise HAL\n");
> -#endif
> -    }
> -    else {
> -        ErrorF("[config] failed to initialise D-Bus core\n");
> -    }
> +#elif defined(CONFIG_HAL)
> +    if (!config_hal_init())
> +        ErrorF("[config] failed to initialise HAL\n");
>  #elif defined(CONFIG_WSCONS)
>      if (!config_wscons_init())
>          ErrorF("[config] failed to initialise wscons\n");
> @@ -68,11 +61,8 @@ config_fini(void)
>  {
>  #if defined(CONFIG_UDEV)
>      config_udev_fini();
> -#elif defined(CONFIG_NEED_DBUS)
> -#ifdef CONFIG_HAL
> +#elif defined(CONFIG_HAL)
>      config_hal_fini();
> -#endif
> -    config_dbus_core_fini();
>  #elif defined(CONFIG_WSCONS)
>      config_wscons_fini();
>  #endif
> diff --git a/config/dbus-core.c b/config/dbus-core.c
> deleted file mode 100644
> index 768a984..0000000
> --- a/config/dbus-core.c
> +++ /dev/null
> @@ -1,246 +0,0 @@
> -/*
> - * Copyright © 2006-2007 Daniel Stone
> - *
> - * Permission is hereby granted, free of charge, to any person obtaining a
> - * copy of this software and associated documentation files (the "Software"),
> - * to deal in the Software without restriction, including without limitation
> - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> - * and/or sell copies of the Software, and to permit persons to whom the
> - * Software is furnished to do so, subject to the following conditions:
> - *
> - * The above copyright notice and this permission notice (including the next
> - * paragraph) shall be included in all copies or substantial portions of the
> - * Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> - * DEALINGS IN THE SOFTWARE.
> - *
> - * Author: Daniel Stone <daniel at fooishbar.org>
> - */
> -
> -#ifdef HAVE_DIX_CONFIG_H
> -#include <dix-config.h>
> -#endif
> -
> -#include <dbus/dbus.h>
> -#include <sys/select.h>
> -
> -#include "config-backends.h"
> -#include "dix.h"
> -#include "os.h"
> -
> -/* How often to attempt reconnecting when we get booted off the bus. */
> -#define RECONNECT_DELAY (10 * 1000)     /* in ms */
> -
> -struct dbus_core_info {
> -    int fd;
> -    DBusConnection *connection;
> -    OsTimerPtr timer;
> -    struct config_dbus_core_hook *hooks;
> -};
> -static struct dbus_core_info bus_info;
> -
> -static CARD32 reconnect_timer(OsTimerPtr timer, CARD32 time, void *arg);
> -
> -static void
> -wakeup_handler(void *data, int err, void *read_mask)
> -{
> -    struct dbus_core_info *info = data;
> -
> -    if (info->connection && FD_ISSET(info->fd, (fd_set *) read_mask)) {
> -        do {
> -            dbus_connection_read_write_dispatch(info->connection, 0);
> -        } while (info->connection &&
> -                 dbus_connection_get_is_connected(info->connection) &&
> -                 dbus_connection_get_dispatch_status(info->connection) ==
> -                 DBUS_DISPATCH_DATA_REMAINS);
> -    }
> -}
> -
> -static void
> -block_handler(void *data, struct timeval **tv, void *read_mask)
> -{
> -}
> -
> -/**
> - * Disconnect (if we haven't already been forcefully disconnected), clean up
> - * after ourselves, and call all registered disconnect hooks.
> - */
> -static void
> -teardown(void)
> -{
> -    struct config_dbus_core_hook *hook;
> -
> -    if (bus_info.timer) {
> -        TimerFree(bus_info.timer);
> -        bus_info.timer = NULL;
> -    }
> -
> -    /* We should really have pre-disconnect hooks and run them here, for
> -     * completeness.  But then it gets awkward, given that you can't
> -     * guarantee that they'll be called ... */
> -    if (bus_info.connection)
> -        dbus_connection_unref(bus_info.connection);
> -
> -    RemoveBlockAndWakeupHandlers(block_handler, wakeup_handler, &bus_info);
> -    if (bus_info.fd != -1)
> -        RemoveGeneralSocket(bus_info.fd);
> -    bus_info.fd = -1;
> -    bus_info.connection = NULL;
> -
> -    for (hook = bus_info.hooks; hook; hook = hook->next) {
> -        if (hook->disconnect)
> -            hook->disconnect(hook->data);
> -    }
> -}
> -
> -/**
> - * This is a filter, which only handles the disconnected signal, which
> - * doesn't go to the normal message handling function.  This takes
> - * precedence over the message handling function, so have have to be
> - * careful to ignore anything we don't want to deal with here.
> - */
> -static DBusHandlerResult
> -message_filter(DBusConnection * connection, DBusMessage * message, void *data)
> -{
> -    /* If we get disconnected, then take everything down, and attempt to
> -     * reconnect immediately (assuming it's just a restart).  The
> -     * connection isn't valid at this point, so throw it out immediately. */
> -    if (dbus_message_is_signal(message, DBUS_INTERFACE_LOCAL, "Disconnected")) {
> -        DebugF("[config/dbus-core] disconnected from bus\n");
> -        bus_info.connection = NULL;
> -        teardown();
> -
> -        if (bus_info.timer)
> -            TimerFree(bus_info.timer);
> -        bus_info.timer = TimerSet(NULL, 0, 1, reconnect_timer, NULL);
> -
> -        return DBUS_HANDLER_RESULT_HANDLED;
> -    }
> -
> -    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
> -}
> -
> -/**
> - * Attempt to connect to the system bus, and set a filter to deal with
> - * disconnection (see message_filter above).
> - *
> - * @return 1 on success, 0 on failure.
> - */
> -static int
> -connect_to_bus(void)
> -{
> -    DBusError error;
> -    struct config_dbus_core_hook *hook;
> -
> -    dbus_error_init(&error);
> -    bus_info.connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
> -    if (!bus_info.connection || dbus_error_is_set(&error)) {
> -        DebugF("[config/dbus-core] error connecting to system bus: %s (%s)\n",
> -               error.name, error.message);
> -        goto err_begin;
> -    }
> -
> -    /* Thankyou.  Really, thankyou. */
> -    dbus_connection_set_exit_on_disconnect(bus_info.connection, FALSE);
> -
> -    if (!dbus_connection_get_unix_fd(bus_info.connection, &bus_info.fd)) {
> -        ErrorF("[config/dbus-core] couldn't get fd for system bus\n");
> -        goto err_unref;
> -    }
> -
> -    if (!dbus_connection_add_filter(bus_info.connection, message_filter,
> -                                    &bus_info, NULL)) {
> -        ErrorF("[config/dbus-core] couldn't add filter: %s (%s)\n", error.name,
> -               error.message);
> -        goto err_fd;
> -    }
> -
> -    dbus_error_free(&error);
> -    AddGeneralSocket(bus_info.fd);
> -
> -    RegisterBlockAndWakeupHandlers(block_handler, wakeup_handler, &bus_info);
> -
> -    for (hook = bus_info.hooks; hook; hook = hook->next) {
> -        if (hook->connect)
> -            hook->connect(bus_info.connection, hook->data);
> -    }
> -
> -    return 1;
> -
> - err_fd:
> -    bus_info.fd = -1;
> - err_unref:
> -    dbus_connection_unref(bus_info.connection);
> -    bus_info.connection = NULL;
> - err_begin:
> -    dbus_error_free(&error);
> -
> -    return 0;
> -}
> -
> -static CARD32
> -reconnect_timer(OsTimerPtr timer, CARD32 time, void *arg)
> -{
> -    if (connect_to_bus()) {
> -        TimerFree(bus_info.timer);
> -        bus_info.timer = NULL;
> -        return 0;
> -    }
> -    else {
> -        return RECONNECT_DELAY;
> -    }
> -}
> -
> -int
> -config_dbus_core_add_hook(struct config_dbus_core_hook *hook)
> -{
> -    struct config_dbus_core_hook **prev;
> -
> -    for (prev = &bus_info.hooks; *prev; prev = &(*prev)->next);
> -
> -    hook->next = NULL;
> -    *prev = hook;
> -
> -    /* If we're already connected, call the connect hook. */
> -    if (bus_info.connection)
> -        hook->connect(bus_info.connection, hook->data);
> -
> -    return 1;
> -}
> -
> -void
> -config_dbus_core_remove_hook(struct config_dbus_core_hook *hook)
> -{
> -    struct config_dbus_core_hook **prev;
> -
> -    for (prev = &bus_info.hooks; *prev; prev = &(*prev)->next) {
> -        if (*prev == hook) {
> -            *prev = hook->next;
> -            break;
> -        }
> -    }
> -}
> -
> -int
> -config_dbus_core_init(void)
> -{
> -    memset(&bus_info, 0, sizeof(bus_info));
> -    bus_info.fd = -1;
> -    bus_info.hooks = NULL;
> -    bus_info.connection = NULL;
> -    bus_info.timer = TimerSet(NULL, 0, 1, reconnect_timer, NULL);
> -
> -    return 1;
> -}
> -
> -void
> -config_dbus_core_fini(void)
> -{
> -    teardown();
> -}
> diff --git a/config/hal.c b/config/hal.c
> index 2ead556..94cb6e7 100644
> --- a/config/hal.c
> +++ b/config/hal.c
> @@ -33,6 +33,7 @@
>  #include <string.h>
>  #include <sys/select.h>
>
> +#include "dbus-core.h"
>  #include "input.h"
>  #include "inputstr.h"
>  #include "hotplug.h"
> @@ -631,7 +632,7 @@ connect_hook(DBusConnection * connection, void *data)
>
>  static struct config_hal_info hal_info;
>
> -static struct config_dbus_core_hook hook = {
> +static struct dbus_core_hook hook = {
>      .connect = connect_hook,
>      .disconnect = disconnect_hook,
>      .data = &hal_info,
> @@ -644,7 +645,7 @@ config_hal_init(void)
>      hal_info.system_bus = NULL;
>      hal_info.hal_ctx = NULL;
>
> -    if (!config_dbus_core_add_hook(&hook)) {
> +    if (!dbus_core_add_hook(&hook)) {
>          LogMessage(X_ERROR, "config/hal: failed to add D-Bus hook\n");
>          return 0;
>      }
> @@ -658,5 +659,5 @@ config_hal_init(void)
>  void
>  config_hal_fini(void)
>  {
> -    config_dbus_core_remove_hook(&hook);
> +    dbus_core_remove_hook(&hook);
>  }
> diff --git a/configure.ac b/configure.ac
> index 2ae09e0..c277593 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -898,14 +898,14 @@ if test "x$CONFIG_HAL" = xyes; then
>         fi
>
>         AC_DEFINE(CONFIG_HAL, 1, [Use the HAL hotplug API])
> -       CONFIG_NEED_DBUS="yes"
> +       NEED_DBUS="yes"
>  fi
>  AM_CONDITIONAL(CONFIG_HAL, [test "x$CONFIG_HAL" = xyes])
>
> -if test "x$CONFIG_NEED_DBUS" = xyes; then
> -        AC_DEFINE(CONFIG_NEED_DBUS, 1, [Use D-Bus for input hotplug])
> +if test "x$NEED_DBUS" = xyes; then
> +        AC_DEFINE(NEED_DBUS, 1, [Enable D-Bus core])
>  fi
> -AM_CONDITIONAL(CONFIG_NEED_DBUS, [test "x$CONFIG_NEED_DBUS" = xyes])
> +AM_CONDITIONAL(NEED_DBUS, [test "x$NEED_DBUS" = xyes])
>
>  if test "x$CONFIG_WSCONS" = xauto; then
>         case $host_os in
> diff --git a/hw/xfree86/common/Makefile.am b/hw/xfree86/common/Makefile.am
> index 7a2b4bc..01a0047 100644
> --- a/hw/xfree86/common/Makefile.am
> +++ b/hw/xfree86/common/Makefile.am
> @@ -104,3 +104,9 @@ XORG_CFLAGS += -DHAVE_ACPI
>  endif
>
>  AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
> +
> +if NEED_DBUS
> +AM_CFLAGS += $(DBUS_CFLAGS)
> +libcommon_la_SOURCES += dbus-core.c
> +libcommon_la_LIBADD += $(DBUS_LIBS)
> +endif
> diff --git a/hw/xfree86/common/dbus-core.c b/hw/xfree86/common/dbus-core.c
> new file mode 100644
> index 0000000..43d6281
> --- /dev/null
> +++ b/hw/xfree86/common/dbus-core.c
> @@ -0,0 +1,246 @@
> +/*
> + * Copyright © 2006-2007 Daniel Stone
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> + * DEALINGS IN THE SOFTWARE.
> + *
> + * Author: Daniel Stone <daniel at fooishbar.org>
> + */
> +
> +#ifdef HAVE_DIX_CONFIG_H
> +#include <dix-config.h>
> +#endif
> +
> +#include <dbus/dbus.h>
> +#include <sys/select.h>
> +
> +#include "dix.h"
> +#include "os.h"
> +#include "dbus-core.h"
> +
> +/* How often to attempt reconnecting when we get booted off the bus. */
> +#define RECONNECT_DELAY (10 * 1000)     /* in ms */
> +
> +struct dbus_core_info {
> +    int fd;
> +    DBusConnection *connection;
> +    OsTimerPtr timer;
> +    struct dbus_core_hook *hooks;
> +};
> +static struct dbus_core_info bus_info;
> +
> +static CARD32 reconnect_timer(OsTimerPtr timer, CARD32 time, void *arg);
> +
> +static void
> +wakeup_handler(void *data, int err, void *read_mask)
> +{
> +    struct dbus_core_info *info = data;
> +
> +    if (info->connection && FD_ISSET(info->fd, (fd_set *) read_mask)) {
> +        do {
> +            dbus_connection_read_write_dispatch(info->connection, 0);
> +        } while (info->connection &&
> +                 dbus_connection_get_is_connected(info->connection) &&
> +                 dbus_connection_get_dispatch_status(info->connection) ==
> +                 DBUS_DISPATCH_DATA_REMAINS);
> +    }
> +}
> +
> +static void
> +block_handler(void *data, struct timeval **tv, void *read_mask)
> +{
> +}
> +
> +/**
> + * Disconnect (if we haven't already been forcefully disconnected), clean up
> + * after ourselves, and call all registered disconnect hooks.
> + */
> +static void
> +teardown(void)
> +{
> +    struct dbus_core_hook *hook;
> +
> +    if (bus_info.timer) {
> +        TimerFree(bus_info.timer);
> +        bus_info.timer = NULL;
> +    }
> +
> +    /* We should really have pre-disconnect hooks and run them here, for
> +     * completeness.  But then it gets awkward, given that you can't
> +     * guarantee that they'll be called ... */
> +    if (bus_info.connection)
> +        dbus_connection_unref(bus_info.connection);
> +
> +    RemoveBlockAndWakeupHandlers(block_handler, wakeup_handler, &bus_info);
> +    if (bus_info.fd != -1)
> +        RemoveGeneralSocket(bus_info.fd);
> +    bus_info.fd = -1;
> +    bus_info.connection = NULL;
> +
> +    for (hook = bus_info.hooks; hook; hook = hook->next) {
> +        if (hook->disconnect)
> +            hook->disconnect(hook->data);
> +    }
> +}
> +
> +/**
> + * This is a filter, which only handles the disconnected signal, which
> + * doesn't go to the normal message handling function.  This takes
> + * precedence over the message handling function, so have have to be
> + * careful to ignore anything we don't want to deal with here.
> + */
> +static DBusHandlerResult
> +message_filter(DBusConnection * connection, DBusMessage * message, void *data)
> +{
> +    /* If we get disconnected, then take everything down, and attempt to
> +     * reconnect immediately (assuming it's just a restart).  The
> +     * connection isn't valid at this point, so throw it out immediately. */
> +    if (dbus_message_is_signal(message, DBUS_INTERFACE_LOCAL, "Disconnected")) {
> +        DebugF("[dbus-core] disconnected from bus\n");
> +        bus_info.connection = NULL;
> +        teardown();
> +
> +        if (bus_info.timer)
> +            TimerFree(bus_info.timer);
> +        bus_info.timer = TimerSet(NULL, 0, 1, reconnect_timer, NULL);
> +
> +        return DBUS_HANDLER_RESULT_HANDLED;
> +    }
> +
> +    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
> +}
> +
> +/**
> + * Attempt to connect to the system bus, and set a filter to deal with
> + * disconnection (see message_filter above).
> + *
> + * @return 1 on success, 0 on failure.
> + */
> +static int
> +connect_to_bus(void)
> +{
> +    DBusError error;
> +    struct dbus_core_hook *hook;
> +
> +    dbus_error_init(&error);
> +    bus_info.connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
> +    if (!bus_info.connection || dbus_error_is_set(&error)) {
> +        LogMessage(X_ERROR, "dbus-core: error connecting to system bus: %s (%s)\n",
> +               error.name, error.message);
> +        goto err_begin;
> +    }
> +
> +    /* Thankyou.  Really, thankyou. */
> +    dbus_connection_set_exit_on_disconnect(bus_info.connection, FALSE);
> +
> +    if (!dbus_connection_get_unix_fd(bus_info.connection, &bus_info.fd)) {
> +        ErrorF("[dbus-core] couldn't get fd for system bus\n");
> +        goto err_unref;
> +    }
> +
> +    if (!dbus_connection_add_filter(bus_info.connection, message_filter,
> +                                    &bus_info, NULL)) {
> +        ErrorF("[dbus-core] couldn't add filter: %s (%s)\n", error.name,
> +               error.message);
> +        goto err_fd;
> +    }
> +
> +    dbus_error_free(&error);
> +    AddGeneralSocket(bus_info.fd);
> +
> +    RegisterBlockAndWakeupHandlers(block_handler, wakeup_handler, &bus_info);
> +
> +    for (hook = bus_info.hooks; hook; hook = hook->next) {
> +        if (hook->connect)
> +            hook->connect(bus_info.connection, hook->data);
> +    }
> +
> +    return 1;
> +
> + err_fd:
> +    bus_info.fd = -1;
> + err_unref:
> +    dbus_connection_unref(bus_info.connection);
> +    bus_info.connection = NULL;
> + err_begin:
> +    dbus_error_free(&error);
> +
> +    return 0;
> +}
> +
> +static CARD32
> +reconnect_timer(OsTimerPtr timer, CARD32 time, void *arg)
> +{
> +    if (connect_to_bus()) {
> +        TimerFree(bus_info.timer);
> +        bus_info.timer = NULL;
> +        return 0;
> +    }
> +    else {
> +        return RECONNECT_DELAY;
> +    }
> +}
> +
> +int
> +dbus_core_add_hook(struct dbus_core_hook *hook)
> +{
> +    struct dbus_core_hook **prev;
> +
> +    for (prev = &bus_info.hooks; *prev; prev = &(*prev)->next);
> +
> +    hook->next = NULL;
> +    *prev = hook;
> +
> +    /* If we're already connected, call the connect hook. */
> +    if (bus_info.connection)
> +        hook->connect(bus_info.connection, hook->data);
> +
> +    return 1;
> +}
> +
> +void
> +dbus_core_remove_hook(struct dbus_core_hook *hook)
> +{
> +    struct dbus_core_hook **prev;
> +
> +    for (prev = &bus_info.hooks; *prev; prev = &(*prev)->next) {
> +        if (*prev == hook) {
> +            *prev = hook->next;
> +            break;
> +        }
> +    }
> +}
> +
> +int
> +dbus_core_init(void)
> +{
> +    memset(&bus_info, 0, sizeof(bus_info));
> +    bus_info.fd = -1;
> +    bus_info.hooks = NULL;
> +    bus_info.connection = NULL;
> +    bus_info.timer = TimerSet(NULL, 0, 1, reconnect_timer, NULL);
> +
> +    return 1;
> +}
> +
> +void
> +dbus_core_fini(void)
> +{
> +    teardown();
> +}
> diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
> index c63fdcb..815f679 100644
> --- a/hw/xfree86/common/xf86Init.c
> +++ b/hw/xfree86/common/xf86Init.c
> @@ -53,6 +53,7 @@
>  #include "scrnintstr.h"
>  #include "site.h"
>  #include "mi.h"
> +#include "dbus-core.h"
>
>  #include "compiler.h"
>
> @@ -456,6 +457,8 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
>          if (xf86DoShowOptions)
>              DoShowOptions();
>
> +        dbus_core_init();
> +
>          /* Do a general bus probe.  This will be a PCI probe for x86 platforms */
>          xf86BusProbe();
>
> @@ -1059,6 +1062,8 @@ ddxGiveUp(enum ExitCode error)
>      if (xorgHWOpenConsole)
>          xf86CloseConsole();
>
> +    dbus_core_fini();
> +
>      xf86CloseLog(error);
>
>      /* If an unexpected signal was caught, dump a core for debugging */
> diff --git a/include/Makefile.am b/include/Makefile.am
> index 93d8616..fa6da00 100644
> --- a/include/Makefile.am
> +++ b/include/Makefile.am
> @@ -68,7 +68,7 @@ endif
>  AM_CFLAGS = $(DIX_CFLAGS)
>
>  EXTRA_DIST =   \
> -       busfault.h      \
> +       busfault.h dbus-core.h \
>         dix-config-apple-verbatim.h \
>         dixfontstubs.h eventconvert.h eventstr.h inpututils.h \
>         protocol-versions.h \
> diff --git a/include/dbus-core.h b/include/dbus-core.h
> new file mode 100644
> index 0000000..b2d6d1b
> --- /dev/null
> +++ b/include/dbus-core.h
> @@ -0,0 +1,56 @@
> +/*
> + * Copyright © 2013 Red Hat, Inc.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> + * DEALINGS IN THE SOFTWARE.
> + *
> + * Author: Hans de Goede <hdegoede at redhat.com>
> + */
> +
> +#ifndef DBUS_CORE_H
> +#define DBUS_CORE_H
> +
> +#ifdef NEED_DBUS
> +typedef struct DBusConnection DBusConnection;
> +
> +typedef void (*dbus_core_connect_hook) (DBusConnection * connection,
> +                                               void *data);
> +typedef void (*dbus_core_disconnect_hook) (void *data);
> +
> +struct dbus_core_hook {
> +    dbus_core_connect_hook connect;
> +    dbus_core_disconnect_hook disconnect;
> +    void *data;
> +
> +    struct dbus_core_hook *next;
> +};
> +
> +int dbus_core_init(void);
> +void dbus_core_fini(void);
> +int dbus_core_add_hook(struct dbus_core_hook *hook);
> +void dbus_core_remove_hook(struct dbus_core_hook *hook);
> +
> +#else
> +
> +#define dbus_core_init()
> +#define dbus_core_fini()
> +
> +#endif
> +
> +#endif
> diff --git a/include/dix-config.h.in b/include/dix-config.h.in
> index 774a787..caea9b2 100644
> --- a/include/dix-config.h.in
> +++ b/include/dix-config.h.in
> @@ -414,8 +414,8 @@
>  /* Use udev_enumerate_add_match_tag() */
>  #undef HAVE_UDEV_ENUMERATE_ADD_MATCH_TAG
>
> -/* Use D-Bus for input hotplug */
> -#undef CONFIG_NEED_DBUS
> +/* Enable D-Bus core */
> +#undef NEED_DBUS
>
>  /* Support HAL for hotplug */
>  #undef CONFIG_HAL
> --
> 1.8.4.2
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel


More information about the xorg-devel mailing list