Paulo César Pereira de Andrade wrote:
>> I think it'd be better to set a timer to fire off the reinitialization
>> rather
>> than a simple usleep. Doing so allows us to finish the server
>> initialization
>> without having to wait for hal. Any opinions?
>
> I can rework my patch to remove the "hal_giveup()" function, and
> use a timer firing like every 8 seconds. The idea of fallback to
> load/use kbd/mouse would be really only useful in a few special
> cases on broken setups (usually development setups :-), so that
> one would have a functional keyboard/mouse after sometime, as long
> as the kdb and mouse drivers were functional ("wrong" abi would
> be enough to have a inputless X Server...).
Attached the new version without attempting any magic fallback
(and using 8 spaces instead of tabs)
Tested and functional by stoping hald, running startx, and starting
hald from a ssh connection, so that in no more then 8 seconds the
keyboard and mouse start responding...
Paulo
>From 33e4f4ddc228a359f8a9493f37dd0edcdc2aa78a Mon Sep 17 00:00:00 2001
From: Paulo Cesar Pereira de Andrade <[email protected]>
Date: Wed, 21 Jan 2009 14:54:48 -0200
Subject: [PATCH] Add a connect retry timer to interface hal daemon.
Hal may be initialized in the background, and not accepting
connections by the time the X Server attempts to connect to it.
This patch adds a retry timer that fires every 8 seconds.
---
config/hal.c | 49 +++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 41 insertions(+), 8 deletions(-)
diff --git a/config/hal.c b/config/hal.c
index 8dfbb07..3b17579 100644
--- a/config/hal.c
+++ b/config/hal.c
@@ -43,10 +43,13 @@
#define LIBHAL_PROP_KEY "input.x11_options."
#define LIBHAL_XKB_PROP_KEY "input.xkb."
+/* Retry hal connection every 8 seconds */
+#define RECONNECT_TIMEOUT (8 * 1000)
struct config_hal_info {
DBusConnection *system_bus;
LibHalContext *hal_ctx;
+ OsTimerPtr timer;
};
/* Used for special handling of xkb options. */
@@ -58,6 +61,11 @@ struct xkb_options {
char* options;
};
+static int
+hal_connect(struct config_hal_info *info);
+
+static CARD32
+hal_connect_timer(OsTimerPtr timer, CARD32 time, pointer arg);
static void
remove_device(DeviceIntPtr dev)
@@ -467,16 +475,13 @@ disconnect_hook(void *data)
info->system_bus = NULL;
}
-static void
-connect_hook(DBusConnection *connection, void *data)
+static int
+hal_connect(struct config_hal_info *info)
{
DBusError error;
- struct config_hal_info *info = data;
char **devices;
int num_devices, i;
- info->system_bus = connection;
-
dbus_error_init(&error);
if (!info->hal_ctx)
@@ -485,6 +490,7 @@ connect_hook(DBusConnection *connection, void *data)
LogMessage(X_ERROR, "config/hal: couldn't create HAL context\n");
goto out_err;
}
+ libhal_ctx_set_cache(info->hal_ctx, FALSE);
if (!libhal_ctx_set_dbus_connection(info->hal_ctx, info->system_bus)) {
LogMessage(X_ERROR, "config/hal: couldn't associate HAL context with bus\n");
@@ -512,7 +518,7 @@ connect_hook(DBusConnection *connection, void *data)
dbus_error_free(&error);
- return;
+ return 0;
out_ctx2:
if (!libhal_ctx_shutdown(info->hal_ctx, &error))
@@ -524,9 +530,36 @@ out_err:
dbus_error_free(&error);
info->hal_ctx = NULL;
- info->system_bus = NULL;
- return;
+ return 1;
+}
+
+static CARD32
+hal_connect_timer(OsTimerPtr timer, CARD32 time, pointer arg)
+{
+ struct config_hal_info *info = (struct config_hal_info *)arg;
+
+ if (hal_connect(info) == 0) {
+ TimerFree(info->timer);
+ info->timer = NULL;
+ return 0;
+ }
+
+ return RECONNECT_TIMEOUT;
+}
+
+static void
+connect_hook(DBusConnection *connection, void *data)
+{
+ struct config_hal_info *info = data;
+
+ info->system_bus = connection;
+ if (hal_connect(info) != 0) {
+ if (info->timer)
+ TimerFree(info->timer);
+ info->timer = TimerSet(NULL, 0, RECONNECT_TIMEOUT,
+ hal_connect_timer, info);
+ }
}
static struct config_hal_info hal_info;
--
1.6.0.5
_______________________________________________
xorg mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/xorg