From df40bd59509b30e24353946e89e90bbf9790cafa Mon Sep 17 00:00:00 2001
From: Thomas Grill <xovo@users.sourceforge.net>
Date: Sat, 29 Nov 2003 03:41:26 +0000
Subject:  ""

svn path=/trunk/; revision=1201
---
 externals/grill/flext/changes.txt          |  1 -
 externals/grill/flext/flext.vcproj         | 20 +++++++++-
 externals/grill/flext/source/flbuf.cpp     |  4 +-
 externals/grill/flext/source/fldsp.cpp     |  2 -
 externals/grill/flext/source/flsupport.cpp | 59 +++++++++++++++++++++++-------
 externals/grill/flext/source/flsupport.h   | 18 ++++-----
 6 files changed, 75 insertions(+), 29 deletions(-)

(limited to 'externals/grill/flext')

diff --git a/externals/grill/flext/changes.txt b/externals/grill/flext/changes.txt
index ed9aaa44..84ebac86 100644
--- a/externals/grill/flext/changes.txt
+++ b/externals/grill/flext/changes.txt
@@ -30,7 +30,6 @@ Version history:
 - ListAttributes (or the getattributes message) now lists attributes in the order they were created (first class, then object scope)
 - enforcing usage of STL
 - explicit boolean attributes (great for attribute editor layout!)
-- added flext::NewLarge and flext::FreeLarge memory allocation functions which use the C-Library heap and should mainly be used in secondary threads
 - flext_dsp reported wrong inlet/outlet count (CntInSig, CntOutSig functions)
 - added support for patcher arguments for attributes (use # instead of $ to save them with a patch)
 - moved memory functions and console output from flext to super-base-class flext_root and derived all helper classes from that
diff --git a/externals/grill/flext/flext.vcproj b/externals/grill/flext/flext.vcproj
index 659a37ec..9dc85a0c 100644
--- a/externals/grill/flext/flext.vcproj
+++ b/externals/grill/flext/flext.vcproj
@@ -514,6 +514,7 @@ copy F:\prog\max\flext\pd-msvc\flext.dll f:\prog\dll
 				AdditionalIncludeDirectories="F:\prog\audio\MaxWinSDK\c74support\max-includes,F:\prog\audio\MaxWinSDK\c74support\msp-includes,f:\prog\packs\pthreads,f:\prog\audio\sndobj\include,f:\prog\audio\stk\include"
 				PreprocessorDefinitions="WIN32;_LIB;FLEXT_SYS_MAX;FLEXT_THREADS;FLEXT_USE_SIMD;FLEXT_SHARED;FLEXT_EXPORTS"
 				StringPooling="TRUE"
+				ExceptionHandling="TRUE"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="1"
 				RuntimeTypeInfo="TRUE"
@@ -528,9 +529,10 @@ copy F:\prog\max\flext\pd-msvc\flext.dll f:\prog\dll
 				Name="VCCustomBuildTool"/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="maxapi.lib maxext.lib maxaudio.lib  pthreadVC.lib stk.lib sndobj.lib"
+				AdditionalDependencies="maxapi.lib maxext.lib maxaudio.lib  stk.lib sndobj.lib"
 				OutputFile=".\max-msvc\flext.max.dll"
 				AdditionalLibraryDirectories="&quot;F:\prog\audio\MaxWinSDK\c74support\max-includes\win-includes\debug&quot;;&quot;F:\prog\audio\MaxWinSDK\c74support\msp-includes\win-includes\debug&quot;;f:\prog\packs\pthreads;F:\prog\audio\stk\lib;F:\prog\audio\sndobj\lib"
+				IgnoreAllDefaultLibraries="TRUE"
 				GenerateDebugInformation="FALSE"
 				OptimizeReferences="1"
 				ImportLibrary="./max-msvc/flext_l.lib"/>
@@ -4441,6 +4443,22 @@ copy F:\prog\max\flext\max-msvc\flext.max.dll f:\prog\dll
 				RelativePath="source\fldefs_setup.h">
 			</File>
 		</Filter>
+		<Filter
+			Name="build"
+			Filter="">
+			<File
+				RelativePath=".\build-max-msvc.bat">
+			</File>
+			<File
+				RelativePath=".\build-pd-msvc.bat">
+			</File>
+			<File
+				RelativePath=".\config-max-msvc.txt">
+			</File>
+			<File
+				RelativePath=".\config-pd-msvc.txt">
+			</File>
+		</Filter>
 	</Files>
 	<Globals>
 	</Globals>
diff --git a/externals/grill/flext/source/flbuf.cpp b/externals/grill/flext/source/flbuf.cpp
index e9c02a00..46eb7f4f 100644
--- a/externals/grill/flext/source/flbuf.cpp
+++ b/externals/grill/flext/source/flbuf.cpp
@@ -194,7 +194,7 @@ void flext::buffer::Frames(int fr,bool keep,bool zero)
 
 	if(keep) {
 		// copy buffer data to tmp storage
-		tmp = new t_sample[sz];
+        tmp = (t_sample *)NewAligned(sz*sizeof(t_sample));
         if(tmp)
 			CopySamples(tmp,data,sz);
 		else
@@ -215,7 +215,7 @@ void flext::buffer::Frames(int fr,bool keep,bool zero)
 	if(tmp) {
 		// copy data back
 		CopySamples(data,tmp,sz);
-		delete[] tmp;
+		FreeAligned(tmp);
         if(zero && sz < fr) ZeroSamples(data+sz,fr-sz);
 	}
     else
diff --git a/externals/grill/flext/source/fldsp.cpp b/externals/grill/flext/source/fldsp.cpp
index c5d6ea22..b8dce7ca 100644
--- a/externals/grill/flext/source/fldsp.cpp
+++ b/externals/grill/flext/source/fldsp.cpp
@@ -16,8 +16,6 @@ WARRANTIES, see the file, "license.txt," in this distribution.
 #include "flinternal.h"
 #include <string.h>
 
-
-
 // === flext_dsp ==============================================
 
 #if FLEXT_SYS == FLEXT_SYS_JMAX
diff --git a/externals/grill/flext/source/flsupport.cpp b/externals/grill/flext/source/flsupport.cpp
index f8c6fac2..a77726ae 100644
--- a/externals/grill/flext/source/flsupport.cpp
+++ b/externals/grill/flext/source/flsupport.cpp
@@ -88,20 +88,26 @@ void flext::Setup()
 //
 /////////////////////////////////////////////////////////
 
+#define LARGEALLOC 32000
+
 void *flext_root::operator new(size_t bytes)
 {
 	bytes += sizeof(size_t);
 
-#ifdef FLEXT_DEBUG
-	if(bytes > 32000)
-		post("flext - warning: excessive memory allocation of %i bytes",bytes);
-#endif
+    char *blk;
+    if(bytes >= LARGEALLOC) {
+        // use C library function for large memory blocks
+        blk = (char *)::operator new(bytes);
+    }
+    else {
+	//! \todo We need system locking here for secondary threads!
 
 #if FLEXT_SYS == FLEXT_SYS_JMAX
-	char *blk = (char *)::fts_malloc(bytes);
+    	blk = (char *)::fts_malloc(bytes);
 #else
-	char *blk = (char *)::getbytes(bytes);
+	    blk = (char *)::getbytes(bytes);
 #endif
+    }
 
 	*(size_t *)blk = bytes;
 	return blk+sizeof(size_t);
@@ -110,13 +116,21 @@ void *flext_root::operator new(size_t bytes)
 void flext_root::operator delete(void *blk)
 {
 	char *ori = (char *)blk-sizeof(size_t);
+	size_t bytes = *(size_t *)ori;
+
+    if(bytes >= LARGEALLOC) {
+        // use C library function for large memory blocks
+        ::operator delete(ori);
+    }
+    else {
+	//! \todo We need system locking here for secondary threads!
 
 #if FLEXT_SYS == FLEXT_SYS_JMAX
-	fts_free(ori);
+    	fts_free(ori);
 #else
-	size_t bytes = *(size_t *)ori;
-	::freebytes(ori,bytes);
+	    ::freebytes(ori,bytes);
 #endif
+    }
 }
 
 void *flext_root::NewAligned(size_t bytes,int bitalign)
@@ -125,11 +139,20 @@ void *flext_root::NewAligned(size_t bytes,int bitalign)
 	const unsigned long alignovh = bitalign/8-1;
 	bytes += ovh+alignovh;
 
+    char *blk;
+    if(bytes >= LARGEALLOC) {
+        // use C library function for large memory blocks
+        blk = (char *)::operator new(bytes);
+    }
+    else {
+	//! \todo We need system locking here for secondary threads!
+
 #if FLEXT_SYS == FLEXT_SYS_JMAX
-	char *blk = (char *)::fts_malloc(bytes);
+    	blk = (char *)::fts_malloc(bytes);
 #else
-	char *blk = (char *)::getbytes(bytes);
+	    blk = (char *)::getbytes(bytes);
 #endif
+    }
 
 	char *ablk = reinterpret_cast<char *>((reinterpret_cast<unsigned long>(blk)+ovh+alignovh) & ~alignovh);
 	*(char **)(ablk-sizeof(size_t)-sizeof(char *)) = blk;
@@ -140,13 +163,21 @@ void *flext_root::NewAligned(size_t bytes,int bitalign)
 void flext_root::FreeAligned(void *blk)
 {
 	char *ori = *(char **)((char *)blk-sizeof(size_t)-sizeof(char *));
+	size_t bytes = *(size_t *)((char *)blk-sizeof(size_t));
+
+    if(bytes >= LARGEALLOC) {
+        // use C library function for large memory blocks
+        ::operator delete(ori);
+    }
+    else {
+	//! \todo We need system locking here for secondary threads!
 
 #if FLEXT_SYS == FLEXT_SYS_JMAX
-	fts_free(ori);
+    	fts_free(ori);
 #else
-	size_t bytes = *(size_t *)((char *)blk-sizeof(size_t));
-	::freebytes(ori,bytes);
+	    ::freebytes(ori,bytes);
 #endif
+    }
 }
 
 // ------------------------------------------
diff --git a/externals/grill/flext/source/flsupport.h b/externals/grill/flext/source/flsupport.h
index e8328ea3..2541e243 100644
--- a/externals/grill/flext/source/flsupport.h
+++ b/externals/grill/flext/source/flsupport.h
@@ -54,13 +54,6 @@ public:
 		void operator delete[](void *blk) { operator delete(blk); }
 		#endif
 
-		/*! Get a large memory block
-			the normal C library function is used here
-		*/
-		static void *NewLarge(size_t bytes) { return ::operator new(bytes); }
-		//! Free a large memory block
-		static void FreeLarge(void *blk) { ::operator delete(blk); }
-
 		//! Get an aligned memory block
 		static void *NewAligned(size_t bytes,int bitalign = 128);
 		//! Free an aligned memory block
@@ -69,11 +62,18 @@ public:
 		static bool IsAligned(void *ptr,int bitalign = 128)	{ 
             return (reinterpret_cast<unsigned long>(ptr)&(bitalign-1)) == 0; 
         }
-		
 	//!	@}  FLEXT_S_MEMORY  	
-
 };
 
+// define global new/delete operators
+inline void *operator new(size_t bytes) { return flext_root::operator new(bytes); }
+inline void operator delete(void *blk) { flext_root::operator delete(blk); }
+#ifndef __MRC__ // doesn't allow new[] overloading?!
+inline void *operator new[](size_t bytes) { return flext_root::operator new[](bytes); }
+inline void operator delete[](void *blk) { flext_root::operator delete[](blk); }
+#endif
+
+
 
 class FLEXT_SHARE FLEXT_CLASSDEF(flext);
 typedef class FLEXT_CLASSDEF(flext) flext;
-- 
cgit v1.2.1