Merge of ECC-420-performance. Without the last set of commits (less mallocs)

This commit is contained in:
Shahram Najm 2017-05-31 17:21:18 +01:00
parent 6b3f2b0d98
commit fffcfdbab4
39 changed files with 947 additions and 99 deletions

View File

@ -12,6 +12,11 @@ constant tablesMasterDir="bufr/tables/[masterTableNumber]/wmo/[masterTablesVersi
constant tablesLocalDir="bufr/tables/[masterTableNumber]/local/[localTablesVersionNumber]/[bufrHeaderCentre:l]/[bufrHeaderSubCentre]" : hidden;
constant rootTablesDir="bufr/tables" : hidden;
meta clearTables bufr_clear_tables() = 0 : hidden,no_copy;
when (changed(tablesMasterDir)) { set clearTables=1;}
when (changed(tablesLocalDir)) { set clearTables=1;}
# we should implement some table version dependency
#constant templatesMasterDir="bufr/templates/[masterTableNumber]/[masterTablesVersionNumber]";
#constant templatesLocalDir="bufr/templates/local/[masterTableNumber]/[bufrHeaderCentre:l]/[localTablesVersionNumber]";

View File

@ -51,6 +51,7 @@ list( APPEND grib_api_srcs
grib_bufr_descriptors_array.c
grib_darray.c
grib_sarray.c
grib_oarray.c
grib_vdarray.c
grib_vsarray.c
grib_iarray.c
@ -63,6 +64,7 @@ list( APPEND grib_api_srcs
grib_accessor_class_bitmap.c
grib_accessor_class_bits.c
grib_accessor_class_bits_per_value.c
grib_accessor_class_bufr_clear_tables.c
grib_accessor_class_bufr_data.c
grib_accessor_class_bufr_elements_table.c
grib_accessor_class_bufr_data_array.c
@ -299,6 +301,7 @@ list( APPEND grib_api_srcs
grib_hash_keys.c
grib_io.c
grib_trie.c
grib_trie_with_rank.c
grib_itrie.c
grib_rules.c
grib_keys_iterator.c

View File

@ -52,6 +52,7 @@ libeccodes_la_prototypes= \
grib_bufr_descriptors_array.c \
grib_darray.c \
grib_sarray.c \
grib_oarray.c \
grib_iarray.c \
grib_vdarray.c \
grib_vsarray.c \
@ -64,6 +65,7 @@ libeccodes_la_prototypes= \
grib_accessor_class_bits.c \
grib_accessor_class_bits_per_value.c \
grib_accessor_class_bufr_data.c \
grib_accessor_class_bufr_clear_tables.c \
grib_accessor_class_bufr_data_array.c \
grib_accessor_class_bufr_data_element.c \
grib_accessor_class_bufr_elements_table.c \
@ -314,6 +316,7 @@ libeccodes_la_prototypes= \
grib_hash_keys.c \
grib_io.c \
grib_trie.c \
grib_trie_with_rank.c \
grib_itrie.c \
grib_rules.c \
grib_keys_iterator.c \

View File

@ -170,6 +170,7 @@ typedef struct grib_fieldset codes_fieldset;
typedef struct grib_order_by codes_order_by;
typedef struct grib_where codes_where;
typedef struct grib_sarray codes_sarray;
typedef struct grib_oarray codes_oarray;
typedef struct grib_darray codes_darray;
typedef struct grib_iarray codes_iarray;
typedef struct grib_vdarray codes_vdarray;

View File

@ -463,11 +463,6 @@ static void init_accessor(grib_accessor_class* c,grib_accessor* a, const long le
{
if(c) {
grib_accessor_class *s = c->super ? *(c->super) : NULL;
if(!c->inited)
{
if(c->init_class) c->init_class(c);
c->inited = 1;
}
init_accessor(s,a,len,args);
if(c->init) c->init(a,len, args);
}

View File

@ -12,6 +12,7 @@ extern grib_accessor_class* grib_accessor_class_bits_per_value;
extern grib_accessor_class* grib_accessor_class_blob;
extern grib_accessor_class* grib_accessor_class_box;
extern grib_accessor_class* grib_accessor_class_budgdate;
extern grib_accessor_class* grib_accessor_class_bufr_clear_tables;
extern grib_accessor_class* grib_accessor_class_bufr_data;
extern grib_accessor_class* grib_accessor_class_bufr_data_array;
extern grib_accessor_class* grib_accessor_class_bufr_data_element;

View File

@ -0,0 +1,143 @@
/*
* Copyright 2005-2017 ECMWF.
*
* 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.
*/
/*************************************
* Enrico Fucile
**************************************/
#include "grib_api_internal.h"
/*
This is used by make_class.pl
START_CLASS_DEF
CLASS = accessor
SUPER = grib_accessor_class_gen
IMPLEMENTS = pack_long; get_native_type
END_CLASS_DEF
*/
/* START_CLASS_IMP */
/*
Don't edit anything between START_CLASS_IMP and END_CLASS_IMP
Instead edit values between START_CLASS_DEF and END_CLASS_DEF
or edit "accessor.class" and rerun ./make_class.pl
*/
static int get_native_type(grib_accessor*);
static int pack_long(grib_accessor*, const long* val,size_t *len);
static void init_class(grib_accessor_class*);
typedef struct grib_accessor_bufr_clear_tables {
grib_accessor att;
/* Members defined in gen */
/* Members defined in bufr_clear_tables */
} grib_accessor_bufr_clear_tables;
extern grib_accessor_class* grib_accessor_class_gen;
static grib_accessor_class _grib_accessor_class_bufr_clear_tables = {
&grib_accessor_class_gen, /* super */
"bufr_clear_tables", /* name */
sizeof(grib_accessor_bufr_clear_tables), /* size */
0, /* inited */
&init_class, /* init_class */
0, /* init */
0, /* post_init */
0, /* free mem */
0, /* describes himself */
0, /* get length of section */
0, /* get length of string */
0, /* get number of values */
0, /* get number of bytes */
0, /* get offset to bytes */
&get_native_type, /* get native type */
0, /* get sub_section */
0, /* grib_pack procedures long */
0, /* grib_pack procedures long */
&pack_long, /* grib_pack procedures long */
0, /* grib_unpack procedures long */
0, /* grib_pack procedures double */
0, /* grib_unpack procedures double */
0, /* grib_pack procedures string */
0, /* grib_unpack procedures string */
0, /* grib_pack array procedures string */
0, /* grib_unpack array procedures string */
0, /* grib_pack procedures bytes */
0, /* grib_unpack procedures bytes */
0, /* pack_expression */
0, /* notify_change */
0, /* update_size */
0, /* preferred_size */
0, /* resize */
0, /* nearest_smaller_value */
0, /* next accessor */
0, /* compare vs. another accessor */
0, /* unpack only ith value */
0, /* unpack a subarray */
0, /* clear */
0, /* clone accessor */
};
grib_accessor_class* grib_accessor_class_bufr_clear_tables = &_grib_accessor_class_bufr_clear_tables;
static void init_class(grib_accessor_class* c)
{
c->dump = (*(c->super))->dump;
c->next_offset = (*(c->super))->next_offset;
c->string_length = (*(c->super))->string_length;
c->value_count = (*(c->super))->value_count;
c->byte_count = (*(c->super))->byte_count;
c->byte_offset = (*(c->super))->byte_offset;
c->sub_section = (*(c->super))->sub_section;
c->pack_missing = (*(c->super))->pack_missing;
c->is_missing = (*(c->super))->is_missing;
c->unpack_long = (*(c->super))->unpack_long;
c->pack_double = (*(c->super))->pack_double;
c->unpack_double = (*(c->super))->unpack_double;
c->pack_string = (*(c->super))->pack_string;
c->unpack_string = (*(c->super))->unpack_string;
c->pack_string_array = (*(c->super))->pack_string_array;
c->unpack_string_array = (*(c->super))->unpack_string_array;
c->pack_bytes = (*(c->super))->pack_bytes;
c->unpack_bytes = (*(c->super))->unpack_bytes;
c->pack_expression = (*(c->super))->pack_expression;
c->notify_change = (*(c->super))->notify_change;
c->update_size = (*(c->super))->update_size;
c->preferred_size = (*(c->super))->preferred_size;
c->resize = (*(c->super))->resize;
c->nearest_smaller_value = (*(c->super))->nearest_smaller_value;
c->next = (*(c->super))->next;
c->compare = (*(c->super))->compare;
c->unpack_double_element = (*(c->super))->unpack_double_element;
c->unpack_double_subarray = (*(c->super))->unpack_double_subarray;
c->clear = (*(c->super))->clear;
c->make_clone = (*(c->super))->make_clone;
}
/* END_CLASS_IMP */
static int pack_long(grib_accessor* a, const long* val,size_t *len)
{
grib_handle* h=grib_handle_of_accessor(a);
h->bufr_elements_table=NULL;
return GRIB_SUCCESS;
}
static int get_native_type(grib_accessor* a)
{
return GRIB_TYPE_UNDEFINED;
}

View File

@ -62,8 +62,7 @@
MEMBERS = int nInputShortReplications
MEMBERS = int iInputShortReplications
MEMBERS = grib_iarray* iss_list
MEMBERS = grib_trie* dataAccessorsTrie
MEMBERS = grib_trie* dataAccessorsRank
MEMBERS = grib_trie_with_rank* dataAccessorsTrie
MEMBERS = grib_sarray* tempStrings
MEMBERS = int change_ref_value_operand
MEMBERS = bufr_tableb_override* tableb_override
@ -138,8 +137,7 @@ typedef struct grib_accessor_bufr_data_array {
int nInputShortReplications;
int iInputShortReplications;
grib_iarray* iss_list;
grib_trie* dataAccessorsTrie;
grib_trie* dataAccessorsRank;
grib_trie_with_rank* dataAccessorsTrie;
grib_sarray* tempStrings;
int change_ref_value_operand;
bufr_tableb_override* tableb_override;
@ -338,7 +336,6 @@ static void init(grib_accessor* a,const long v, grib_arguments* params)
self->expanded=0;
self->expandedAccessor=0;
self->dataAccessorsTrie=0;
self->dataAccessorsRank=0;
self->change_ref_value_operand=0; /* 0, 255 or YYY */
self->tableb_override = NULL;
@ -442,7 +439,7 @@ grib_accessors_list* accessor_bufr_data_array_get_dataAccessors(grib_accessor* a
return self->dataAccessors;
}
grib_trie* accessor_bufr_data_array_get_dataAccessorsTrie(grib_accessor* a)
grib_trie_with_rank* accessor_bufr_data_array_get_dataAccessorsTrie(grib_accessor* a)
{
grib_accessor_bufr_data_array *self =(grib_accessor_bufr_data_array*)a;
return self->dataAccessorsTrie;
@ -1899,7 +1896,7 @@ static grib_accessor* accessor_or_attribute_with_same_name(grib_accessor* a,cons
return ok;
}
}
#if 0
static int get_key_rank(grib_trie* accessorsRank,grib_accessor* a)
{
int* r=(int*)grib_trie_get(accessorsRank,a->name);
@ -1912,13 +1909,10 @@ static int get_key_rank(grib_trie* accessorsRank,grib_accessor* a)
}
return *r;
}
static void grib_data_accessors_trie_push(grib_trie* accessorsTrie, grib_accessor* a, int r)
#endif
static int grib_data_accessors_trie_push(grib_trie_with_rank* accessorsTrie, grib_accessor* a)
{
char* name=(char*)grib_context_malloc_clear(a->context, strlen(a->name)+20);
sprintf(name,"#%d#%s", r, a->name);
grib_trie_insert(accessorsTrie, name, a);
grib_context_free(a->context, name);
return grib_trie_with_rank_insert(accessorsTrie, a->name, a);
}
static int create_keys(grib_accessor* a,long onlySubset,long startSubset,long endSubset)
@ -1973,14 +1967,9 @@ static int create_keys(grib_accessor* a,long onlySubset,long startSubset,long en
self->dataAccessors=grib_accessors_list_create(c);
if (self->dataAccessorsTrie) {
grib_trie_delete(self->dataAccessorsTrie);
grib_trie_with_rank_delete(self->dataAccessorsTrie);
}
self->dataAccessorsTrie=grib_trie_new(c);
if (self->dataAccessorsRank) {
grib_trie_delete(self->dataAccessorsRank);
}
self->dataAccessorsRank=grib_trie_new(c);
self->dataAccessorsTrie=grib_trie_with_rank_new(c);
if (self->tempStrings) {
grib_sarray_delete_content(c, self->tempStrings);
@ -2141,9 +2130,8 @@ static int create_keys(grib_accessor* a,long onlySubset,long startSubset,long en
grib_pack_long(asn,&subsetNumber,&len);
grib_push_accessor(asn,section->block);
rank=get_key_rank(self->dataAccessorsRank,asn);
rank=grib_data_accessors_trie_push(self->dataAccessorsTrie,asn);
grib_accessors_list_push(self->dataAccessors,asn,rank);
grib_data_accessors_trie_push(self->dataAccessorsTrie,asn,rank);
}
count++;
elementAccessor=create_accessor_from_descriptor(a,associatedFieldAccessor,section,ide,iss,dump,count);
@ -2158,9 +2146,8 @@ static int create_keys(grib_accessor* a,long onlySubset,long startSubset,long en
newAccessor->parent=groupSection;
newAccessor->name=grib_context_strdup(c,elementFromBitmap->name);
grib_push_accessor(newAccessor,groupSection->block);
rank=get_key_rank(self->dataAccessorsRank,newAccessor);
rank=grib_data_accessors_trie_push(self->dataAccessorsTrie,newAccessor);
grib_accessors_list_push(self->dataAccessors,newAccessor,rank);
grib_data_accessors_trie_push(self->dataAccessorsTrie,newAccessor,rank);
}
err=grib_accessor_add_attribute(accessor_or_attribute_with_same_name(elementFromBitmap,elementAccessor->name),elementAccessor,1);
@ -2186,10 +2173,9 @@ static int create_keys(grib_accessor* a,long onlySubset,long startSubset,long en
break;
default:
grib_push_accessor(elementAccessor,section->block);
rank=get_key_rank(self->dataAccessorsRank,elementAccessor);
rank=grib_data_accessors_trie_push(self->dataAccessorsTrie,elementAccessor);
grib_accessors_list_push(self->dataAccessors,elementAccessor,rank);
lastAccessorInList=grib_accessors_list_last(self->dataAccessors);
grib_data_accessors_trie_push(self->dataAccessorsTrie,elementAccessor,rank);
}
}
}
@ -2749,8 +2735,7 @@ static void destroy(grib_context* c,grib_accessor* a)
grib_accessor_bufr_data_array *self =(grib_accessor_bufr_data_array*)a;
self_clear(c,self);
if (self->dataAccessors) grib_accessors_list_delete(c,self->dataAccessors);
if (self->dataAccessorsTrie) grib_trie_delete_container(self->dataAccessorsTrie);
if (self->dataAccessorsRank) grib_trie_delete(self->dataAccessorsRank);
if (self->dataAccessorsTrie) grib_trie_with_rank_delete_container(self->dataAccessorsTrie);
if (self->tempStrings) {
grib_sarray_delete_content(c, self->tempStrings);
grib_sarray_delete (c, self->tempStrings);

View File

@ -16,7 +16,7 @@
START_CLASS_DEF
CLASS = accessor
SUPER = grib_accessor_class_variable
IMPLEMENTS = init;dump;next
IMPLEMENTS = dump;next
END_CLASS_DEF
*/
@ -32,7 +32,6 @@ or edit "accessor.class" and rerun ./make_class.pl
*/
static void dump(grib_accessor*, grib_dumper*);
static void init(grib_accessor*,const long, grib_arguments* );
static void init_class(grib_accessor_class*);
static grib_accessor* next(grib_accessor*, int);
@ -54,7 +53,7 @@ static grib_accessor_class _grib_accessor_class_bufr_group = {
sizeof(grib_accessor_bufr_group), /* size */
0, /* inited */
&init_class, /* init_class */
&init, /* init */
0, /* init */
0, /* post_init */
0, /* free mem */
&dump, /* describes himself */
@ -131,10 +130,6 @@ static void init_class(grib_accessor_class* c)
/* END_CLASS_IMP */
static void init(grib_accessor* a, const long length , grib_arguments* args )
{
}
static void dump(grib_accessor* a, grib_dumper* dumper)
{
grib_dump_section(dumper,a,a->sub_section->block);

View File

@ -519,33 +519,82 @@ static bufr_descriptors_array* do_expand(grib_accessor* a,bufr_descriptors_array
return expanded;
}
static bufr_descriptors_array* expanded_descriptors_list_get(grib_context* c,const char* key,long* u,size_t size) {
bufr_descriptors_map_list* expandedUnexpandedMapList;
size_t i=0;
int found=0;
if (!c->expanded_descriptors) {
c->expanded_descriptors=(grib_trie*)grib_trie_new(c);
return NULL;
}
expandedUnexpandedMapList=grib_trie_get(c->expanded_descriptors,key);
found=0;
while (expandedUnexpandedMapList) {
if (expandedUnexpandedMapList->unexpanded->n==size) {
found=1;
for (i=0;i<size;i++) {
if (expandedUnexpandedMapList->unexpanded->v[i]->code!=u[i]) {
found=0;
break;
}
}
}
if (found) return expandedUnexpandedMapList->expanded;
expandedUnexpandedMapList=expandedUnexpandedMapList->next;
}
return NULL;
}
static void expanded_descriptor_list_push(grib_context* c,grib_trie* expanded_descriptors,const char* key,bufr_descriptors_array* expanded,bufr_descriptors_array* unexpanded) {
bufr_descriptors_map_list* descriptorsList=NULL;
bufr_descriptors_map_list* next=NULL;
bufr_descriptors_map_list* newdescriptorsList=NULL;
newdescriptorsList=(bufr_descriptors_map_list*)grib_context_malloc_clear(c,sizeof(bufr_descriptors_map_list));
newdescriptorsList->expanded=expanded;
newdescriptorsList->unexpanded=unexpanded;
descriptorsList=grib_trie_get(expanded_descriptors,key);
if (descriptorsList) {
next=descriptorsList;
while(next->next) {
next=next->next;
}
next->next=newdescriptorsList;
} else {
grib_trie_insert(expanded_descriptors,key,newdescriptorsList);
}
}
static int expand(grib_accessor* a)
{
grib_accessor_expanded_descriptors* self = (grib_accessor_expanded_descriptors*)a;
int err=0;
size_t unexpandedSize=0;
/* grib_iarray* unexp=0; */
int i;
long* u=0;
char key[50]={0,};
long centre,masterTablesVersionNumber,localTablesVersionNumber,masterTablesNumber;
change_coding_params ccp;
bufr_descriptors_array* unexpanded=NULL;
bufr_descriptors_array* unexpanded_copy=NULL;
bufr_descriptors_array* expanded=NULL;
grib_context* c=a->context;
grib_handle* h=grib_handle_of_accessor(a);
if (!self->do_expand) {
return err;
}
self->do_expand=0;
if (!self->tablesAccessor) {
self->tablesAccessor=grib_find_accessor(grib_handle_of_accessor(a),self->tablesAccessorName);
Assert(self->tablesAccessor);
}
if (self->rank!=0) {
err=expand(self->expandedAccessor);
self->expanded=((grib_accessor_expanded_descriptors*)self->expandedAccessor)->expanded;
return err;
}
grib_bufr_descriptors_array_delete(self->expanded);
err=grib_get_size(grib_handle_of_accessor(a),self->unexpandedDescriptors,&unexpandedSize);
if (err) return err;
if (unexpandedSize==0) {
@ -557,9 +606,33 @@ static int expand(grib_accessor* a)
err=grib_get_long_array(grib_handle_of_accessor(a),self->unexpandedDescriptors,u,&unexpandedSize);
if (err) return err;
err=grib_get_long(h,"bufrHeaderCentre",&centre);
if (err) return err;
err=grib_get_long(h,"masterTablesVersionNumber",&masterTablesVersionNumber);
if (err) return err;
err=grib_get_long(h,"localTablesVersionNumber",&localTablesVersionNumber);
if (err) return err;
err=grib_get_long(h,"masterTableNumber",&masterTablesNumber);
if (err) return err;
sprintf(key,"%ld_%ld_%ld_%ld_%ld",centre,masterTablesVersionNumber,localTablesVersionNumber,masterTablesNumber,u[0]);
expanded=expanded_descriptors_list_get(c,key,u,unexpandedSize);
if (expanded) {
self->expanded=expanded;
grib_context_free(c,u);
return err;
}
if (!self->tablesAccessor) {
self->tablesAccessor=grib_find_accessor(grib_handle_of_accessor(a),self->tablesAccessorName);
Assert(self->tablesAccessor);
}
unexpanded=grib_bufr_descriptors_array_new(c,unexpandedSize,100);
unexpanded_copy=grib_bufr_descriptors_array_new(c,unexpandedSize,100);
for (i=0;i<unexpandedSize;i++) {
grib_bufr_descriptors_array_push(unexpanded,grib_bufr_descriptor_new(self->tablesAccessor,u[i],&err));
grib_bufr_descriptors_array_push(unexpanded_copy,grib_bufr_descriptor_new(self->tablesAccessor,u[i],&err));
}
grib_context_free(c,u);
@ -571,6 +644,7 @@ static int expand(grib_accessor* a)
ccp.associatedFieldWidth=0;
ccp.newStringWidth=0;
self->expanded=do_expand(a,unexpanded,&ccp,&err);
expanded_descriptor_list_push(c,c->expanded_descriptors,key,self->expanded,unexpanded_copy);
grib_bufr_descriptors_array_delete(unexpanded);
return err;
@ -688,10 +762,10 @@ static int value_count(grib_accessor* a,long* rlen)
static void destroy(grib_context* c,grib_accessor* a)
{
grib_accessor_expanded_descriptors* self = (grib_accessor_expanded_descriptors*)a;
if (self->rank==0 && self->expanded) {
grib_bufr_descriptors_array_delete(self->expanded);
}
/* grib_accessor_expanded_descriptors* self = (grib_accessor_expanded_descriptors*)a; */
/* if (self->rank==0 && self->expanded) { */
/* grib_bufr_descriptors_array_delete(self->expanded); */
/* } */
}
static int get_native_type(grib_accessor* a)

View File

@ -16,7 +16,7 @@
START_CLASS_DEF
SUPER= grib_accessor_class_gen
CLASS = accessor
IMPLEMENTS = init;dump
IMPLEMENTS = dump
END_CLASS_DEF
*/
@ -32,7 +32,6 @@ or edit "accessor.class" and rerun ./make_class.pl
*/
static void dump(grib_accessor*, grib_dumper*);
static void init(grib_accessor*,const long, grib_arguments* );
static void init_class(grib_accessor_class*);
typedef struct grib_accessor_forward {
@ -49,7 +48,7 @@ static grib_accessor_class _grib_accessor_class_forward = {
sizeof(grib_accessor_forward), /* size */
0, /* inited */
&init_class, /* init_class */
&init, /* init */
0, /* init */
0, /* post_init */
0, /* free mem */
&dump, /* describes himself */
@ -127,11 +126,6 @@ static void init_class(grib_accessor_class* c)
/* END_CLASS_IMP */
static void init(grib_accessor* a,const long l, grib_arguments* c)
{
/* a->alias = grib_arguments_get_name(grib_handle_of_accessor(a),c,0); */
}
static void dump(grib_accessor* a, grib_dumper* dumper)
{

View File

@ -16,7 +16,6 @@
CLASS = accessor
SUPER = grib_accessor_class_ascii
IMPLEMENTS = unpack_string;value_count;string_length
IMPLEMENTS = init
END_CLASS_DEF
*/
@ -34,7 +33,6 @@ or edit "accessor.class" and rerun ./make_class.pl
static int unpack_string (grib_accessor*, char*, size_t *len);
static size_t string_length(grib_accessor*);
static int value_count(grib_accessor*,long*);
static void init(grib_accessor*,const long, grib_arguments* );
static void init_class(grib_accessor_class*);
typedef struct grib_accessor_library_version {
@ -52,7 +50,7 @@ static grib_accessor_class _grib_accessor_class_library_version = {
sizeof(grib_accessor_library_version), /* size */
0, /* inited */
&init_class, /* init_class */
&init, /* init */
0, /* init */
0, /* post_init */
0, /* free mem */
0, /* describes himself */
@ -128,10 +126,6 @@ static void init_class(grib_accessor_class* c)
/* END_CLASS_IMP */
static void init(grib_accessor* a,const long l, grib_arguments* c)
{
}
static int unpack_string(grib_accessor* a, char* val, size_t *len)
{
char result[30]={0,};

View File

@ -12,6 +12,7 @@
{ "blob", &grib_accessor_class_blob, },
{ "box", &grib_accessor_class_box, },
{ "budgdate", &grib_accessor_class_budgdate, },
{ "bufr_clear_tables", &grib_accessor_class_bufr_clear_tables, },
{ "bufr_data", &grib_accessor_class_bufr_data, },
{ "bufr_data_array", &grib_accessor_class_bufr_data_array, },
{ "bufr_data_element", &grib_accessor_class_bufr_data_element, },

View File

@ -12,6 +12,7 @@ bits_per_value, &grib_accessor_class_bits_per_value
blob, &grib_accessor_class_blob
box, &grib_accessor_class_box
budgdate, &grib_accessor_class_budgdate
bufr_clear_tables, &grib_accessor_class_bufr_clear_tables
bufr_data, &grib_accessor_class_bufr_data
bufr_data_array, &grib_accessor_class_bufr_data_array
bufr_data_element, &grib_accessor_class_bufr_data_element

View File

@ -217,6 +217,7 @@ typedef struct grib_order_by grib_order_by;
typedef struct grib_where grib_where;
typedef struct grib_sarray grib_sarray;
typedef struct grib_oarray grib_oarray;
typedef struct grib_darray grib_darray;
typedef struct grib_iarray grib_iarray;
typedef struct grib_vdarray grib_vdarray;
@ -224,6 +225,7 @@ typedef struct grib_vsarray grib_vsarray;
typedef struct grib_viarray grib_viarray;
typedef struct bufr_descriptor bufr_descriptor;
typedef struct bufr_descriptors_array bufr_descriptors_array;
typedef struct bufr_descriptors_map_list bufr_descriptors_map_list;
grib_fieldset *grib_fieldset_new_from_files(grib_context *c, char *filenames[], int nfiles, char **keys, int nkeys, const char *where_string, const char *order_by_string, int *err);
void grib_fieldset_delete(grib_fieldset* set);

View File

@ -713,6 +713,8 @@ struct grib_block_of_accessors
typedef struct grib_trie grib_trie;
typedef struct grib_trie_with_rank_list grib_trie_with_rank_list;
typedef struct grib_trie_with_rank grib_trie_with_rank;
typedef struct grib_itrie grib_itrie;
@ -724,6 +726,14 @@ struct grib_sarray {
grib_context* context;
} ;
struct grib_oarray {
void** v;
size_t size;
size_t n;
size_t incsize;
grib_context* context;
} ;
struct grib_darray {
double* v;
size_t size;
@ -803,6 +813,12 @@ struct bufr_descriptors_array {
grib_context* context;
} ;
struct bufr_descriptors_map_list {
bufr_descriptors_array* unexpanded;
bufr_descriptors_array* expanded;
bufr_descriptors_map_list* next;
};
/* BUFR: operator 203: Table B changed reference values */
typedef struct bufr_tableb_override bufr_tableb_override;
struct bufr_tableb_override {
@ -857,6 +873,7 @@ struct grib_handle
long missingValueLong;
double missingValueDouble;
ProductKind product_kind;
grib_trie* bufr_elements_table;
};
struct grib_multi_handle {
@ -1050,6 +1067,7 @@ struct grib_context
FILE* log_stream;
grib_trie* classes;
grib_trie* lists;
grib_trie* expanded_descriptors;
#if GRIB_PTHREADS
pthread_mutex_t mutex;
#elif GRIB_OMP_THREADS

View File

@ -214,6 +214,16 @@ void grib_sarray_delete_content(grib_context *c, grib_sarray *v);
char **grib_sarray_get_array(grib_context *c, grib_sarray *v);
size_t grib_sarray_used_size(grib_sarray *v);
/* grib_oarray.c */
grib_oarray *grib_oarray_new(grib_context *c, size_t size, size_t incsize);
grib_oarray *grib_oarray_resize(grib_context *c, grib_oarray *v);
grib_oarray *grib_oarray_push(grib_context *c, grib_oarray *v, void *val);
void grib_oarray_delete(grib_context *c, grib_oarray *v);
void grib_oarray_delete_content(grib_context *c, grib_oarray *v);
void** grib_oarray_get_array(grib_context *c, grib_oarray *v);
size_t grib_oarray_used_size(grib_oarray *v);
void* grib_oarray_get(grib_oarray* v,int i);
/* grib_iarray.c */
grib_iarray *grib_iarray_new_from_array(grib_context *c, long *a, size_t size);
grib_iarray *grib_iarray_new(grib_context *c, size_t size, size_t incsize);
@ -280,7 +290,7 @@ int accessor_bufr_data_array_create_keys(grib_accessor *a, long onlySubset, long
int accessor_bufr_data_array_process_elements(grib_accessor *a, int flag, long onlySubset, long startSubset, long endSubset);
grib_vsarray *accessor_bufr_data_array_get_stringValues(grib_accessor *a);
grib_accessors_list *accessor_bufr_data_array_get_dataAccessors(grib_accessor *a);
grib_trie *accessor_bufr_data_array_get_dataAccessorsTrie(grib_accessor *a);
grib_trie_with_rank *accessor_bufr_data_array_get_dataAccessorsTrie(grib_accessor *a);
void accessor_bufr_data_array_set_unpackMode(grib_accessor *a, int unpackMode);
/* grib_accessor_class_bufr_data_element.c */
@ -1118,6 +1128,15 @@ void *grib_trie_insert(grib_trie *t, const char *key, void *data);
void *grib_trie_insert_no_replace(grib_trie *t, const char *key, void *data);
void *grib_trie_get(grib_trie *t, const char *key);
/* grib_trie_with_rank.c */
grib_trie_with_rank *grib_trie_with_rank_new(grib_context *c);
void grib_trie_with_rank_delete_container(grib_trie_with_rank *t);
void grib_trie_with_rank_delete(grib_trie_with_rank *t);
void grib_trie_with_rank_clear(grib_trie_with_rank *t);
int grib_trie_with_rank_insert(grib_trie_with_rank *t, const char *key, void *data);
void *grib_trie_with_rank_get(grib_trie_with_rank *t, const char *key,int rank);
void *grib_trie_with_rank_get_from_list(grib_trie_with_rank_list* list,int rank);
/* grib_itrie.c */
grib_itrie *grib_itrie_new(grib_context *c, int *count);
void grib_itrie_delete(grib_itrie *t);

View File

@ -97,22 +97,26 @@ static void grib_grow_buffer_to(const grib_context *c, grib_buffer *b, size_t ns
void grib_grow_buffer(const grib_context *c, grib_buffer *b, size_t new_size)
{
size_t len = ((new_size + 1023)/1024)*1024;
grib_grow_buffer_to(c,b,len);
if (new_size > b->length) {
size_t len = 0;
size_t inc= b->length > 2048 ? b->length : 2048;
len = ((new_size + 2*inc)/1024) * 1024;
grib_grow_buffer_to(c,b,len);
}
}
void grib_buffer_set_ulength_bits(const grib_context *c, grib_buffer *b, size_t length_bits)
{
size_t length=length_bits/8;
if (length_bits%8) length++;
grib_grow_buffer_to(c,b,length);
grib_grow_buffer(c,b,length);
b->ulength_bits = length_bits;
b->ulength = length;
}
void grib_buffer_set_ulength(const grib_context *c, grib_buffer *b, size_t length)
{
grib_grow_buffer_to(c,b,length);
grib_grow_buffer(c,b,length);
b->ulength = length;
b->ulength_bits = length*8;
}

View File

@ -362,7 +362,8 @@ static grib_context default_grib_context = {
0, /* bufr_set_to_missing_if_out_of_range */
0, /* log_stream */
0, /* classes */
0 /* lists */
0, /* lists */
0 /* expanded_descriptors */
#if GRIB_PTHREADS
,PTHREAD_MUTEX_INITIALIZER /* mutex */
#endif

View File

@ -15,7 +15,6 @@
START_CLASS_DEF
CLASS = expression
IMPLEMENTS = init_class
IMPLEMENTS = destroy
IMPLEMENTS = native_type
IMPLEMENTS = get_name

View File

@ -15,7 +15,6 @@
START_CLASS_DEF
CLASS = expression
IMPLEMENTS = init_class
IMPLEMENTS = destroy
IMPLEMENTS = native_type
IMPLEMENTS = evaluate_long

View File

@ -20,7 +20,6 @@
START_CLASS_DEF
CLASS = expression
IMPLEMENTS = init_class
IMPLEMENTS = destroy
IMPLEMENTS = native_type
IMPLEMENTS = get_name

View File

@ -20,7 +20,6 @@
START_CLASS_DEF
CLASS = expression
IMPLEMENTS = init_class
IMPLEMENTS = destroy
IMPLEMENTS = native_type
IMPLEMENTS = evaluate;print

View File

@ -15,7 +15,6 @@
START_CLASS_DEF
CLASS = expression
IMPLEMENTS = init_class
IMPLEMENTS = destroy
IMPLEMENTS = native_type
IMPLEMENTS = evaluate_long

View File

@ -15,7 +15,6 @@
START_CLASS_DEF
CLASS = expression
IMPLEMENTS = init_class
IMPLEMENTS = destroy
IMPLEMENTS = native_type
IMPLEMENTS = evaluate_long

View File

@ -15,7 +15,6 @@
START_CLASS_DEF
CLASS = expression
IMPLEMENTS = init_class
IMPLEMENTS = native_type
IMPLEMENTS = add_dependency
IMPLEMENTS = get_name

View File

@ -15,7 +15,6 @@
START_CLASS_DEF
CLASS = expression
IMPLEMENTS = init_class
IMPLEMENTS = destroy
IMPLEMENTS = native_type
IMPLEMENTS = get_name

View File

@ -15,7 +15,6 @@
START_CLASS_DEF
CLASS = expression
IMPLEMENTS = init_class
IMPLEMENTS = destroy
IMPLEMENTS = native_type
IMPLEMENTS = get_name

View File

@ -15,7 +15,6 @@
START_CLASS_DEF
CLASS = expression
IMPLEMENTS = init_class
IMPLEMENTS = destroy
IMPLEMENTS = native_type
IMPLEMENTS = get_name

View File

@ -15,7 +15,6 @@
START_CLASS_DEF
CLASS = expression
IMPLEMENTS = init_class
IMPLEMENTS = native_type;pack_missing
IMPLEMENTS = destroy
IMPLEMENTS = evaluate_long

View File

@ -15,7 +15,6 @@
START_CLASS_DEF
CLASS = expression
IMPLEMENTS = init_class
IMPLEMENTS = native_type
IMPLEMENTS = destroy
IMPLEMENTS = evaluate_string

View File

@ -15,7 +15,6 @@
START_CLASS_DEF
CLASS = expression
IMPLEMENTS = init_class
IMPLEMENTS = destroy
IMPLEMENTS = native_type
IMPLEMENTS = evaluate_long

View File

@ -15,7 +15,6 @@
START_CLASS_DEF
CLASS = expression
IMPLEMENTS = init_class
IMPLEMENTS = native_type
IMPLEMENTS = destroy
IMPLEMENTS = evaluate_string

View File

@ -15,7 +15,6 @@
START_CLASS_DEF
CLASS = expression
IMPLEMENTS = init_class
IMPLEMENTS = destroy
IMPLEMENTS = native_type
IMPLEMENTS = evaluate_long

View File

@ -15,7 +15,6 @@
START_CLASS_DEF
CLASS = expression
IMPLEMENTS = init_class
IMPLEMENTS = destroy
IMPLEMENTS = native_type
IMPLEMENTS = evaluate_long

108
src/grib_oarray.c Normal file
View File

@ -0,0 +1,108 @@
/*
* Copyright 2005-2017 ECMWF.
*
* 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.
*/
/***************************************************************************
*
* Enrico Fucile
*
***************************************************************************/
#include "grib_api_internal.h"
grib_oarray* grib_oarray_new(grib_context* c,size_t size,size_t incsize)
{
grib_oarray* v=NULL;
if (!c) c=grib_context_get_default();
v=(grib_oarray*)grib_context_malloc_clear(c,sizeof(grib_oarray));
if (!v) {
grib_context_log(c,GRIB_LOG_ERROR,
"grib_oarray_new unable to allocate %d bytes\n",sizeof(grib_oarray));
return NULL;
}
v->size=size;
v->n=0;
v->incsize=incsize;
v->v=(void**)grib_context_malloc_clear(c,sizeof(char*)*size);
if (!v->v) {
grib_context_log(c,GRIB_LOG_ERROR,
"grib_oarray_new unable to allocate %d bytes\n",sizeof(char*)*size);
return NULL;
}
return v;
}
grib_oarray* grib_oarray_resize(grib_context* c,grib_oarray* v)
{
int newsize=v->incsize+v->size;
if (!c) c=grib_context_get_default();
v->v=(void**)grib_context_realloc(c,v->v,newsize*sizeof(char*));
v->size=newsize;
if (!v->v) {
grib_context_log(c,GRIB_LOG_ERROR,
"grib_oarray_resize unable to allocate %d bytes\n",sizeof(char*)*newsize);
return NULL;
}
return v;
}
grib_oarray* grib_oarray_push(grib_context* c,grib_oarray* v,void* val)
{
size_t start_size=100;
size_t start_incsize=100;
if (!v) v=grib_oarray_new(c,start_size,start_incsize);
if (v->n >= v->size) v=grib_oarray_resize(c,v);
v->v[v->n]=val;
v->n++;
return v;
}
void grib_oarray_delete(grib_context* c,grib_oarray* v)
{
if (!v) return;
if (!c) grib_context_get_default();
if (v->v) grib_context_free(c,v->v);
grib_context_free(c,v);
}
void grib_oarray_delete_content(grib_context* c,grib_oarray* v)
{
int i;
if (!v | !v->v) return;
if (!c) grib_context_get_default();
for (i=0;i<v->n;i++) {
if (v->v[i]) grib_context_free(c,v->v[i]);
v->v[i]=0;
}
v->n=0;
}
void** grib_oarray_get_array(grib_context* c,grib_oarray* v)
{
void** ret;
int i;
if (!v) return NULL;
ret=(void**)grib_context_malloc_clear(c,sizeof(char*)*v->n);
for (i=0;i<v->n;i++) ret[i]=v->v[i];
return ret;
}
void* grib_oarray_get(grib_oarray* v,int i)
{
if (v==NULL || i>v->n-1) return NULL;
return v->v[i];
}
size_t grib_oarray_used_size(grib_oarray* v)
{
return v->n;
}

View File

@ -200,11 +200,11 @@ static char* get_condition(const char* name,codes_condition* condition)
return str;
}
static grib_accessor* _search_by_rank(grib_accessor* a,const char* name) {
static grib_accessor* _search_by_rank(grib_accessor* a,const char* name,int rank) {
grib_accessor* ret=NULL;
grib_trie* t=accessor_bufr_data_array_get_dataAccessorsTrie(a);
grib_trie_with_rank* t=accessor_bufr_data_array_get_dataAccessorsTrie(a);
ret=(grib_accessor*)grib_trie_get(t,name);
ret=(grib_accessor*)grib_trie_with_rank_get(t,name,rank);
return ret;
}
@ -225,11 +225,11 @@ static grib_accessor* _search_by_rank(grib_accessor* a,const char* name,long ran
}
*/
static grib_accessor* search_by_rank(grib_handle* h, const char* name,const char *the_namespace)
static grib_accessor* search_by_rank(grib_handle* h, const char* name,int rank,const char *the_namespace)
{
grib_accessor* data=search_and_cache(h,"dataAccessors",the_namespace);
if (data) {
return _search_by_rank(data,name);
return _search_by_rank(data,name,rank);
} else {
grib_accessor* ret=NULL;
int rank;
@ -390,7 +390,9 @@ static grib_accessor* search_and_cache(grib_handle* h, const char* name,const ch
grib_accessor* a=NULL;
if (name[0]=='#') {
a=search_by_rank(h,name,the_namespace);
int rank=-1;
char* basename=get_rank(name,&rank);
a=search_by_rank(h,basename,rank,the_namespace);
} else {
a=_search_and_cache(h,name,the_namespace);
}

515
src/grib_trie_with_rank.c Normal file
View File

@ -0,0 +1,515 @@
/*
* Copyright 2005-2017 ECMWF.
*
* 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.
*/
#include "grib_api_internal.h"
/* Note: all non-alpha are mapped to 0 */
static int mapping[] = {
0, /* 00 */
0, /* 01 */
0, /* 02 */
0, /* 03 */
0, /* 04 */
0, /* 05 */
0, /* 06 */
0, /* 07 */
0, /* 08 */
0, /* 09 */
0, /* 0a */
0, /* 0b */
0, /* 0c */
0, /* 0d */
0, /* 0e */
0, /* 0f */
0, /* 10 */
0, /* 11 */
0, /* 12 */
0, /* 13 */
0, /* 14 */
0, /* 15 */
0, /* 16 */
0, /* 17 */
0, /* 18 */
0, /* 19 */
0, /* 1a */
0, /* 1b */
0, /* 1c */
0, /* 1d */
0, /* 1e */
0, /* 1f */
0, /* 20 */
0, /* 21 */
0, /* 22 */
38, /* # */
0, /* 24 */
0, /* 25 */
0, /* 26 */
0, /* 27 */
0, /* 28 */
0, /* 29 */
0, /* 2a */
0, /* 2b */
0, /* 2c */
0, /* 2d */
0, /* 2e */
0, /* 2f */
1, /* 0 */
2, /* 1 */
3, /* 2 */
4, /* 3 */
5, /* 4 */
6, /* 5 */
7, /* 6 */
8, /* 7 */
9, /* 8 */
10, /* 9 */
0, /* 3a */
0, /* 3b */
0, /* 3c */
0, /* 3d */
0, /* 3e */
0, /* 3f */
0, /* 40 */
11, /* A */
12, /* B */
13, /* C */
14, /* D */
15, /* E */
16, /* F */
17, /* G */
18, /* H */
19, /* I */
20, /* J */
21, /* K */
22, /* L */
23, /* M */
24, /* N */
25, /* O */
26, /* P */
27, /* Q */
28, /* R */
29, /* S */
30, /* T */
31, /* U */
32, /* V */
33, /* W */
34, /* X */
35, /* Y */
36, /* Z */
0, /* 5b */
0, /* 5c */
0, /* 5d */
0, /* 5e */
37, /* _ */
0, /* 60 */
11, /* a */
12, /* b */
13, /* c */
14, /* d */
15, /* e */
16, /* f */
17, /* g */
18, /* h */
19, /* i */
20, /* j */
21, /* k */
22, /* l */
23, /* m */
24, /* n */
25, /* o */
26, /* p */
27, /* q */
28, /* r */
29, /* s */
30, /* t */
31, /* u */
32, /* v */
33, /* w */
34, /* x */
35, /* y */
36, /* z */
0, /* 7b */
0, /* 7c */
0, /* 7d */
0, /* 7e */
0, /* 7f */
0, /* 80 */
0, /* 81 */
0, /* 82 */
0, /* 83 */
0, /* 84 */
0, /* 85 */
0, /* 86 */
0, /* 87 */
0, /* 88 */
0, /* 89 */
0, /* 8a */
0, /* 8b */
0, /* 8c */
0, /* 8d */
0, /* 8e */
0, /* 8f */
0, /* 90 */
0, /* 91 */
0, /* 92 */
0, /* 93 */
0, /* 94 */
0, /* 95 */
0, /* 96 */
0, /* 97 */
0, /* 98 */
0, /* 99 */
0, /* 9a */
0, /* 9b */
0, /* 9c */
0, /* 9d */
0, /* 9e */
0, /* 9f */
0, /* a0 */
0, /* a1 */
0, /* a2 */
0, /* a3 */
0, /* a4 */
0, /* a5 */
0, /* a6 */
0, /* a7 */
0, /* a8 */
0, /* a9 */
0, /* aa */
0, /* ab */
0, /* ac */
0, /* ad */
0, /* ae */
0, /* af */
0, /* b0 */
0, /* b1 */
0, /* b2 */
0, /* b3 */
0, /* b4 */
0, /* b5 */
0, /* b6 */
0, /* b7 */
0, /* b8 */
0, /* b9 */
0, /* ba */
0, /* bb */
0, /* bc */
0, /* bd */
0, /* be */
0, /* bf */
0, /* c0 */
0, /* c1 */
0, /* c2 */
0, /* c3 */
0, /* c4 */
0, /* c5 */
0, /* c6 */
0, /* c7 */
0, /* c8 */
0, /* c9 */
0, /* ca */
0, /* cb */
0, /* cc */
0, /* cd */
0, /* ce */
0, /* cf */
0, /* d0 */
0, /* d1 */
0, /* d2 */
0, /* d3 */
0, /* d4 */
0, /* d5 */
0, /* d6 */
0, /* d7 */
0, /* d8 */
0, /* d9 */
0, /* da */
0, /* db */
0, /* dc */
0, /* dd */
0, /* de */
0, /* df */
0, /* e0 */
0, /* e1 */
0, /* e2 */
0, /* e3 */
0, /* e4 */
0, /* e5 */
0, /* e6 */
0, /* e7 */
0, /* e8 */
0, /* e9 */
0, /* ea */
0, /* eb */
0, /* ec */
0, /* ed */
0, /* ee */
0, /* ef */
0, /* f0 */
0, /* f1 */
0, /* f2 */
0, /* f3 */
0, /* f4 */
0, /* f5 */
0, /* f6 */
0, /* f7 */
0, /* f8 */
0, /* f9 */
0, /* fa */
0, /* fb */
0, /* fc */
0, /* fd */
0, /* fe */
0, /* ff */
};
/* ECC-388 */
#ifdef DEBUG
static const size_t NUM_MAPPINGS = sizeof(mapping)/sizeof(mapping[0]);
#define DebugCheckBounds(index, value) \
do { \
if (!((index) >= 0 && (index) < NUM_MAPPINGS) ) {printf("ERROR: string='%s' index=%ld @ %s +%d \n", value, (long)index, __FILE__, __LINE__); abort();} \
} while(0)
#else
#define DebugCheckBounds(index, value)
#endif
#define SIZE 39
#if GRIB_PTHREADS
static pthread_once_t once = PTHREAD_ONCE_INIT;
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static void init() {
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&mutex,&attr);
pthread_mutexattr_destroy(&attr);
}
#elif GRIB_OMP_THREADS
static int once = 0;
static omp_nest_lock_t mutex;
static void init()
{
GRIB_OMP_CRITICAL(lock_grib_trie_with_rank_c)
{
if (once == 0)
{
omp_init_nest_lock(&mutex);
once = 1;
}
}
}
#endif
/*
struct grib_trie_with_rank_list {
grib_trie_with_rank_list* next;
int rank;
void* data;
};
*/
struct grib_trie_with_rank {
grib_trie_with_rank* next[SIZE];
grib_context *context;
int first;
int last;
grib_oarray* objs;
};
grib_trie_with_rank *grib_trie_with_rank_new(grib_context* c)
{
#ifdef RECYCLE_TRIE
grib_trie_with_rank* t = grib_context_malloc_clear_persistent(c,sizeof(grib_trie_with_rank));
#else
grib_trie_with_rank* t = (grib_trie_with_rank*)grib_context_malloc_clear(c,sizeof(grib_trie_with_rank));
#endif
t->context = c;
t->first=SIZE;
t->last=-1;
return t;
}
/*
static void grib_trie_with_rank_delete_container_list(grib_context* c,grib_trie_with_rank_list *list) {
grib_trie_with_rank_list* next=list;
grib_trie_with_rank_list* p;
while (next) {
p=next;
next=next->next;
grib_context_free( c, p );
}
}
*/
void grib_trie_with_rank_delete_container(grib_trie_with_rank *t)
{
GRIB_MUTEX_INIT_ONCE(&once,&init);
GRIB_MUTEX_LOCK(&mutex);
if(t) {
int i;
for(i = t->first; i <= t->last; i++)
if (t->next[i]) {
grib_trie_with_rank_delete_container(t->next[i]);
}
grib_oarray_delete(t->context,t->objs);
/* grib_trie_with_rank_delete_container_list(t->context,t->list); */
#ifdef RECYCLE_TRIE
grib_context_free_persistent(t->context,t);
#else
grib_context_free(t->context,t);
#endif
}
GRIB_MUTEX_UNLOCK(&mutex);
}
/*
static void grib_trie_with_rank_delete_list(grib_context* c,grib_trie_with_rank_list *list) {
grib_trie_with_rank_list* next=list;
grib_trie_with_rank_list* p;
while (next) {
grib_context_free( c, next->data );
p=next;
next=next->next;
grib_context_free( c, p );
}
}
*/
void grib_trie_with_rank_delete(grib_trie_with_rank *t)
{
GRIB_MUTEX_INIT_ONCE(&once,&init);
GRIB_MUTEX_LOCK(&mutex);
if(t) {
int i;
for(i = t->first; i <= t->last; i++)
if (t->next[i]) {
if (t->objs) {
grib_oarray_delete_content(t->context,t->objs);
grib_oarray_delete(t->context,t->objs);
}
/* grib_trie_with_rank_delete_list(t->context, t->next[i]->list ); */
grib_trie_with_rank_delete(t->next[i]);
}
#ifdef RECYCLE_TRIE
grib_context_free_persistent(t->context,t);
#else
grib_context_free(t->context,t);
#endif
}
GRIB_MUTEX_UNLOCK(&mutex);
}
void grib_trie_with_rank_clear(grib_trie_with_rank *t)
{
if(t) {
int i;
if (t->objs) {
grib_oarray_delete_content(t->context,t->objs);
grib_oarray_delete(t->context,t->objs);
}
for(i = t->first; i <= t->last; i++)
if (t->next[i])
grib_trie_with_rank_clear(t->next[i]);
}
}
/*
static void grib_trie_with_rank_insert_in_list(grib_trie_with_rank* t,void* data) {
if (t->list==NULL) {
t->list=grib_context_malloc_clear(t->context,sizeof(grib_trie_with_rank_list));
t->list->data=data;
t->list->rank=1;
t->last_list=t->list;
} else {
t->last_list->next=grib_context_malloc_clear(t->context,sizeof(grib_trie_with_rank_list));
t->last_list=t->last_list->next;
t->last_list->data=data;
t->last_list->rank++;
}
}
*/
int grib_trie_with_rank_insert(grib_trie_with_rank* t,const char* key,void* data)
{
grib_trie_with_rank *last = t;
const char *k = key;
GRIB_MUTEX_INIT_ONCE(&once,&init);
GRIB_MUTEX_LOCK(&mutex);
while(*k && t) {
last = t;
DebugCheckBounds((int)*k, key);
t = t->next[mapping[(int)*k]];
if(t) k++;
}
if(*k != 0) {
t = last;
while(*k) {
int j = 0;
DebugCheckBounds((int)*k, key);
j = mapping[(int)*k++];
if(j < t->first) t->first = j;
if(j > t->last) t->last = j;
t = t->next[j] =grib_trie_with_rank_new(t->context);
}
}
if (t->objs==NULL) t->objs=grib_oarray_new(t->context,100,1000);
grib_oarray_push(t->context,t->objs,data);
/* grib_trie_with_rank_insert_in_list(t,data); */
GRIB_MUTEX_UNLOCK(&mutex);
return grib_oarray_used_size(t->objs);
}
/*
void *grib_trie_with_rank_get_from_list(grib_trie_with_rank_list* list,int rank) {
grib_trie_with_rank_list* next=list;
int r=1;
while(next) {
if (r==rank) return next->data;
next=next->next;
r++;
}
return NULL;
}
*/
void *grib_trie_with_rank_get(grib_trie_with_rank* t,const char* key,int rank)
{
const char *k = key;
void* data;
GRIB_MUTEX_INIT_ONCE(&once,&init);
if (rank<0) return NULL;
GRIB_MUTEX_LOCK(&mutex);
while(*k && t) {
DebugCheckBounds((int)*k, key);
t = t->next[mapping[(int)*k++]];
}
if(*k == 0 && t != NULL ) {
data=grib_oarray_get(t->objs,rank-1);
GRIB_MUTEX_UNLOCK(&mutex);
return data;
}
GRIB_MUTEX_UNLOCK(&mutex);
return NULL;
}

View File

@ -116,24 +116,24 @@ grib_runtime_options global_options={
static grib_handle* grib_handle_new_from_file_x(grib_context* c,FILE* f,int mode,int headers_only,int *err)
{
if (mode==MODE_GRIB)
return grib_new_from_file(c,f,headers_only,err);
if (mode==MODE_BUFR)
return bufr_new_from_file(c,f,err);
if (mode==MODE_ANY)
return any_new_from_file(c,f,err);
if (mode==MODE_GTS)
return gts_new_from_file(c,f,err);
if (mode==MODE_BUFR)
return bufr_new_from_file(c,f,err);
if (mode==MODE_METAR)
return metar_new_from_file(c,f,err);
if (mode==MODE_TAF)
return taf_new_from_file(c,f,err);
if (mode==MODE_GRIB)
return grib_new_from_file(c,f,headers_only,err);
Assert(!"grib_handle_new_from_file_x: unknown mode");
return NULL;
}