[Mapserver-dev] file handle leakage in mapswf.c?

Yewondwossen Assefa assefa at dmsolutions.ca
Wed Jul 16 12:08:53 EDT 2003


Hi There,

 I have applied the patches to mapswf.c (r1.30). Thnaks a lot.

There still seems to be an issue when rendering labels with angles. Does 
this work properly for you ? You can contact me off the list on this 
issue if It works for you. If not I will enter a bug in mapserver on that.

Later,

Steve Spicklemire wrote:

>
> Hi Mapserver developers..
>
> First, I want to thank you for a fantastic product. In a very short 
> period of time, I've moved the mapping code of a complex system to 
> mapscript. We're developing a sort of property/inventory management 
> system with Zope and flash. We needed maps to make it possible to view 
> the system in a graphical way. I started with ming alone, but happily 
> someone pointed out Mapserver, and I found that with Mapserver, and 
> PostGIS I could do everything I needed to. The only problem was that 
> scaling, rotating, and sometimes even presentation of fonts wasn't 
> working. I scoured the mailing lists.. and fiddled around with 
> variations on mapfiles for several days. Yesterday, I decided that I 
> needed to dig in to the code with the debugger and find out what was 
> really happening. It seems that mapswf.c allocates a file handle to 
> read a font file every time it draws text! I had a *lot* of labels on 
> my maps, and my process was running out of file handles. Unfortunately 
> this was silently ignored, and the result was simply no output! (By 
> the time the code got around to trying to *write* anything, all the 
> file handles were consumed by attempts to load the font from the 
> filesystem).
>
> Anyway.. my quick-fix is to simply close the font file every time it's 
> read. Probably some sort of font-cache would make more sense. (I think 
> that ming may already *have* a font cache.. I'll look into what it 
> would take to find out.)
>
> Here are my patches to mapswf.c...
>
> -steve
>
> diff -C3 -r1.29 mapswf.c
> *** mapswf.c    11 Jun 2003 17:54:42 -0000      1.29
> --- mapswf.c    16 Jul 2003 13:31:12 -0000
> ***************
> *** 1563,1580 ****
>       if (!string || !pszFontFile || !psColor)
>           return NULL;
>
> !     oFont  = loadSWFFontFromFile(fopen(pszFontFile, "rb"));
> !     if (oFont)
> !     {
> !         oText = newSWFText();
> !         SWFText_setFont(oText, oFont);
> !         SWFText_moveTo(oText, (float)nX, (float)nY);
> !         SWFText_setColor(oText, (byte)psColor->red, 
> (byte)psColor->green, (byte)psColor->blue,
> !                          0xff);
> !         SWFText_setHeight(oText, (float)dfSize);
> !         SWFText_addString(oText, string, NULL);
>
> !         return oText;
>       }
>
>       return NULL;
> --- 1563,1585 ----
>       if (!string || !pszFontFile || !psColor)
>           return NULL;
>
> !     FILE *f = fopen(pszFontFile, "rb");
> !
> !     if (f) {
> !       oFont  = loadSWFFontFromFile(f);
> !       if (oFont)
> !       {
> !         fclose(f);
> !         oText = newSWFText();
> !         SWFText_setFont(oText, oFont);
> !         SWFText_moveTo(oText, (float)nX, (float)nY);
> !         SWFText_setColor(oText, (byte)psColor->red, 
> (byte)psColor->green, (byte)psColor->blue,
> !                          0xff);
> !         SWFText_setHeight(oText, (float)dfSize);
> !         SWFText_addString(oText, string, NULL);
>
> !         return oText;
> !       }
>       }
>
>       return NULL;
> ***************
> *** 1896,1902 ****
>
>   //    char *error=NULL, *font=NULL;
>   //    int bbox[8];
> - //    double angle_radians = MS_DEG_TO_RAD*label->angle;
>
>       size = label->size*scalefactor;
>
> --- 1901,1906 ----
> ***************
> *** 1953,1963 ****
>         return(-1);
>       }
>
> !     oText = DrawText(string, x, y, msBuildPath(szPath, 
> fontset->filename, font), size, &sColor);
>       if (oText)
>       {
>           //nTmp = image->img.swf->nCurrentMovie;
> !         SWFMovie_add(GetCurrentMovie(map, image), oText);
>       }
>
>       return 0;
> --- 1957,1970 ----
>         return(-1);
>       }
>
> !     oText = DrawText(string, 0, 0, msBuildPath(szPath, 
> fontset->filename, font), size, &sColor);
>       if (oText)
>       {
> +         SWFDisplayItem i;
>           //nTmp = image->img.swf->nCurrentMovie;
> !         i = SWFMovie_add(GetCurrentMovie(map, image), oText);
> !         SWFDisplayItem_moveTo(i, x, y);
> !       SWFDisplayItem_rotate(i, (float)label->angle);
>       }
>
>       return 0;
> ***************
> *** 1997,2005 ****
>           return(-1);
>       }
>
> !     oFont  = loadSWFFontFromFile(fopen(msBuildPath(szPath, 
> fontset->filename, font), "rb"));
>       if (oFont)
>       {
>           oText = newSWFText();
>           SWFText_setFont(oText, oFont);
>           //SWFText_addString(oText, string, NULL);
> --- 2004,2014 ----
>           return(-1);
>       }
>
> !     FILE *f = fopen(msBuildPath(szPath, fontset->filename, font), 
> "rb");
> !     oFont  = loadSWFFontFromFile(f);
>       if (oFont)
>       {
> +         fclose(f);
>           oText = newSWFText();
>           SWFText_setFont(oText, oFont);
>           //SWFText_addString(oText, string, NULL);
> ***************
> *** 2543,2548 ****
> --- 2552,2558 ----
>       int         nLength;
>       int         iPointPos;
>       int         iSlashPos;
> +     int         iSaveResult;
>       char        szAction[200];
>       SWFAction   oAction;
>       mapObj      *map = NULL;
> ***************
> *** 2558,2565 ****
>                                                  "OUTPUT_MOVIE",""),
>                          "MULTIPLE") != 0)
>           {
> !             SWFMovie_save(image->img.swf->sMainMovie, filename);
>               return(MS_SUCCESS);
>           }
>
>   /* 
> -------------------------------------------------------------------- */
> --- 2568,2579 ----
>                                                  "OUTPUT_MOVIE",""),
>                          "MULTIPLE") != 0)
>           {
> !         iSaveResult = SWFMovie_save(image->img.swf->sMainMovie, 
> filename);
> !         if (!iSaveResult) {
>               return(MS_SUCCESS);
> +         }else{
> +             return(MS_FAILURE);
> +         }
>           }
>
> _______________________________________________
> Mapserver-dev mailing list
> Mapserver-dev at lists.gis.umn.edu
> http://lists.gis.umn.edu/mailman/listinfo/mapserver-dev
>

-- 
----------------------------------------------------------------
Assefa Yewondwossen           
Software Analyst   

Email: assefa at dmsolutions.ca    
http://www.dmsolutions.ca/

Phone: (613) 565-5056 (ext 14)
Fax:   (613) 565-0925
----------------------------------------------------------------








More information about the mapserver-dev mailing list