fix: memory leak of geos
This commit is contained in:
parent
3dcd7ac371
commit
95fd9f1f6f
|
@ -21,7 +21,39 @@ static threadlocal TdThreadKey tlGeosCtxKey = 0;
|
||||||
static threadlocal SGeosContext tlGeosCtxObj = {0};
|
static threadlocal SGeosContext tlGeosCtxObj = {0};
|
||||||
static threadlocal SGeosContext *tlGeosCtx = NULL;
|
static threadlocal SGeosContext *tlGeosCtx = NULL;
|
||||||
|
|
||||||
static void destroyThreadLocalGeosCtx();
|
static void destroyThreadLocalGeosCtx(void *param) {
|
||||||
|
SGeosContext *tlGeosCtx = &tlGeosCtxObj;
|
||||||
|
if (tlGeosCtx->WKTReader) {
|
||||||
|
GEOSWKTReader_destroy_r(tlGeosCtx->handle, tlGeosCtx->WKTReader);
|
||||||
|
tlGeosCtx->WKTReader = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tlGeosCtx->WKTWriter) {
|
||||||
|
GEOSWKTWriter_destroy_r(tlGeosCtx->handle, tlGeosCtx->WKTWriter);
|
||||||
|
tlGeosCtx->WKTWriter = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tlGeosCtx->WKBReader) {
|
||||||
|
GEOSWKBReader_destroy_r(tlGeosCtx->handle, tlGeosCtx->WKBReader);
|
||||||
|
tlGeosCtx->WKBReader = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tlGeosCtx->WKBWriter) {
|
||||||
|
GEOSWKBWriter_destroy_r(tlGeosCtx->handle, tlGeosCtx->WKBWriter);
|
||||||
|
tlGeosCtx->WKBWriter = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tlGeosCtx->WKTRegex) {
|
||||||
|
destroyRegexes(tlGeosCtx->WKTRegex, tlGeosCtx->WKTMatchData);
|
||||||
|
tlGeosCtx->WKTRegex = NULL;
|
||||||
|
tlGeosCtx->WKTMatchData = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tlGeosCtx->handle) {
|
||||||
|
GEOS_finish_r(tlGeosCtx->handle);
|
||||||
|
tlGeosCtx->handle = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SGeosContext *acquireThreadLocalGeosCtx() { return tlGeosCtx; }
|
SGeosContext *acquireThreadLocalGeosCtx() { return tlGeosCtx; }
|
||||||
|
|
||||||
|
@ -59,37 +91,3 @@ _exit:
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *getGeosErrMsg(int32_t code) { return tlGeosCtx ? tlGeosCtx->errMsg : code ? strerror(code) : ""; }
|
const char *getGeosErrMsg(int32_t code) { return tlGeosCtx ? tlGeosCtx->errMsg : code ? strerror(code) : ""; }
|
||||||
|
|
||||||
static void destroyThreadLocalGeosCtx(void *param) {
|
|
||||||
SGeosContext *tlGeosCtx = &tlGeosCtxObj;
|
|
||||||
if (tlGeosCtx->WKTReader) {
|
|
||||||
GEOSWKTReader_destroy_r(tlGeosCtx->handle, tlGeosCtx->WKTReader);
|
|
||||||
tlGeosCtx->WKTReader = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tlGeosCtx->WKTWriter) {
|
|
||||||
GEOSWKTWriter_destroy_r(tlGeosCtx->handle, tlGeosCtx->WKTWriter);
|
|
||||||
tlGeosCtx->WKTWriter = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tlGeosCtx->WKBReader) {
|
|
||||||
GEOSWKBReader_destroy_r(tlGeosCtx->handle, tlGeosCtx->WKBReader);
|
|
||||||
tlGeosCtx->WKBReader = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tlGeosCtx->WKBWriter) {
|
|
||||||
GEOSWKBWriter_destroy_r(tlGeosCtx->handle, tlGeosCtx->WKBWriter);
|
|
||||||
tlGeosCtx->WKBWriter = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tlGeosCtx->WKTRegex) {
|
|
||||||
destroyRegexes(tlGeosCtx->WKTRegex, tlGeosCtx->WKTMatchData);
|
|
||||||
tlGeosCtx->WKTRegex = NULL;
|
|
||||||
tlGeosCtx->WKTMatchData = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tlGeosCtx->handle) {
|
|
||||||
GEOS_finish_r(tlGeosCtx->handle);
|
|
||||||
tlGeosCtx->handle = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue