X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fping.c;h=7cb47669988f036fbfcdfdaa26171ff582e0e415;hb=HEAD;hp=42487ab099b3dc44565db6458e878a59e1bbd8a9;hpb=5f04ca85ef6a2ebc2d66842e261a676691e9b4de;p=chaz%2Fopenbox diff --git a/openbox/ping.c b/openbox/ping.c index 42487ab0..7cb47669 100644 --- a/openbox/ping.c +++ b/openbox/ping.c @@ -22,7 +22,6 @@ #include "event.h" #include "debug.h" #include "openbox.h" -#include "obt/mainloop.h" #include "obt/prop.h" typedef struct _ObPingTarget @@ -30,15 +29,16 @@ typedef struct _ObPingTarget ObClient *client; ObPingEventHandler h; guint32 id; + guint loopid; gint waiting; } ObPingTarget; static GHashTable *ping_ids = NULL; static guint32 ping_next_id = 1; -#define PING_TIMEOUT (G_USEC_PER_SEC * 3) +#define PING_TIMEOUT 3000 /* in MS */ /*! Warn the user after this many PING_TIMEOUT intervals */ -#define PING_TIMEOUT_WARN 3 +#define PING_TIMEOUT_WARN 2 static void ping_send(ObPingTarget *t); static void ping_end(ObClient *client, gpointer data); @@ -69,17 +69,18 @@ void ping_start(struct _ObClient *client, ObPingEventHandler h) { ObPingTarget *t; - /* make sure we're not already pinging the client */ - g_assert(g_hash_table_find(ping_ids, find_client, client) == NULL); - + /* make sure the client supports ping! */ g_assert(client->ping == TRUE); - t = g_new0(ObPingTarget, 1); + /* make sure we're not already pinging the client */ + if (g_hash_table_find(ping_ids, find_client, client) != NULL) return; + + t = g_slice_new0(ObPingTarget); t->client = client; t->h = h; - obt_main_loop_timeout_add(ob_main_loop, PING_TIMEOUT, ping_timeout, - t, g_direct_equal, NULL); + t->loopid = g_timeout_add_full(G_PRIORITY_DEFAULT, PING_TIMEOUT, + ping_timeout, t, NULL); /* act like we just timed out immediately, to start the pinging process now instead of after the first delay. this makes sure the client ends up in the ping_ids hash table now. */ @@ -89,11 +90,6 @@ void ping_start(struct _ObClient *client, ObPingEventHandler h) g_assert(g_hash_table_find(ping_ids, find_client, client) != NULL); } -void ping_stop(struct _ObClient *c) -{ - ping_end(c, NULL); -} - void ping_got_pong(guint32 id) { ObPingTarget *t; @@ -106,6 +102,9 @@ void ping_got_pong(guint32 id) t->h(t->client, FALSE); } t->waiting = 0; /* not waiting for a reply anymore */ + + /* we got a pong so we're happy now */ + ping_end(t->client, NULL); } else ob_debug("Got PONG with id %u but not waiting for one", id); @@ -159,9 +158,8 @@ static void ping_end(ObClient *client, gpointer data) if ((t = g_hash_table_find(ping_ids, find_client, client))) { g_hash_table_remove(ping_ids, &t->id); - obt_main_loop_timeout_remove_data(ob_main_loop, ping_timeout, - t, FALSE); + g_source_remove(t->loopid); - g_free(t); + g_slice_free(ObPingTarget, t); } }