eccodes/tests.ecmwf/memory.c

224 lines
3.8 KiB
C

#include "test.h"
char buffer[1024*1024*10];
double values[1024*1024*10];
long cnt = 0;
long ff = 0;
long m = 0;
void* foo[1000000] = {0,};
static void default_free(const grib_context* c, void* p) {
#if 0
int i, found = 0;
for(i = 0; i < m; i++)
if(foo[i] == p)
{
foo[i] = 0;
found = 1;
}
if(!found) marslog(LOG_EXIT,"Wrong free called %p",p);
#endif
ff++;
cnt--;
free(p);
}
static void* default_malloc(const grib_context* c, size_t size) {
cnt++;
#if 0
if(m == NUMBER(foo)) marslog(LOG_EXIT,"Too many malloc");
return foo[m++] = malloc(size);
#else
return malloc(size);
#endif
}
int main(int argc,char** argv)
{
long length = 0;
FILE *f;
grib_handle *g = 0;
int e;
grib_iterator* i;
double lat,lon,val;
int n;
size_t count;
size_t fields1 = 0;
size_t fields2 = 0;
grib_handle* p;
FILE* dev_null = fopen("/dev/null","w");
grib_context *c = grib_context_new(0);
f = fopen(argc > 1 ? argv[1]: "data" ,"r");
if(!f)
{
perror(argc > 1 ? argv[1]: "data");
exit(1);
}
length = sizeof(buffer);
grib_context_set_memory_proc(c,default_malloc,default_free);
grib_context_set_persistent_memory_proc(c,default_malloc,default_free);
while( (e = readany(f,buffer,&length)) == 0)
{
/* alarm(60); */
fields1++;
if(fields1 != 1)
{
length = sizeof(buffer);
alarm(0);
continue;
}
g = grib_handle_new_from_message(c,buffer,length);
p = grib_handle_new_from_message_copy(c,buffer,length);
grib_dump_content(g,dev_null,NULL,0,NULL);
i = grib_iterator_new(g);
if(i != NULL)
{
n = 0;
while(grib_iterator_next(i,&lat,&lon,&val))
{
n++;
}
grib_iterator_delete(i);
/* printf("n = %d\n",n); if(n != size) exit(1); */
}
count = 0;
if(grib_get_size(g,"values",&count) == 0 && count != 0)
{
double *values = (double*)malloc(sizeof(double)*count);
int err;
if((err = grib_get_double_array(g,"values",values,&count)))
{
fprintf(stderr,"Cannot get values %d (%s) count=%d\n",err,grib_get_error_message(err),count);
}
free(values);
}
{
grib_handle *h = grib_handle_clone(g);
grib_keyset* ks = grib_new_keyset(h,"mars.*");
char name[80];
size_t len = sizeof(name);
int err;
while(grib_keyset_next(ks,name,&len))
{
double d; long l; char c[1024]; unsigned char b[1024];
printf("%s\n",name);
if((err = grib_get_double(h,name,&d)))
fprintf(stderr,"Cannot get %s as double %d (%s)\n",name,err,
grib_get_error_message(err));
if((err = grib_get_long(h,name,&l)))
fprintf(stderr,"Cannot get %s as long %d (%s)\n",name,err,
grib_get_error_message(err));
len = sizeof(c);
if((err = grib_get_string(h,name,c,&len)))
fprintf(stderr,"Cannot get %s as string %d (%s)\n",name,err,
grib_get_error_message(err));
len = sizeof(b);
if((err = grib_get_bytes(h,name,b,&len)))
fprintf(stderr,"Cannot get %s as bytes %d (%s)\n",name,err,
grib_get_error_message(err));
len = sizeof(name);
}
grib_keyset_delete(ks);
grib_handle_delete(h);
}
grib_handle_delete(g);
grib_handle_delete(p);
length = sizeof(buffer);
}
rewind(f);
while((g = grib_handle_new_from_file(c,f,&e)))
{
int i;
fields2++;
for(i=1;i<10;i++)
grib_set_long(g,"localDefinitionNumber",i);
grib_handle_delete(g);
}
if(e) {
fprintf(stderr,"grib_handle_new_from_file error %s\n",grib_get_error_message(e));
exit(1);}
if(fields1 != fields2)
{
fprintf(stderr,"readany/grib_handle_new_from_file mismatch %d %d\n",fields1,fields2);
exit(1);
}
grib_handle_delete(grib_handle_new_from_samples(c,"latlon"));
rewind(f);
grib_context_delete(c);
if(cnt != 0)
{
fprintf(stderr,"Malloc/free mismatch %ld\n",cnt);
exit(1);
}
fclose(f);
if(e != -1)
{
fprintf(stderr,"readany error %d\n",e);
exit(1);
}
fclose(dev_null);
exit(cnt);
}