/*
* ion/libmainloop/defer.c
*
- * Copyright (c) Tuomo Valkonen 1999-2006.
+ * Copyright (c) Tuomo Valkonen 1999-2009.
*
- * Ion is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
+ * See the included file LICENSE for details.
*/
/* This file contains routines for deferred execution of potentially
#include <libtu/dlist.h>
#include <libtu/output.h>
#include <libtu/locale.h>
+#include <libtu/debug.h>
#include "defer.h"
free_defer(d);
- warn(TR("Object destroyed while deferred actions are still pending."));
+ D(warn(TR("Object destroyed while deferred actions are still pending.")));
}
+
+static bool already_deferred(Obj *obj, WDeferredAction *action,
+ WDeferred *list)
+{
+ WDeferred *d;
+ for(d=list; d!=NULL; d=d->next){
+ if(d->action==action && d->watch.obj==obj)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
bool mainloop_defer_action_on_list(Obj *obj, WDeferredAction *action,
WDeferred **list)
{
WDeferred *d;
+ if(already_deferred(obj, action, *list))
+ return TRUE;
+
d=alloc_defer();
if(d==NULL){
d->action=action;
d->list=list;
d->fn=extl_fn_none();
-
+ watch_init(&(d->watch));
+
if(obj!=NULL)
watch_setup(&(d->watch), obj, defer_watch_handler);
d->action=NULL;
d->list=list;
d->fn=extl_ref_fn(fn);
-
watch_init(&(d->watch));
LINK_ITEM(*list, d, next, prev);
free_defer(d);
if(a!=NULL){
- if(obj!=NULL)
- a(obj);
+ /* The deferral should not be on the list, if there
+ * was an object, and it got destroyed.
+ */
+ /*if(obj!=NULL)*/
+ a(obj);
}else if(fn!=extl_fn_none()){
extl_call(fn, NULL, NULL);
extl_unref_fn(fn);