diff options
Diffstat (limited to 'common')
| -rw-r--r-- | common/glib-ectomy.c | 41 | 
1 files changed, 19 insertions, 22 deletions
diff --git a/common/glib-ectomy.c b/common/glib-ectomy.c index 214ee571..f90973ba 100644 --- a/common/glib-ectomy.c +++ b/common/glib-ectomy.c @@ -225,16 +225,7 @@ static void timeout_handlers_prepare(GMainContext *context)  static int timeout_cmp(const void *t1, const void *t2)  { -	const struct timeout *tout1 = t1; -	const struct timeout *tout2 = t2; - -	if (!tout2) -		return -1; - -	if (tout1 != tout2) -		return -1; - -	return tout1->id - tout2->id; +	return t1 - t2;  }  static void timeout_handlers_check(GMainContext *context) @@ -246,24 +237,30 @@ static void timeout_handlers_check(GMainContext *context)  	gettimeofday(&tv, NULL);  	while (l) { +		struct slist *match; +		gboolean ret; +  		t = l->data;  		l = l->next;  		if (timercmp(&tv, &t->expiration, <))  			continue; -		if (t->function(t->data)) { -			struct slist *match; -			/* if false/expired: remove it from the list -			 * Before remove check again in order to cover the situation -			 * when the handler is removed/freed by the callback function -			 */ -			match = slist_find(context->ltimeout, t, timeout_cmp); -			if (match) { -				t = match->data; -				context->ltimeout = slist_remove(context->ltimeout, t); -				free(t); -			} +		ret = t->function(t->data); + +		/* Check if the handler was removed/freed by the callback +		 * function */ +		match = slist_find(context->ltimeout, t, timeout_cmp); + +		if (!match) +			continue; + +		/* Update next pointer if callback changed the list */ +		l = match->next; + +		if (ret == FALSE) { +			context->ltimeout = slist_remove(context->ltimeout, t); +			free(t);  		} else {  			glong secs, msecs;  			/* update the next expiration time */  | 
