* Important / Breaking Changes *
+ - #2089, liblwgeom: lwgeom_set_handlers replaces lwgeom_init_allocators.
- #1653, Removed srid parameter from ST_Resample(raster) and variants
with reference raster no longer apply reference raster's SRID.
- #2026, ST_Union(raster) now unions all bands of all rasters
int getStyleName(char **styleName, char* line);
-/**
- * Set up liblwgeom to run in stand-alone mode using the
- * usual system memory handling functions.
- */
-void lwgeom_init_allocators(void)
-{
- /* liblwgeom callback - install default handlers */
- lwgeom_install_default_allocators();
-}
-
/**
* Writes the coordinates of a POINTARRAY to a char* where ordinates are
* separated by a comma and coordinates by a space so that the coordinate
#include "liblwgeom_internal.h"
#include "cu_tester.h"
+/* Internal funcs */
+static void
+cu_errorreporter(const char *fmt, va_list ap);
+
/* ADD YOUR SUITE HERE (1 of 2) */
extern CU_SuiteInfo print_suite;
extern CU_SuiteInfo algorithms_suite;
int num_run;
int num_failed;
+ /* install the custom error handler */
+ lwgeom_set_handlers(0, 0, 0, cu_errorreporter, 0);
+
/* initialize the CUnit test registry */
if (CUE_SUCCESS != CU_initialize_registry())
{
{
memset(cu_error_msg, '\0', MAX_CUNIT_ERROR_LENGTH);
}
-
-/*
-** Set up liblwgeom to run in stand-alone mode using the
-** usual system memory handling functions.
-*/
-void lwgeom_init_allocators(void)
-{
- lwalloc_var = default_allocator;
- lwrealloc_var = default_reallocator;
- lwfree_var = default_freeor;
- lwnotice_var = default_noticereporter;
- lwerror_var = cu_errorreporter;
-}
-
* units tests at cunit/cu_tester.c and the loader/dumper programs at
* ../loader/shp2pgsql.c are examples of non-PostGIS applications using liblwgeom.
*
-* Programs using this library should set up the default memory managers and error
-* handlers by implementing an lwgeom_init_allocators() function, which can be as
-* a wrapper around the lwgeom_install_default_allocators() function if you want
-* no special handling for memory management and error reporting.
+* Programs using this library can install their custom memory managers and error
+* handlers by calling the lwgeom_set_handlers() function, otherwise the default
+* ones will be used.
*/
/**
typedef void* (*lwreallocator)(void *mem, size_t size);
typedef void (*lwfreeor)(void* mem);
typedef void (*lwreporter)(const char* fmt, va_list ap);
-extern lwreallocator lwrealloc_var;
-extern lwallocator lwalloc_var;
-extern lwfreeor lwfree_var;
-extern lwreporter lwerror_var;
-extern lwreporter lwnotice_var;
/**
-* Supply the memory management and error handling functions you want your
+* Install custom memory management and error handling functions you want your
* application to use.
* @ingroup system
+* @todo take a structure ?
*/
-extern void lwgeom_init_allocators(void);
-
-/**
-* Apply the default memory management (malloc() and free()) and error handlers.
-* Called inside lwgeom_init_allocators() generally.
-* @ingroup system
-*/
-extern void lwgeom_install_default_allocators(void);
+extern void lwgeom_set_handlers(lwallocator allocator,
+ lwreallocator reallocator, lwfreeor freeor, lwreporter errorreporter,
+ lwreporter noticereporter);
/**
* Write a notice out to the notice handler.
*/
void lwerror(const char *fmt, ...);
-/**
- * The default memory/logging handlers installed by
- * lwgeom_install_default_allocators()
- */
-void *default_allocator(size_t size);
-void *default_reallocator(void *mem, size_t size);
-void default_freeor(void *ptr);
-void default_errorreporter(const char *fmt, va_list ap);
-void default_noticereporter(const char *fmt, va_list ap);
+/* TODO: move these elsewhere */
extern int lw_vasprintf (char **result, const char *format, va_list args);
extern int lw_asprintf
#if __STDC__
#include "liblwgeom_internal.h"
#include "lwgeom_log.h"
-void *init_allocator(size_t size);
-void init_freeor(void *mem);
-void *init_reallocator(void *mem, size_t size);
-void init_noticereporter(const char *fmt, va_list ap);
-void init_errorreporter(const char *fmt, va_list ap);
-
-lwallocator lwalloc_var = init_allocator;
-lwreallocator lwrealloc_var = init_reallocator;
-lwfreeor lwfree_var = init_freeor;
-lwreporter lwnotice_var = init_noticereporter;
-lwreporter lwerror_var = init_errorreporter;
+/* Default allocators */
+static void * default_allocator(size_t size);
+static void default_freeor(void *mem);
+static void * default_reallocator(void *mem, size_t size);
+lwallocator lwalloc_var = default_allocator;
+lwreallocator lwrealloc_var = default_reallocator;
+lwfreeor lwfree_var = default_freeor;
+
+/* Default reporters */
+static void default_noticereporter(const char *fmt, va_list ap);
+static void default_errorreporter(const char *fmt, va_list ap);
+lwreporter lwnotice_var = default_noticereporter;
+lwreporter lwerror_var = default_errorreporter;
static char *lwgeomTypeName[] =
{
};
/*
- * lwnotice/lwerror handlers
+ * Default lwnotice/lwerror handlers
*
* Since variadic functions cannot pass their parameters directly, we need
* wrappers for these functions to convert the arguments into a va_list
va_end(ap);
}
-/*
- * Initialisation allocators
- *
- * These are used the first time any of the allocators are called
- * to enable executables/libraries that link into liblwgeom to
- * be able to set up their own allocators. This is mainly useful
- * for older PostgreSQL versions that don't have functions that
- * are called upon startup.
- */
-
-void *
-init_allocator(size_t size)
-{
- lwgeom_init_allocators();
-
- return lwalloc_var(size);
-}
-
-void
-init_freeor(void *mem)
-{
- lwgeom_init_allocators();
-
- lwfree_var(mem);
-}
-
-void *
-init_reallocator(void *mem, size_t size)
-{
- lwgeom_init_allocators();
-
- return lwrealloc_var(mem, size);
-}
-
-void
-init_noticereporter(const char *fmt, va_list ap)
-{
- lwgeom_init_allocators();
-
- (*lwnotice_var)(fmt, ap);
-}
-
-void
-init_errorreporter(const char *fmt, va_list ap)
-{
- lwgeom_init_allocators();
-
- (*lwerror_var)(fmt, ap);
-}
-
-
/*
* Default allocators
*
*
*/
-void *
+static void *
default_allocator(size_t size)
{
void *mem = malloc(size);
return mem;
}
-void
+static void
default_freeor(void *mem)
{
free(mem);
}
-void *
+static void *
default_reallocator(void *mem, size_t size)
{
void *ret = realloc(mem, size);
return ret;
}
-void
+static void
default_noticereporter(const char *fmt, va_list ap)
{
char *msg;
free(msg);
}
-void
+static void
default_errorreporter(const char *fmt, va_list ap)
{
char *msg;
exit(1);
}
-
-/*
- * This function should be called from lwgeom_init_allocators() by programs
- * which wish to use the default allocators above
+/**
+ * This function is called by programs which want to set up custom handling
+ * for memory management and error reporting
+ *
+ * Only non-NULL values change their respective handler
*/
+void
+lwgeom_set_handlers(lwallocator allocator, lwreallocator reallocator,
+ lwfreeor freeor, lwreporter errorreporter,
+ lwreporter noticereporter) {
-void lwgeom_install_default_allocators(void)
-{
- lwalloc_var = default_allocator;
- lwrealloc_var = default_reallocator;
- lwfree_var = default_freeor;
- lwerror_var = default_errorreporter;
- lwnotice_var = default_noticereporter;
-}
+ if ( allocator ) lwalloc_var = allocator;
+ if ( reallocator ) lwrealloc_var = reallocator;
+ if ( freeor ) lwfree_var = freeor;
+ if ( errorreporter ) lwerror_var = errorreporter;
+ if ( noticereporter ) lwnotice_var = noticereporter;
+}
const char*
lwtype_name(uint8_t type)
}
void
-lwgeom_init_allocators(void)
+pg_install_lwgeom_handlers(void)
{
- /* liblwgeom callback - install PostgreSQL handlers */
- lwalloc_var = pg_alloc;
- lwrealloc_var = pg_realloc;
- lwfree_var = pg_free;
- lwerror_var = pg_error;
- lwnotice_var = pg_notice;
+ /* install PostgreSQL handlers */
+ lwgeom_set_handlers(pg_alloc, pg_realloc, pg_free, pg_error, pg_notice);
}
/**
#include "liblwgeom.h"
#include "pgsql_compat.h"
-void *pg_alloc(size_t size);
-void *pg_realloc(void *ptr, size_t size);
-void pg_free(void *ptr);
-void pg_error(const char *msg, va_list vp);
-void pg_notice(const char *msg, va_list vp);
-
+/* Install PosgreSQL handlers for liblwgeom use */
+void pg_install_lwgeom_handlers(void);
/* Debugging macros */
#if POSTGIS_DEBUG_LEVEL > 0
#include <stdlib.h>
#include "shpcommon.h"
-#include "../liblwgeom/liblwgeom.h" /* for lwgeom_install_default_allocators */
-
-
-/* liblwgeom allocator callback - install the defaults (malloc/free/stdout/stderr) */
-void lwgeom_init_allocators()
-{
- lwgeom_install_default_allocators();
-}
/**
);
#endif
+ /* install PostgreSQL handlers */
+ pg_install_lwgeom_handlers();
}
/*
#include "ogr_srs_api.h"
#include <assert.h>
-/* This is needed by liblwgeom */
-void lwgeom_init_allocators(void) {
- lwgeom_install_default_allocators();
-}
-
static void
loader_rt_error_handler(const char *fmt, va_list ap) {
static const char *label = "ERROR: ";
#define MAX_INT_CHARLEN 32
/*
- * This is required for builds against pgsql
+ * This is required for builds against pgsql
*/
PG_MODULE_MAGIC;
+/*
+ * Module load callback
+ */
+void _PG_init(void);
+void
+_PG_init(void)
+{
+ /* Install liblwgeom handlers */
+ pg_install_lwgeom_handlers();
+
+ /* TODO: Install raster callbacks (see rt_init_allocators) */
+}
+
/***************************************************************
* Internal functions must be prefixed with rtpg_. This is
* keeping inline with the use of pgis_ for ./postgis C utility
/* ---------------------------------------------------------------- */
/* Memory allocation / error reporting hooks */
+/* TODO: reuse the ones in libpgcommon ? */
/* ---------------------------------------------------------------- */
static void *
return EXIT_SUCCESS;
}
-/* This is needed by liblwgeom */
-void
-lwgeom_init_allocators(void)
-{
- lwgeom_install_default_allocators();
-}
-
void rt_init_allocators(void)
{
return EXIT_SUCCESS;
}
-/* This is needed by liblwgeom */
-void
-lwgeom_init_allocators(void)
-{
- lwgeom_install_default_allocators();
-}
-
void rt_init_allocators(void)
{
rt_install_default_allocators();
#include "CUnit/Basic.h"
#include "cu_tester.h"
+/* Internal funcs */
+static void
+cu_error_reporter(const char *fmt, va_list ap);
+
/* ADD YOUR SUITE HERE (1 of 2) */
extern CU_SuiteInfo pixtype_suite;
extern CU_SuiteInfo raster_basics_suite;
int num_run;
int num_failed;
+ /* install the custom error handler */
+ lwgeom_set_handlers(0, 0, 0, cu_error_reporter, 0);
+
/* initialize the CUnit test registry */
if (CUE_SUCCESS != CU_initialize_registry())
{
return band;
}
-void lwgeom_init_allocators(void) {
- lwalloc_var = default_allocator;
- lwrealloc_var = default_reallocator;
- lwfree_var = default_freeor;
- lwnotice_var = default_noticereporter;
- lwerror_var = cu_error_reporter;
-}
-
void rt_init_allocators(void) {
rt_set_handlers(
default_rt_allocator,