[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40189] trunk/blender: fix compilation for MinGW by substituting qsort_r with qsort.

Sergey I. Sharybin g.ulairi at gmail.com
Thu Sep 15 10:38:19 CEST 2011


Hi,

Unfortunately. it's not fixing actual problem -- both of buildbot and 
release environment fails to compile current Blender. This happens 
because there's no qsort_r (or something like this) funciton in libc2.7.

I haven't seen this usage of function in recent recast library svn and i 
think we can easily avoid it's usage from blender-side. At least, it's 
not so difficult to implement own sort function which will accept 
context parameter.

And currently, we'll have different behavior with mingw and msvc: mingw 
now isn't thread safe here. I'd prefer not to introduce difference into 
platforms. If this code currently can't be called from concurrent 
threads -- it's better to use qsort+static variable for context.

Benoit, you maintains this code, so i hope you'll be able to solve this 
issue.

Antony Riakiotakis wrote:
> Revision: 40189
>            http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40189
> Author:   psy-fi
> Date:     2011-09-13 19:51:58 +0000 (Tue, 13 Sep 2011)
> Log Message:
> -----------
> fix compilation for MinGW by substituting qsort_r with qsort. What aversion do MinGW guys have for including '_r' variants of functions anyway?
> Warning: a clean build will be needed probably to account for recent merge changes, or link errors will occur.
>
> Modified Paths:
> --------------
>      trunk/blender/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp
>      trunk/blender/source/blender/blenkernel/intern/navmesh_conversion.cpp
>
> Modified: trunk/blender/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp
> ===================================================================
> --- trunk/blender/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp	2011-09-13 16:54:01 UTC (rev 40188)
> +++ trunk/blender/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp	2011-09-13 19:51:58 UTC (rev 40189)
> @@ -94,7 +94,20 @@
>   	
>   	return (drsqr<= rsqr) ? 1 : 0;
>   }
> -
> +#ifdef FREE_WINDOWS
> +static float *_mingw_verts;
> +static int ptcmp(const void *v1, const void *v2)
> +{
> +	const float* p1 =&_mingw_verts[(*(const int*)v1)*3];
> +	const float* p2 =&_mingw_verts[(*(const int*)v2)*3];
> +	if (p1[0]<  p2[0])
> +		return -1;
> +	else if (p1[0]>  p2[0])
> +		return 1;
> +	else
> +		return 0;
> +}
> +#else
>   #if defined(_MSC_VER)
>   static int ptcmp(void* up, const void *v1, const void *v2)
>   #elif defined(__APPLE__) || defined(__FreeBSD__)
> @@ -113,6 +126,7 @@
>   	else
>   		return 0;
>   }
> +#endif
>
>   // Based on Paul Bourke's triangulate.c
>   //  http://astronomy.swin.edu.au/~pbourke/terrain/triangulate/triangulate.c
> @@ -126,6 +140,9 @@
>   	qsort_s(&idx[0], idx.size(), sizeof(int), ptcmp, verts);
>   #elif defined(__APPLE__) || defined(__FreeBSD__)
>   	qsort_r(&idx[0], idx.size(), sizeof(int), verts, ptcmp);
> +#elif defined(FREE_WINDOWS)
> +	_mingw_verts = verts;
> +	qsort(&idx[0], idx.size(), sizeof(int), ptcmp);
>   #else
>   	qsort_r(&idx[0], idx.size(), sizeof(int), ptcmp, verts);
>   #endif
>
> Modified: trunk/blender/source/blender/blenkernel/intern/navmesh_conversion.cpp
> ===================================================================
> --- trunk/blender/source/blender/blenkernel/intern/navmesh_conversion.cpp	2011-09-13 16:54:01 UTC (rev 40188)
> +++ trunk/blender/source/blender/blenkernel/intern/navmesh_conversion.cpp	2011-09-13 19:51:58 UTC (rev 40189)
> @@ -289,6 +289,15 @@
>   	const int* recastData;
>   	const int* trisToFacesMap;
>   };
> +
> +#ifdef FREE_WINDOWS
> +static SortContext *_mingw_context;
> +static int compareByData(const void * a, const void * b)
> +{
> +	return ( _mingw_context->recastData[_mingw_context->trisToFacesMap[*(int*)a]] -
> +			_mingw_context->recastData[_mingw_context->trisToFacesMap[*(int*)b]] );
> +}
> +#else
>   #if defined(_MSC_VER)
>   static int compareByData(void* data, const void * a, const void * b)
>   #elif defined(__APPLE__) || defined(__FreeBSD__)
> @@ -301,6 +310,7 @@
>   	return ( context->recastData[context->trisToFacesMap[*(int*)a]] -
>   		context->recastData[context->trisToFacesMap[*(int*)b]] );
>   }
> +#endif
>
>   bool buildNavMeshData(const int nverts, const float* verts,
>   							 const int ntris, const unsigned short *tris,
> @@ -327,6 +337,9 @@
>   	qsort_s(trisMapping, ntris, sizeof(int), compareByData,&context);
>   #elif defined(__APPLE__) || defined(__FreeBSD__)
>   	qsort_r(trisMapping, ntris, sizeof(int),&context, compareByData);
> +#elif defined(FREE_WINDOWS)
> +	_mingw_context =&context;
> +	qsort(trisMapping, ntris, sizeof(int), compareByData);
>   #else
>   	qsort_r(trisMapping, ntris, sizeof(int), compareByData,&context);
>   #endif
>
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>


-- 
With best regards, Sergey I. Sharybin



More information about the Bf-committers mailing list