[GRASS-dev] opencell opening temp null file: no temp files available

Glynn Clements glynn at gclements.plus.com
Wed Nov 19 12:13:33 EST 2008


Andi Jochem wrote:

> I found out that it has nothing to do with my open and closed cell files
> 
> I must be something in my reproject function.
> 
> I read in some points (2000) and each point is transformed to lat/lang using following function
> 
> 
> void transfform_lat(double longitude, double latitude){
> 
>   
>     struct Key_Value *in_proj_info, *in_unit_info; 
>     struct pj_info iproj;    
>     struct pj_info oproj;    
>       
> ...
> ...
> ...
>    
> 	
> 	if ((in_proj_info = G_get_projinfo()) == NULL)
> 		G_fatal_error("Can't get projection info of current location");
> 	
> 	if ((in_unit_info = G_get_projunits()) == NULL)
> 		G_fatal_error("Can't get projection units of current location");
> 	
> 	if (pj_get_kv(&iproj, in_proj_info, in_unit_info) < 0)
> 		G_fatal_error("Can't get projection key values of current location");
> 	
> 	G_free_key_value( in_proj_info );
> 	G_free_key_value( in_unit_info );
> 	
> 	
> 	/* set output projection to lat/long for solpos*/
> 	oproj.zone = 0;
> 	oproj.meters = 1.;
> 	sprintf(oproj.proj, "ll");
> 	if ((oproj.pj = pj_latlong_from_proj(iproj.pj)) == NULL)
> 		G_fatal_error("Unable to set up lat/long projection parameters");

You shouldn't be doing this for each point. Do it once, and keep iproj
and oproj around.

> After 1024 projections the programm stops.
> 
> When I have a look in /proc/<pid>/fd/ 
> 
> I can see the following:
> ...
> ...
> ...
> lr-x------ 1 andi andi 64 2008-11-19 16:21 66 -> /usr/local/grass-6.3.0/etc/ellipse.table
> lr-x------ 1 andi andi 64 2008-11-19 16:21 67 -> /usr/local/grass-6.3.0/etc/ellipse.table

[snip]

This looks like a GRASS bug.

read_ellipsoid_table() in lib/proj/ellipse.c never closes the file.
You can fix it with:

--- lib/proj/ellipse.c	(revision 31109)
+++ lib/proj/ellipse.c	(working copy)
@@ -264,6 +264,9 @@
 	    continue;
 	}
     }
+
+    fclose(fd);
+
     if (!err)
 	return outputlist;
 
This has been fixed in 6.4/7.0.

read_ellipsoid_table() in lib/gis/get_ellipse.c has the same issue
(which I've now fixed). However, that function checks whether the
table has already been read, and returns immediately if it has, so it
never opens the file more than once.

I suspect the lib/proj version should do something similar. In fact,
it should probably use the code in lib/gis.

-- 
Glynn Clements <glynn at gclements.plus.com>


More information about the grass-dev mailing list