diff options
author | Johan Hedberg <johan.hedberg@nokia.com> | 2006-08-20 22:31:34 +0000 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2006-08-20 22:31:34 +0000 |
commit | d93952ad4b8e6ae7e212037ed1b37940560e814c (patch) | |
tree | ca5425fdfc7c889651f08615eae2529c9da91939 | |
parent | ec3ac41ca8876f36cc8869ab1c384980f793c40f (diff) |
Fix processing of the timeout list in GMainContext
-rw-r--r-- | common/glib-ectomy.c | 65 | ||||
-rw-r--r-- | common/glib-ectomy.h | 1 | ||||
-rw-r--r-- | hcid/dbus-security.c | 5 |
3 files changed, 45 insertions, 26 deletions
diff --git a/common/glib-ectomy.c b/common/glib-ectomy.c index f90973ba..f4e552cd 100644 --- a/common/glib-ectomy.c +++ b/common/glib-ectomy.c @@ -230,21 +230,26 @@ static int timeout_cmp(const void *t1, const void *t2) static void timeout_handlers_check(GMainContext *context) { - struct slist *l = context->ltimeout; struct timeout *t; struct timeval tv; gettimeofday(&tv, NULL); - while (l) { + context->processed = NULL; + + while (context->ltimeout) { struct slist *match; + glong secs, msecs; gboolean ret; - t = l->data; - l = l->next; + t = context->ltimeout->data; + + context->ltimeout = slist_remove(context->ltimeout, t); - if (timercmp(&tv, &t->expiration, <)) + if (timercmp(&tv, &t->expiration, <)) { + context->processed = slist_append(context->processed, t); continue; + } ret = t->function(t->data); @@ -255,26 +260,27 @@ static void timeout_handlers_check(GMainContext *context) if (!match) continue; - /* Update next pointer if callback changed the list */ - l = match->next; - - if (ret == FALSE) { - context->ltimeout = slist_remove(context->ltimeout, t); + if (!ret) { free(t); - } else { - glong secs, msecs; - /* update the next expiration time */ - secs = t->interval / 1000; - msecs = t->interval - secs * 1000; - - t->expiration.tv_sec = tv.tv_sec + secs; - t->expiration.tv_usec = tv.tv_usec + msecs * 1000; - if (t->expiration.tv_usec >= 1000000) { - t->expiration.tv_usec -= 1000000; - t->expiration.tv_sec++; - } + continue; } + + /* update the next expiration time */ + secs = t->interval / 1000; + msecs = t->interval - secs * 1000; + + t->expiration.tv_sec = tv.tv_sec + secs; + t->expiration.tv_usec = tv.tv_usec + msecs * 1000; + if (t->expiration.tv_usec >= 1000000) { + t->expiration.tv_usec -= 1000000; + t->expiration.tv_sec++; + } + + context->processed = slist_append(context->processed, t); } + + context->ltimeout = context->processed; + context->processed = NULL; } void g_main_loop_run(GMainLoop *loop) @@ -420,5 +426,20 @@ gint g_timeout_remove(const guint id) return 0; } + l = default_context->processed; + + while (l) { + t = l->data; + l = l->next; + + if (t->id != id) + continue; + + default_context->processed = slist_remove(default_context->processed, t); + free(t); + + return 0; + } + return -1; } diff --git a/common/glib-ectomy.h b/common/glib-ectomy.h index f52a9ce2..af6f4fbb 100644 --- a/common/glib-ectomy.h +++ b/common/glib-ectomy.h @@ -48,6 +48,7 @@ typedef struct _GMainContext { guint next_id; glong timeout; struct slist *ltimeout; + struct slist *processed; } GMainContext; typedef struct _GMainLoop { diff --git a/hcid/dbus-security.c b/hcid/dbus-security.c index c9c6763f..5bc8adde 100644 --- a/hcid/dbus-security.c +++ b/hcid/dbus-security.c @@ -40,7 +40,7 @@ #include "hcid.h" #define REQUEST_TIMEOUT (30 * 1000) /* 30 seconds */ -#define AGENT_TIMEOUT (1 * 10 * 1000) /* 3 minutes */ +#define AGENT_TIMEOUT (3 * 60 * 1000) /* 3 minutes */ static struct passkey_agent *default_agent = NULL; @@ -255,10 +255,7 @@ static DBusHandlerResult register_agent(DBusConnection *conn, if (!slist_find(adapter->passkey_agents, &ref, (cmp_func_t)agent_cmp)) name_listener_add(conn, ref.name, (name_cb_t)agent_exited, adapter); - /* Because of bugs in glib-ectonomy.c this doesn't work yet */ -#if 0 agent->timeout = g_timeout_add(AGENT_TIMEOUT, (GSourceFunc)agent_timeout, agent); -#endif adapter->passkey_agents = slist_append(adapter->passkey_agents, agent); |