Skip to content

Commit

Permalink
Drop support for non-reentrant external libqhull
Browse files Browse the repository at this point in the history
  • Loading branch information
rouault committed Dec 23, 2021
1 parent 3c2f7d2 commit a88eac4
Show file tree
Hide file tree
Showing 11 changed files with 23 additions and 168 deletions.
2 changes: 0 additions & 2 deletions GDALmake.opt.in
Original file line number Diff line number Diff line change
Expand Up @@ -310,8 +310,6 @@ SFCGAL_CFLAGS = @SFCGAL_CFLAGS@
# QHull Support

QHULL_SETTING = @QHULL_SETTING@
QHULL_INCLUDE_SUBDIR_IS_LIBQHULL = @QHULL_INCLUDE_SUBDIR_IS_LIBQHULL@
QHULL_IS_LIBQHULL_R = @QHULL_IS_LIBQHULL_R@

# GRASS Support

Expand Down
7 changes: 0 additions & 7 deletions alg/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -81,13 +81,6 @@ if (GDAL_ENABLE_QHULL)
target_include_directories(alg PRIVATE internal_libqhull)
else ()
target_compile_definitions(alg PRIVATE -DEXTERNAL_QHULL)
if (QHULL_INCLUDE_SUBDIR STREQUAL "libqhull_r")
target_compile_definitions(alg PRIVATE -DQHULL_IS_LIBQHULL_R=1)
elseif (QHULL_INCLUDE_SUBDIR STREQUAL "libqhull")
target_compile_definitions(alg PRIVATE -DQHULL_INCLUDE_SUBDIR_IS_LIBQHULL=1)
else ()
target_compile_definitions(alg PRIVATE -DQHULL_INCLUDE_SUBDIR_IS_LIBQHULL=0)
endif ()
target_include_directories(alg PRIVATE ${QHULL_INCLUDE_DIR})
gdal_add_private_link_libraries(${QHULL_LIBRARY})
endif ()
Expand Down
6 changes: 1 addition & 5 deletions alg/GNUmakefile
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,7 @@ CPPFLAGS := -DHAVE_ARMADILLO $(CPPFLAGS)
endif

ifeq ($(QHULL_SETTING),external)
ifeq ($(QHULL_IS_LIBQHULL_R),1)
CPPFLAGS := -DEXTERNAL_QHULL -DQHULL_IS_LIBQHULL_R=1 $(CPPFLAGS)
else
CPPFLAGS := -DEXTERNAL_QHULL -DQHULL_INCLUDE_SUBDIR_IS_LIBQHULL=$(QHULL_INCLUDE_SUBDIR_IS_LIBQHULL) $(CPPFLAGS)
endif
CPPFLAGS := -DEXTERNAL_QHULL $(CPPFLAGS)
endif
ifeq ($(QHULL_SETTING),internal)
CPPFLAGS := -DINTERNAL_QHULL $(CPPFLAGS)
Expand Down
110 changes: 16 additions & 94 deletions alg/delaunay.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@

#include "cpl_error.h"
#include "cpl_conv.h"
#include "cpl_multiproc.h"
#include "gdal_alg.h"

#include <stdio.h>
Expand All @@ -60,11 +59,8 @@ CPL_CVSID("$Id$")

#include "internal_qhull_headers.h"

#define QHULL_IS_LIBQHULL_R

#else /* INTERNAL_QHULL */

#if defined(QHULL_IS_LIBQHULL_R)
#ifdef _MSC_VER
#pragma warning( push )
#pragma warning( disable : 4324 ) // 'qhT': structure was padded due to alignment specifier
Expand All @@ -76,28 +72,12 @@ CPL_CVSID("$Id$")
#ifdef _MSC_VER
#pragma warning( pop )
#endif
#elif !defined(QHULL_INCLUDE_SUBDIR_IS_LIBQHULL)
#include "libqhull.h"
#include "qset.h"
#elif QHULL_INCLUDE_SUBDIR_IS_LIBQHULL
#include "libqhull/libqhull.h"
#include "libqhull/qset.h"
#else
#include "qhull/libqhull.h"
#include "qhull/qset.h"
#endif

#endif /* INTERNAL_QHULL */

#endif /* HAVE_INTERNAL_OR_EXTERNAL_QHULL*/


#if HAVE_INTERNAL_OR_EXTERNAL_QHULL
#if !defined(QHULL_IS_LIBQHULL_R)
static CPLMutex* hMutex = NULL;
#endif
#endif

/************************************************************************/
/* GDALHasTriangulation() */
/************************************************************************/
Expand All @@ -117,14 +97,6 @@ int GDALHasTriangulation()
#endif
}

#if defined(QHULL_IS_LIBQHULL_R)
#define QH_MEMBER(qh, member) qh->member
#define QH_ARG qh,
#else
#define QH_MEMBER(qh, member) qh member
#define QH_ARG
#endif

/************************************************************************/
/* GDALTriangulationCreateDelaunay() */
/************************************************************************/
Expand Down Expand Up @@ -152,33 +124,14 @@ GDALTriangulation* GDALTriangulationCreateDelaunay(int nPoints,
int* panMapQHFacetIdToFacetIdx; /* map from QHull facet ID to the index of our GDALTriFacet* array */
int curlong, totlong; /* memory remaining after qh_memfreeshort */

#if defined(QHULL_IS_LIBQHULL_R)
qhT qh_qh;
qhT *qh= &qh_qh;

QHULL_LIB_CHECK /* Check for compatible library */
#else
/* QHull is not thread safe, so we need to protect all operations with a mutex */
CPLCreateOrAcquireMutex(&hMutex, 1000);

#if qh_QHpointer /* see user.h */
if (qh_qh)
{
fprintf (stderr, "QH6238: Qhull link error. The global variable qh_qh was not initialized\n\
to NULL by global.c. Please compile this program with -Dqh_QHpointer_dllimport\n\
as well as -Dqh_QHpointer, or use libqhullstatic, or use a different tool chain.\n\n");
CPLReleaseMutex(hMutex);
return NULL;
}
#endif
#endif

points = (coordT*)VSI_MALLOC2_VERBOSE(sizeof(double)*2, nPoints);
if( points == NULL )
{
#if !defined(QHULL_IS_LIBQHULL_R)
CPLReleaseMutex(hMutex);
#endif
return NULL;
}
for(i=0;i<nPoints;i++)
Expand All @@ -187,16 +140,14 @@ GDALTriangulation* GDALTriangulationCreateDelaunay(int nPoints,
points[2*i+1] = padfY[i];
}

#if defined(QHULL_IS_LIBQHULL_R)
qh_meminit(qh, NULL);
#endif

/* d: Delaunay */
/* Qbb: scale last coordinate to [0,m] for Delaunay */
/* Qc: keep coplanar points with nearest facet */
/* Qz: add a point-at-infinity for Delaunay triangulation */
/* Qt: triangulated output */
if( qh_new_qhull(QH_ARG
if( qh_new_qhull(qh,
2, nPoints, points, FALSE /* ismalloc */,
"qhull d Qbb Qc Qz Qt", NULL, stderr) != 0 )
{
Expand All @@ -208,40 +159,32 @@ GDALTriangulation* GDALTriangulationCreateDelaunay(int nPoints,
VSIFree(points);
points = NULL;

#if qh_QHpointer /* see user.h */
if (qh_qh == NULL)
{
CPLReleaseMutex(hMutex);
return NULL;
}
#endif

/* Establish a map from QHull facet id to the index in our array of sequential facets */
panMapQHFacetIdToFacetIdx = (int*)VSI_MALLOC2_VERBOSE(sizeof(int), QH_MEMBER(qh, facet_id));
panMapQHFacetIdToFacetIdx = (int*)VSI_MALLOC2_VERBOSE(sizeof(int), qh->facet_id);
if( panMapQHFacetIdToFacetIdx == NULL )
{
goto end;
}
memset(panMapQHFacetIdToFacetIdx, 0xFF, sizeof(int) * QH_MEMBER(qh, facet_id));
memset(panMapQHFacetIdToFacetIdx, 0xFF, sizeof(int) * qh->facet_id);

for(j = 0, facet = QH_MEMBER(qh, facet_list);
for(j = 0, facet = qh->facet_list;
facet != NULL && facet->next != NULL;
facet = facet->next)
{
if( facet->upperdelaunay != QH_MEMBER(qh, UPPERdelaunay) )
if( facet->upperdelaunay != qh->UPPERdelaunay )
continue;

if( qh_setsize(QH_ARG facet->vertices) != 3 ||
qh_setsize(QH_ARG facet->neighbors) != 3 )
if( qh_setsize(qh, facet->vertices) != 3 ||
qh_setsize(qh, facet->neighbors) != 3 )
{
CPLError(CE_Failure, CPLE_AppDefined,
"Triangulation resulted in non triangular facet %d: vertices=%d",
facet->id, qh_setsize(QH_ARG facet->vertices));
facet->id, qh_setsize(qh, facet->vertices));
VSIFree(panMapQHFacetIdToFacetIdx);
goto end;
}

CPLAssert(facet->id < QH_MEMBER(qh, facet_id));
CPLAssert(facet->id < qh->facet_id);
panMapQHFacetIdToFacetIdx[facet->id] = j++;
}

Expand All @@ -257,20 +200,20 @@ GDALTriangulation* GDALTriangulationCreateDelaunay(int nPoints,
psDT->pasFacets = pasFacets;

// Store vertex and neighbor information for each triangle.
for(facet = QH_MEMBER(qh, facet_list);
for(facet = qh->facet_list;
facet != NULL && facet->next != NULL;
facet = facet->next)
{
int k;
if( facet->upperdelaunay != QH_MEMBER(qh, UPPERdelaunay) )
if( facet->upperdelaunay != qh->UPPERdelaunay )
continue;
k = panMapQHFacetIdToFacetIdx[facet->id];
pasFacets[k].anVertexIdx[0] =
qh_pointid(QH_ARG ((vertexT*) facet->vertices->e[0].p)->point);
qh_pointid(qh, ((vertexT*) facet->vertices->e[0].p)->point);
pasFacets[k].anVertexIdx[1] =
qh_pointid(QH_ARG ((vertexT*) facet->vertices->e[1].p)->point);
qh_pointid(qh, ((vertexT*) facet->vertices->e[1].p)->point);
pasFacets[k].anVertexIdx[2] =
qh_pointid(QH_ARG ((vertexT*) facet->vertices->e[2].p)->point);
qh_pointid(qh, ((vertexT*) facet->vertices->e[2].p)->point);
pasFacets[k].anNeighborIdx[0] =
panMapQHFacetIdToFacetIdx[((facetT*) facet->neighbors->e[0].p)->id];
pasFacets[k].anNeighborIdx[1] =
Expand All @@ -282,12 +225,8 @@ GDALTriangulation* GDALTriangulationCreateDelaunay(int nPoints,
VSIFree(panMapQHFacetIdToFacetIdx);

end:
qh_freeqhull(QH_ARG !qh_ALL);
qh_memfreeshort(QH_ARG &curlong, &totlong);

#if !defined(QHULL_IS_LIBQHULL_R)
CPLReleaseMutex(hMutex);
#endif
qh_freeqhull(qh, !qh_ALL);
qh_memfreeshort(qh, &curlong, &totlong);

return psDT;
#else /* HAVE_INTERNAL_OR_EXTERNAL_QHULL */
Expand Down Expand Up @@ -666,20 +605,3 @@ int GDALTriangulationFindFacetDirected(const GDALTriangulation* psDT,
CPLDebug("GDAL", "Using brute force lookup");
return GDALTriangulationFindFacetBruteForce(psDT, dfX, dfY, panOutputFacetIdx);
}

/************************************************************************/
/* GDALTriangulationTerminate() */
/************************************************************************/

void GDALTriangulationTerminate()
{
#if HAVE_INTERNAL_OR_EXTERNAL_QHULL
#if !defined(QHULL_IS_LIBQHULL_R)
if( hMutex != NULL )
{
CPLDestroyMutex(hMutex);
hMutex = NULL;
}
#endif
#endif
}
5 changes: 0 additions & 5 deletions alg/gdal_alg.h
Original file line number Diff line number Diff line change
Expand Up @@ -683,11 +683,6 @@ int CPL_DLL GDALTriangulationFindFacetDirected( const GDALTriangulation* psDT,
int* panOutputFacetIdx );
void CPL_DLL GDALTriangulationFree(GDALTriangulation* psDT);

/*! @cond Doxygen_Suppress */
// GDAL internal use only
void GDALTriangulationTerminate(void);
/*! @endcond */

/*! @cond Doxygen_Suppress */
#ifndef CPL_WARN_DEPRECATED_GDALOpenVerticalShiftGrid
#define CPL_WARN_DEPRECATED_GDALOpenVerticalShiftGrid CPL_WARN_DEPRECATED
Expand Down
3 changes: 0 additions & 3 deletions alg/makefile.vc
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,6 @@ EXTRAFLAGS = $(EXTRAFLAGS) -DINTERNAL_QHULL
!ELSE
!IF "$(QHULL_SETTING)" == "EXTERNAL"
EXTRAFLAGS = $(EXTRAFLAGS) -DEXTERNAL_QHULL $(QHULL_INC)
!IF "$(QHULL_IS_LIBQHULL_R)" == "1"
EXTRAFLAGS = $(EXTRAFLAGS) -DQHULL_IS_LIBQHULL_R=1
!ENDIF
!ENDIF
!ENDIF
!ENDIF
Expand Down
19 changes: 3 additions & 16 deletions cmake/modules/packages/FindQHULL.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,12 @@
# If it's found it sets QHULL_FOUND to TRUE
# and following variables are set:
# QHULL_INCLUDE_DIR
# QHULL_INCLUDE_SUBDIR (libqhull_r/qhull/libqhull)
# QHULL_LIBRARY
#

find_path(QHULL_INCLUDE_DIR libqhull_r/libqhull_r.h qhull/libqhull.h libqhull/libqhull.h)
if(QHULL_INCLUDE_DIR)
if(EXISTS ${QHULL_INCLUDE_DIR}/libqhull_r/libqhull_r.h)
set(QHULL_INCLUDE_SUBDIR "libqhull_r")
elseif(EXISTS ${QHULL_INCLUDE_DIR}/qhull/libqhull.h)
set(QHULL_INCLUDE_SUBDIR "qhull")
elseif(EXISTS ${QHULL_INCLUDE_DIR}/libqhull/libqhull.h)
set(QHULL_INCLUDE_SUBDIR "libqhull")
else()
message(FATAL_ERROR "Cannot guess QHULL_INCLUDE_SUBDIR from QHULL_INCLUDE_DIR=${QHULL_INCLUDE_DIR}")
endif()
endif()

find_library(QHULL_LIBRARY NAMES qhull_r qhull libqhull)
mark_as_advanced(QHULL_INCLUDE_SUBDIR QHULL_INCLUDE_DIR QHULL_LIBRARY)
find_path(QHULL_INCLUDE_DIR libqhull_r/libqhull_r.h)
find_library(QHULL_LIBRARY NAMES qhull_r)
mark_as_advanced(QHULL_INCLUDE_DIR QHULL_LIBRARY)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(QHULL
Expand Down
26 changes: 0 additions & 26 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -4682,31 +4682,8 @@ elif test "$with_qhull" = "yes" -o "$with_qhull" = "" ; then
AC_CHECK_LIB(qhull_r,qh_new_qhull,QHULL_SETTING=yes,QHULL_SETTING=no,)
if test "$QHULL_SETTING" = "yes"; then
QHULL_SETTING=external
QHULL_IS_LIBQHULL_R=1
LIBS="-lqhull_r $LIBS"
fi
else
# Only qhull 2012 is reliable on certain datasets. Older Ubuntu have
# qhull/qhull.h
AC_CHECK_HEADERS([qhull/libqhull.h])
if test "$ac_cv_header_qhull_libqhull_h" = "yes"; then
AC_CHECK_LIB(qhull,qh_new_qhull,QHULL_SETTING=yes,QHULL_SETTING=no,)
if test "$QHULL_SETTING" = "yes"; then
QHULL_SETTING=external
QHULL_INCLUDE_SUBDIR_IS_LIBQHULL=0
LIBS="-lqhull $LIBS"
fi
fi

AC_CHECK_HEADERS([libqhull/libqhull.h])
if test "$ac_cv_header_libqhull_libqhull_h" = "yes"; then
AC_CHECK_LIB(qhull,qh_new_qhull,QHULL_SETTING=yes,QHULL_SETTING=no,)
if test "$QHULL_SETTING" = "yes"; then
QHULL_SETTING=external
QHULL_INCLUDE_SUBDIR_IS_LIBQHULL=1
LIBS="-lqhull $LIBS"
fi
fi
fi

if test "$QHULL_SETTING" = "no" ; then
Expand All @@ -4719,12 +4696,9 @@ elif test "$with_qhull" = "yes" -o "$with_qhull" = "" ; then
fi
else
QHULL_SETTING=internal
QHULL_INCLUDE_SUBDIR_IS_LIBQHULL=1
fi

AC_SUBST([QHULL_SETTING],$QHULL_SETTING)
AC_SUBST([QHULL_INCLUDE_SUBDIR_IS_LIBQHULL],$QHULL_INCLUDE_SUBDIR_IS_LIBQHULL)
AC_SUBST([QHULL_IS_LIBQHULL_R],$QHULL_IS_LIBQHULL_R)

dnl ---------------------------------------------------------------------------
dnl Check if opencl library is available.
Expand Down
4 changes: 2 additions & 2 deletions doc/source/build_hints.rst
Original file line number Diff line number Diff line change
Expand Up @@ -626,11 +626,11 @@ found, an internal copy is used.

.. option:: QHULL_INCLUDE_DIR

Path to an include directory with the ``libqhull_r/libqhull_r.h``, ``qhull_r/libqhull.h`` or ``libqhull/libqhull.h`` header file.
Path to an include directory with the ``libqhull_r/libqhull_r.h`` header file.

.. option:: QHULL_LIBRARY

Path to a shared or static library file.
Path to a shared or static library file to the reentrant library.

.. option:: GDAL_USE_QHULL=ON/OFF

Expand Down
5 changes: 0 additions & 5 deletions gcore/gdaldrivermanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -315,11 +315,6 @@ GDALDriverManager::~GDALDriverManager()
/* -------------------------------------------------------------------- */
CPLCleanupSetlocaleMutex();

/* -------------------------------------------------------------------- */
/* Cleanup QHull mutex. */
/* -------------------------------------------------------------------- */
GDALTriangulationTerminate();

/* -------------------------------------------------------------------- */
/* Cleanup curl related stuff. */
/* -------------------------------------------------------------------- */
Expand Down
Loading

0 comments on commit a88eac4

Please sign in to comment.