[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60625] trunk/blender: Move guarded objetc allocation to a guardedalloc header

Sergey Sharybin sergey.vfx at gmail.com
Wed Oct 9 10:46:03 CEST 2013


Revision: 60625
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60625
Author:   nazgul
Date:     2013-10-09 08:46:02 +0000 (Wed, 09 Oct 2013)
Log Message:
-----------
Move guarded objetc allocation to a guardedalloc header

Also made libmv-capi use guarded objetc allocation.
Run into some suspecious cases when it was not so
clear whether memory is being freed or not.

Now we'll know for sure whether there're leaks or not :)

Having this macros in a guardedalloc header helps
using them in other areas (for now it's OCIO and libmv,
but in the future it'll be more places).

Modified Paths:
--------------
    trunk/blender/extern/libmv/CMakeLists.txt
    trunk/blender/extern/libmv/SConscript
    trunk/blender/extern/libmv/bundle.sh
    trunk/blender/extern/libmv/libmv-capi.cc
    trunk/blender/intern/guardedalloc/MEM_guardedalloc.h
    trunk/blender/intern/opencolorio/ocio_impl.cc

Modified: trunk/blender/extern/libmv/CMakeLists.txt
===================================================================
--- trunk/blender/extern/libmv/CMakeLists.txt	2013-10-09 05:59:35 UTC (rev 60624)
+++ trunk/blender/extern/libmv/CMakeLists.txt	2013-10-09 08:46:02 UTC (rev 60625)
@@ -37,10 +37,13 @@
 if(WITH_LIBMV)
 	add_definitions(
 		-DWITH_LIBMV
+		-DWITH_LIBMV_GUARDED_ALLOC
+		-DGOOGLE_GLOG_DLL_DECL=
 	)
 
 	list(APPEND INC
 		third_party/ceres/include
+		../../intern/guardedalloc
 	)
 
 	set(INC_SYS
@@ -224,10 +227,6 @@
 			third_party/glog/src
 		)
 	endif()
-
-	add_definitions(
-		-DGOOGLE_GLOG_DLL_DECL=
-	)
 else()
 	list(APPEND SRC
 		libmv-capi_stub.cc

Modified: trunk/blender/extern/libmv/SConscript
===================================================================
--- trunk/blender/extern/libmv/SConscript	2013-10-09 05:59:35 UTC (rev 60624)
+++ trunk/blender/extern/libmv/SConscript	2013-10-09 08:46:02 UTC (rev 60625)
@@ -15,6 +15,7 @@
 if env['WITH_BF_LIBMV']:
     defs.append('GOOGLE_GLOG_DLL_DECL=')
     defs.append('WITH_LIBMV')
+    defs.append('WITH_LIBMV_GUARDED_ALLOC')
 
     src = env.Glob("libmv-capi.cc")
     src += env.Glob('libmv/image/*.cc')
@@ -25,7 +26,7 @@
     src += env.Glob('third_party/fast/*.c')
     src += env.Glob('third_party/gflags/*.cc')
 
-    incs += ' ../Eigen3 third_party/ceres/include'
+    incs += ' ../Eigen3 third_party/ceres/include ../../intern/guardedalloc'
     incs += ' ' + env['BF_PNG_INC']
     incs += ' ' + env['BF_ZLIB_INC']
 

Modified: trunk/blender/extern/libmv/bundle.sh
===================================================================
--- trunk/blender/extern/libmv/bundle.sh	2013-10-09 05:59:35 UTC (rev 60624)
+++ trunk/blender/extern/libmv/bundle.sh	2013-10-09 08:46:02 UTC (rev 60625)
@@ -133,6 +133,8 @@
 if(WITH_LIBMV)
 	add_definitions(
 		-DWITH_LIBMV
+		-DWITH_LIBMV_GUARDED_ALLOC
+		-DGOOGLE_GLOG_DLL_DECL=
 	)
 
 	list(APPEND INC
@@ -203,10 +205,6 @@
 			third_party/glog/src
 		)
 	endif()
-
-	add_definitions(
-		-DGOOGLE_GLOG_DLL_DECL=
-	)
 else()
 	list(APPEND SRC
 		libmv-capi_stub.cc
@@ -238,11 +236,12 @@
 if env['WITH_BF_LIBMV']:
     defs.append('GOOGLE_GLOG_DLL_DECL=')
     defs.append('WITH_LIBMV')
+    defs.append('WITH_LIBMV_GUARDED_ALLOC')
 
     src = env.Glob("libmv-capi.cc")
 $src
 
-    incs += ' ../Eigen3 third_party/ceres/include'
+    incs += ' ../Eigen3 third_party/ceres/include ../../intern/guardedalloc'
     incs += ' ' + env['BF_PNG_INC']
     incs += ' ' + env['BF_ZLIB_INC']
 

Modified: trunk/blender/extern/libmv/libmv-capi.cc
===================================================================
--- trunk/blender/extern/libmv/libmv-capi.cc	2013-10-09 05:59:35 UTC (rev 60624)
+++ trunk/blender/extern/libmv/libmv-capi.cc	2013-10-09 08:46:02 UTC (rev 60625)
@@ -43,10 +43,36 @@
 #  include <png.h>
 #endif
 
+#ifdef WITH_LIBMV_GUARDED_ALLOC
+#  include "MEM_guardedalloc.h"
+#  define LIBMV_OBJECT_NEW OBJECT_GUARDED_NEW
+#  define LIBMV_OBJECT_DELETE OBJECT_GUARDED_DELETE
+#  define LIBMV_OBJECT_DELETE OBJECT_GUARDED_DELETE
+#  define LIBMV_OBJECT_DELETE_ARRAY OBJECT_GUARDED_DELETE_ARRAY
+#else
+// Need this to keep libmv-capi potentially standalone.
+#  if defined __GNUC__ || defined __sun
+#    define LIBMV_OBJECT_NEW(type, args ...) \
+	new(malloc(sizeof(type))) type(args)
+#  else
+#    define LIBMV_OBJECT_NEW(type, ...) \
+	new(malloc(sizeof(type))) type(__VA_ARGS__)
+#endif
+#  define LIBMV_OBJECT_DELETE(what, type) \
+	{ if(what) { \
+			((type*)(what))->~type(); \
+			free(what); \
+	} } (void)0
+#define LIBMV_OBJECT_DELETE_ARRAY(what, type, count) \
+	{ if(what) { \
+			for (int i = 0; i < count; i++) ((type*)(what))[i].~type(); \
+			free(what); \
+	} } (void)0
+#endif
+
 #include "libmv/logging/logging.h"
-
+#include "libmv/multiview/homography.h"
 #include "libmv/tracking/track_region.h"
-
 #include "libmv/simple_pipeline/callbacks.h"
 #include "libmv/simple_pipeline/tracks.h"
 #include "libmv/simple_pipeline/initialize_reconstruction.h"
@@ -58,8 +84,6 @@
 #include "libmv/simple_pipeline/reconstruction_scale.h"
 #include "libmv/simple_pipeline/keyframe_selection.h"
 
-#include "libmv/multiview/homography.h"
-
 #ifdef _MSC_VER
 #  define snprintf _snprintf
 #endif
@@ -388,14 +412,15 @@
 
 struct libmv_Tracks *libmv_tracksNew(void)
 {
-	libmv::Tracks *libmv_tracks = new libmv::Tracks();
+	libmv::Tracks *libmv_tracks = LIBMV_OBJECT_NEW(libmv::Tracks);
 
 	return (struct libmv_Tracks *)libmv_tracks;
 }
 
 void libmv_tracksDestroy(struct libmv_Tracks *libmv_tracks)
 {
-	delete (libmv::Tracks*) libmv_tracks;
+	using libmv::Tracks;
+	LIBMV_OBJECT_DELETE(libmv_tracks, Tracks);
 }
 
 void libmv_tracksInsert(struct libmv_Tracks *libmv_tracks, int image, int track, double x, double y)
@@ -578,7 +603,7 @@
 		reconstruct_progress_update_cb progress_update_callback,
 		void *callback_customdata)
 {
-	struct libmv_Reconstruction *libmv_reconstruction = new libmv_Reconstruction();
+	struct libmv_Reconstruction *libmv_reconstruction = LIBMV_OBJECT_NEW(libmv_Reconstruction);
 
 	libmv::Tracks &tracks = *((libmv::Tracks *) libmv_tracks);
 	libmv::EuclideanReconstruction &reconstruction = libmv_reconstruction->reconstruction;
@@ -660,7 +685,7 @@
 		reconstruct_progress_update_cb progress_update_callback,
 		void *callback_customdata)
 {
-	struct libmv_Reconstruction *libmv_reconstruction = new libmv_Reconstruction();
+	struct libmv_Reconstruction *libmv_reconstruction = LIBMV_OBJECT_NEW(libmv_Reconstruction);
 
 	libmv::Tracks &tracks = *((libmv::Tracks *) libmv_tracks);
 	libmv::EuclideanReconstruction &reconstruction = libmv_reconstruction->reconstruction;
@@ -703,7 +728,7 @@
 
 void libmv_reconstructionDestroy(struct libmv_Reconstruction *libmv_reconstruction)
 {
-	delete libmv_reconstruction;
+	LIBMV_OBJECT_DELETE(libmv_reconstruction, libmv_Reconstruction);
 }
 
 int libmv_reprojectionPointForTrack(const struct libmv_Reconstruction *libmv_reconstruction, int track, double pos[3])
@@ -850,7 +875,7 @@
 {
 	libmv::Feature *features = NULL;
 	std::vector<libmv::Feature> v;
-	struct libmv_Features *libmv_features = new libmv_Features();
+	struct libmv_Features *libmv_features = LIBMV_OBJECT_NEW(libmv_Features);
 	int i = 0, count;
 
 	if (margin) {
@@ -864,7 +889,7 @@
 	count = v.size();
 
 	if (count) {
-		features = new libmv::Feature[count];
+		features = LIBMV_OBJECT_NEW(libmv::Feature[count]);
 
 		for(std::vector<libmv::Feature>::iterator it = v.begin(); it != v.end(); it++) {
 			features[i++] = *it;
@@ -883,7 +908,7 @@
                                                    int margin, int count, int min_distance)
 {
 	libmv::Feature *features = NULL;
-	struct libmv_Features *libmv_features = new libmv_Features;
+	struct libmv_Features *libmv_features = LIBMV_OBJECT_NEW(libmv_Features);
 
 	if (count) {
 		if (margin) {
@@ -892,7 +917,7 @@
 			height -= 2 * margin;
 		}
 
-		features = new libmv::Feature[count];
+		features = LIBMV_OBJECT_NEW(libmv::Feature[count]);
 		libmv::DetectMORAVEC(data, stride, width, height, features, &count, min_distance, NULL);
 	}
 
@@ -905,10 +930,12 @@
 
 void libmv_featuresDestroy(struct libmv_Features *libmv_features)
 {
-	if (libmv_features->features)
-		delete [] libmv_features->features;
+	if (libmv_features->features) {
+		using libmv::Feature;
+		LIBMV_OBJECT_DELETE_ARRAY(libmv_features->features, Feature, libmv_features->count);
+	}
 
-	delete libmv_features;
+	LIBMV_OBJECT_DELETE(libmv_features, libmv_Features);
 }
 
 int libmv_countFeatures(const struct libmv_Features *libmv_features)
@@ -930,14 +957,14 @@
 
 struct libmv_CameraIntrinsics *libmv_cameraIntrinsicsNewEmpty(void)
 {
-	libmv::CameraIntrinsics *camera_intrinsics = new libmv::CameraIntrinsics();
+	libmv::CameraIntrinsics *camera_intrinsics = LIBMV_OBJECT_NEW(libmv::CameraIntrinsics);
 
 	return (struct libmv_CameraIntrinsics *) camera_intrinsics;
 }
 
 struct libmv_CameraIntrinsics *libmv_cameraIntrinsicsNew(const libmv_CameraIntrinsicsOptions *libmv_camera_intrinsics_options)
 {
-	libmv::CameraIntrinsics *camera_intrinsics = new libmv::CameraIntrinsics();
+	libmv::CameraIntrinsics *camera_intrinsics = LIBMV_OBJECT_NEW(libmv::CameraIntrinsics);
 
 	cameraIntrinsicsFromOptions(libmv_camera_intrinsics_options, camera_intrinsics);
 
@@ -947,16 +974,15 @@
 struct libmv_CameraIntrinsics *libmv_cameraIntrinsicsCopy(const libmv_CameraIntrinsics *libmvIntrinsics)
 {
 	libmv::CameraIntrinsics *orig_intrinsics = (libmv::CameraIntrinsics *) libmvIntrinsics;
-	libmv::CameraIntrinsics *new_intrinsics = new libmv::CameraIntrinsics(*orig_intrinsics);
+	libmv::CameraIntrinsics *new_intrinsics = LIBMV_OBJECT_NEW(libmv::CameraIntrinsics, *orig_intrinsics);
 
 	return (struct libmv_CameraIntrinsics *) new_intrinsics;
 }
 
 void libmv_cameraIntrinsicsDestroy(struct libmv_CameraIntrinsics *libmvIntrinsics)
 {
-	libmv::CameraIntrinsics *intrinsics = (libmv::CameraIntrinsics *) libmvIntrinsics;
-
-	delete intrinsics;
+	using libmv::CameraIntrinsics;
+	LIBMV_OBJECT_DELETE(libmvIntrinsics, CameraIntrinsics);
 }
 
 void libmv_cameraIntrinsicsUpdate(const libmv_CameraIntrinsicsOptions *libmv_camera_intrinsics_options,

Modified: trunk/blender/intern/guardedalloc/MEM_guardedalloc.h
===================================================================
--- trunk/blender/intern/guardedalloc/MEM_guardedalloc.h	2013-10-09 05:59:35 UTC (rev 60624)
+++ trunk/blender/intern/guardedalloc/MEM_guardedalloc.h	2013-10-09 08:46:02 UTC (rev 60625)
@@ -244,6 +244,24 @@
 			MEM_freeN(mem);                                                   \
 	}                                                                         \
 
+#if defined __GNUC__ || defined __sun
+#  define OBJECT_GUARDED_NEW(type, args ...) \
+	new(MEM_mallocN(sizeof(type), __func__)) type(args)
+#else
+#  define OBJECT_GUARDED_NEW(type, ...) \
+	new(MEM_mallocN(sizeof(type), __FUNCTION__)) type(__VA_ARGS__)
+#endif
+#define OBJECT_GUARDED_DELETE(what, type) \
+	{ if(what) { \
+			((type*)(what))->~type(); \
+			MEM_freeN(what); \
+	} } (void)0
+#define OBJECT_GUARDED_DELETE_ARRAY(what, type, count) \
+	{ if(what) { \
+			for (int i = 0; i < count; i++) ((type*)(what))[i].~type(); \
+			MEM_freeN(what); \
+	} } (void)0
+
 #endif  /* __cplusplus */
 
 #ifdef __cplusplus

Modified: trunk/blender/intern/opencolorio/ocio_impl.cc
===================================================================
--- trunk/blender/intern/opencolorio/ocio_impl.cc	2013-10-09 05:59:35 UTC (rev 60624)

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list