From a3faba1727a741fa43d4ad2a7b43cf93dcc1cadf Mon Sep 17 00:00:00 2001 From: Justin Berger Date: Thu, 15 Mar 2018 16:26:11 -0600 Subject: Cleaned up memory leaks --- src/epnp/epnp.h | 1 + src/epnp/opencv_shim.c | 53 +++++++++++++++----------------------------------- src/poser_epnp.c | 4 ++++ src/survive.c | 7 ++++++- src/survive_playback.c | 29 +++++++++++++-------------- 5 files changed, 41 insertions(+), 53 deletions(-) (limited to 'src') diff --git a/src/epnp/epnp.h b/src/epnp/epnp.h index 9ca3a2e..0a42b04 100644 --- a/src/epnp/epnp.h +++ b/src/epnp/epnp.h @@ -46,6 +46,7 @@ typedef struct { double cws_determinant; } epnp; +void epnp_dtor(epnp *self); void epnp_set_internal_parameters(epnp *self, double uc, double vc, double fu, double fv); void epnp_set_maximum_number_of_correspondences(epnp *self, int n); void epnp_reset_correspondences(epnp *self); diff --git a/src/epnp/opencv_shim.c b/src/epnp/opencv_shim.c index d7886d0..df2765b 100644 --- a/src/epnp/opencv_shim.c +++ b/src/epnp/opencv_shim.c @@ -28,29 +28,7 @@ const int CV_64F = 0; typedef double doublereal; #define F77_FUNC(func) func##_ -/* -extern int F77_FUNC(dgetrs)(char *trans, int *n, int *nrhs, double *a, int *lda, int *ipiv, double *b, int *ldb, int -*info); - -extern int F77_FUNC(dgetri)(int *n, double *a, int *lda, int *ipiv, double *work, int *lwork, int *info); -extern int F77_FUNC(dgetrf)(int *m, int *n, double *a, int *lda, int *ipiv, int *info); /* blocked LU - -extern int F77_FUNC(dgesvd)(char *jobu, char *jobvt, - int *m, int *n, - double *a, int *lda, double *s, double *u, int *ldu, - double *vt, int *ldvt, double *work, int *lwork, - int *info); - -extern int F77_FUNC(dgesdd)(char *jobz, - int *m, int *n, double *a, int *lda, - double *s, double *u, int *ldu, double *vt, int *ldvt, - double *work, int *lwork, int *iwork, int *info); - -extern int dgemm_(char *transa, char *transb, lapack_lapack_int *m, lapack_lapack_int * - n, lapack_lapack_int *k, double *alpha, double *a, lapack_lapack_int *lda, - double *b, lapack_lapack_int *ldb, double *beta, double *c, lapack_lapack_int - *ldc); -*/ + void cvGEMM(const CvMat *src1, const CvMat *src2, double alpha, const CvMat *src3, double beta, CvMat *dst, int tABC) { lapack_int rows1 = src1->rows; lapack_int cols1 = src1->cols; @@ -85,7 +63,7 @@ void cvMulTransposed(const CvMat *src, CvMat *dst, int order, const CvMat *delta lapack_int drows = dst->rows; assert(drows == cols); assert(order == 1 ? (dst->cols == src->cols) : (dst->cols == src->rows)); - assert(delta == 0); // THIS ISN'T IMPLEMENTED YET + assert(delta == 0 && "This isn't implemented yet"); double beta = 0; bool isAT = order == 1; @@ -93,16 +71,12 @@ void cvMulTransposed(const CvMat *src, CvMat *dst, int order, const CvMat *delta lapack_int dstCols = dst->cols; - cblas_dgemm(CblasRowMajor, isAT ? CblasTrans : CblasNoTrans, isBT ? CblasTrans : CblasNoTrans, - cols, // isAT ? cols : rows, - dstCols, - rows, // isAT ? rows : cols, + cblas_dgemm(CblasRowMajor, isAT ? CblasTrans : CblasNoTrans, isBT ? CblasTrans : CblasNoTrans, cols, dstCols, rows, scale, src->data.db, cols, src->data.db, cols, beta, dst->data.db, dstCols); - // const CvMat* delta, double scale } void *cvAlloc(size_t size) { return malloc(size); } @@ -242,14 +216,15 @@ double cvInvert(const CvMat *srcarr, CvMat *dstarr, int method) { free(ipiv); } else if (method == DECOMP_SVD) { - + // TODO: There is no way this needs this many allocations, + // but in my defense I was very tired when I wrote this code CvMat *w = cvCreateMat(1, MIN(dstarr->rows, dstarr->cols), dstarr->type); CvMat *u = cvCreateMat(dstarr->cols, dstarr->cols, dstarr->type); CvMat *v = cvCreateMat(dstarr->rows, dstarr->rows, dstarr->type); - cvSVD(dstarr, w, u, v, 0); - CvMat *um = cvCreateMat(w->cols, w->cols, w->type); + cvSVD(dstarr, w, u, v, 0); + cvSetZero(um); for (int i = 0; i < w->cols; i++) { cvmSet(um, i, i, 1. / w->data.db[i]); @@ -258,6 +233,12 @@ double cvInvert(const CvMat *srcarr, CvMat *dstarr, int method) { CvMat *tmp = cvCreateMat(dstarr->cols, dstarr->rows, dstarr->type); cvGEMM(v, um, 1, 0, 0, tmp, GEMM_1_T); cvGEMM(tmp, u, 1, 0, 0, dstarr, GEMM_2_T); + + cvReleaseMat(&tmp); + cvReleaseMat(&w); + cvReleaseMat(&u); + cvReleaseMat(&v); + cvReleaseMat(&um); } return 0; } @@ -333,11 +314,9 @@ int cvSolve(const CvMat *Aarr, const CvMat *xarr, CvMat *Barr, int method) { assert(Barr->cols == xCpy->cols); xCpy->rows = acols; cvCopyTo(xCpy, Barr); -/* -Barr->data = xCpy->data; -Barr->rows = acols; -Barr->cols = xCpy->cols; -*/ + + cvReleaseMat(&aCpy); + cvReleaseMat(&xCpy); #ifdef DEBUG_PRINT print_mat(Barr); #endif diff --git a/src/poser_epnp.c b/src/poser_epnp.c index 21e61ae..7749c7b 100644 --- a/src/poser_epnp.c +++ b/src/poser_epnp.c @@ -85,6 +85,8 @@ static int opencv_solver_fullscene(SurviveObject *so, PoserDataFullScene *pdfs) SurvivePose lighthouse = solve_correspondence(so, &pnp, true); PoserData_lighthouse_pose_func(&pdfs->hdr, so, lh, &lighthouse); + + epnp_dtor(&pnp); } return 0; } @@ -137,6 +139,8 @@ int PoserEPNP(SurviveObject *so, PoserData *pd) { quatrotateabout(txPose.Rot, so->ctx->bsd[lh].Pose.Rot, pose.Rot); PoserData_poser_raw_pose_func(pd, so, lh, &txPose); } + + epnp_dtor(&pnp); } return 0; diff --git a/src/survive.c b/src/survive.c index e09ae13..a27ba3e 100755 --- a/src/survive.c +++ b/src/survive.c @@ -340,7 +340,8 @@ void survive_close( SurviveContext * ctx ) { PoserData pd; pd.pt = POSERDATA_DISASSOCIATE; - if( ctx->objs[i]->PoserFn ) ctx->objs[i]->PoserFn( ctx->objs[i], &pd ); + if (ctx->objs[i]->PoserFn) + ctx->objs[i]->PoserFn(ctx->objs[i], &pd); } for( i = 0; i < oldct; i++ ) @@ -354,6 +355,10 @@ void survive_close( SurviveContext * ctx ) destroy_config_group(ctx->global_config_values); destroy_config_group(ctx->lh_config); + for (i = 0; i < ctx->objs_ct; i++) { + free(ctx->objs[i]); + } + free( ctx->objs ); free( ctx->drivers ); free( ctx->driverpolls ); diff --git a/src/survive_playback.c b/src/survive_playback.c index fe7af2b..c4564c4 100644 --- a/src/survive_playback.c +++ b/src/survive_playback.c @@ -160,6 +160,7 @@ static int playback_close(struct SurviveContext *ctx, void *_driver) { if (driver->playback_file) fclose(driver->playback_file); driver->playback_file = 0; + return 0; } @@ -184,7 +185,11 @@ static int LoadConfig(SurvivePlaybackData *sv, SurviveObject *so) { ct0conf[len] = 0; printf("Loading config: %d\n", len); - return survive_load_htc_config_format(ct0conf, len, so); + int rtn = survive_load_htc_config_format(ct0conf, len, so); + + free(ct0conf); + + return rtn; } int DriverRegPlayback(SurviveContext *ctx) { @@ -217,20 +222,14 @@ int DriverRegPlayback(SurviveContext *ctx) { SurviveObject *tr0 = survive_create_tr0(ctx, "Playback", sp); SurviveObject *ww0 = survive_create_ww0(ctx, "Playback", sp); - if (!LoadConfig(sp, hmd)) { - survive_add_object(ctx, hmd); - } - if (!LoadConfig(sp, wm0)) { - survive_add_object(ctx, wm0); - } - if (!LoadConfig(sp, wm1)) { - survive_add_object(ctx, wm1); - } - if (!LoadConfig(sp, tr0)) { - survive_add_object(ctx, tr0); - } - if (!LoadConfig(sp, ww0)) { - survive_add_object(ctx, ww0); + SurviveObject *objs[] = {hmd, wm0, wm1, tr0, ww0, 0}; + + for (SurviveObject **obj = objs; *obj; obj++) { + if (!LoadConfig(sp, *obj)) { + survive_add_object(ctx, *obj); + } else { + free(*obj); + } } survive_add_driver(ctx, sp, playback_poll, playback_close, 0); -- cgit v1.2.3