eccodes/src/grib_dependency.c

163 lines
3.6 KiB
C
Raw Normal View History

2013-03-25 12:04:10 +00:00
/*
2013-04-18 09:23:23 +00:00
* Copyright 2005-2013 ECMWF.
2013-03-25 12:04:10 +00:00
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
/***************************************************************************
* Jean Baptiste Filippi - 01.11.2005
* Enrico Fucile
* *
***************************************************************************/
#include "grib_api_internal.h"
static grib_handle* handle_of(grib_accessor* observed)
{
grib_handle *h = observed->parent->h;
while(h->main) h = h->main;
return h;
}
void grib_dependency_add(grib_accessor* observer,grib_accessor* observed)
{
grib_handle *h = handle_of(observed);
grib_dependency *d = h->dependencies;
grib_dependency *last = 0;
/*
printf("observe %p %p %s %s\n",(void*)observed,(void*)observer, observed?observed->name:"NULL",
observer?observer->name:"NULL");
*/
if(!observer || !observed)
{
return;
}
/* Assert(h == handle_of(observer)); */
/* Check if already in list */
while(d)
{
if(d->observer == observer && d->observed == observed)
return;
last = d;
d = d->next;
}
#if 0
d = h->dependencies;
while(d)
{
last = d;
d = d->next;
}
#endif
d = (grib_dependency*)grib_context_malloc_clear(h->context,sizeof(grib_dependency));
Assert(d);
d->observed = observed;
d->observer = observer;
d->next = 0;
/*
printf("observe %p %p %s %s\n",(void*)observed,(void*)observer, observed->name,observer->name);
*/
#if 0
d->next = h->dependencies;
h->dependencies = d;
#endif
if(last)
last->next = d;
else
h->dependencies = d;
}
void grib_dependency_remove_observed(grib_accessor* observed)
{
grib_handle *h = handle_of(observed);
grib_dependency *d = h->dependencies;
/* printf("%s\n",observed->name); */
while(d)
{
if(d->observed == observed)
{
/* TODO: Notify observer...*/
d->observed = 0;/*
printf("grib_dependency_remove_observed %s\n",observed->name); */
}
d = d->next;
}
}
/* TODO: Notification must go from outer blocks to inner block */
int grib_dependency_notify_change(grib_accessor* observed)
{
grib_handle *h = handle_of(observed);
grib_dependency *d = h->dependencies;
int ret = GRIB_SUCCESS;
/* Do a two pass mark&sweep, in case some depedancies
are added while we notify */
while(d)
{
d->run = (d->observed == observed && d->observer != 0);
d = d->next;
}
d = h->dependencies;
while(d)
{
if(d->run)
{
/*printf("grib_dependency_notify_change %s %s %p\n",observed->name,d->observer ? d->observer->name : "?", (void*)d->observer);*/
if( d->observer && (ret = grib_accessor_notify_change(d->observer,observed))
!= GRIB_SUCCESS) return ret;
}
d = d->next;
}
return ret;
}
void grib_dependency_remove_observer(grib_accessor* observer)
{
grib_handle *h = handle_of(observer);
grib_dependency *d = h->dependencies;
if (!observer) return;
while(d)
{
if(d->observer == observer)
{
d->observer = 0;
}
d = d->next;
}
}
void grib_dependency_observe_expression(grib_accessor* observer,grib_expression* e)
{
grib_expression_add_dependency(e,observer);
}
void grib_dependency_observe_arguments(grib_accessor* observer,grib_arguments* a)
{
while(a)
{
grib_dependency_observe_expression(observer,a->expression);
a = a->next;
}
}