aboutsummaryrefslogtreecommitdiff
path: root/externals/grill/flext
diff options
context:
space:
mode:
Diffstat (limited to 'externals/grill/flext')
-rw-r--r--externals/grill/flext/build.txt2
-rw-r--r--externals/grill/flext/changes.txt1
-rw-r--r--externals/grill/flext/flext.vcproj2
-rw-r--r--externals/grill/flext/source/flatom.cpp37
4 files changed, 34 insertions, 8 deletions
diff --git a/externals/grill/flext/build.txt b/externals/grill/flext/build.txt
index 92fdab7c..640b1c04 100644
--- a/externals/grill/flext/build.txt
+++ b/externals/grill/flext/build.txt
@@ -130,12 +130,14 @@ or
buildsys/config-mac-max-gcc.txt
+After editing the files you will have to run the build script again to ensure that flext is built.
After successfully building everything, you can install flext with (under Windows)
build pd msvc install
or (under unix)
bash build.sh pd gcc install
+
You will probably have to have superuser rights in order to install things
into the default location.
(try "sudo" or "su -c" prefixes, or log in as root)
diff --git a/externals/grill/flext/changes.txt b/externals/grill/flext/changes.txt
index 38320249..c2437720 100644
--- a/externals/grill/flext/changes.txt
+++ b/externals/grill/flext/changes.txt
@@ -26,6 +26,7 @@ Version history:
- fixing uninitialized pointer (first inlet pointer)
- added message bundle functionality (to send more messages over the thread boundary to arrive at the same logical time)
- fixed dangerous spot (also memory leak) with message queuing
+- fixed buggy freeing of memory for AtomListStatic
0.5.0:
- fixes for 64 bit builds (size_t is integer type of pointer size)
diff --git a/externals/grill/flext/flext.vcproj b/externals/grill/flext/flext.vcproj
index 3eaa1c6b..f8d6a3da 100644
--- a/externals/grill/flext/flext.vcproj
+++ b/externals/grill/flext/flext.vcproj
@@ -122,7 +122,7 @@
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="c:\data\prog\packs\pthreads\include;"c:\data\pd\pd-cvs\src";c:\data\prog\audio\sndobj\include;c:\data\prog\audio\stk\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_LIB;FLEXT_SYS_PD;FLEXT_THREADS;FLEXT_USE_SIMD;FLEXT_EXPORTS;xFLEXT_ATTRHIDE;xFLEXT_NOATTREDIT;_WIN32_WINNT=0x501"
+ PreprocessorDefinitions="WIN32;_DEBUG;_LIB;FLEXT_SYS_PD;FLEXT_THREADS;FLEXT_USE_SIMD;FLEXT_EXPORTS;xFLEXT_ATTRHIDE;xFLEXT_NOATTREDIT;_WIN32_WINNT=0x501;xFLEXT_USECMEM"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
RuntimeTypeInfo="TRUE"
diff --git a/externals/grill/flext/source/flatom.cpp b/externals/grill/flext/source/flatom.cpp
index 9f433222..b8853aca 100644
--- a/externals/grill/flext/source/flatom.cpp
+++ b/externals/grill/flext/source/flatom.cpp
@@ -61,19 +61,32 @@ void flext::CopyAtoms(int cnt,t_atom *dst,const t_atom *src)
void flext::AtomList::Alloc(int sz,int keepix,int keeplen,int keepto)
{
if(lst) {
- if(cnt == sz) return; // no change
+ if(cnt == sz) {
+ if(keepix != keepto) {
+ int c = keeplen >= 0?keeplen:cnt;
+ FLEXT_ASSERT(c+keepto <= cnt);
+ FLEXT_ASSERT(c+keepix <= cnt);
+ CopyAtoms(c,lst+keepto,lst+keepix);
+ }
+
+ return; // no change
+ }
t_atom *l;
if(sz) {
l = new t_atom[sz];
- if(keepix >= 0)
+ if(keepix >= 0) {
// keep contents
- CopyAtoms(keeplen >= 0?keeplen:(cnt > sz?sz:cnt),l+keepto,lst+keepix);
+ int c = keeplen >= 0?keeplen:(cnt > sz?sz:cnt);
+ FLEXT_ASSERT(c+keepto <= sz);
+ FLEXT_ASSERT(c+keepix <= cnt);
+ CopyAtoms(c,l+keepto,lst+keepix);
+ }
}
else
l = NULL;
- delete[] lst;
+ Free();
lst = l,cnt = sz;
}
else {
@@ -122,11 +135,21 @@ flext::AtomListStaticBase::~AtomListStaticBase() { Free(); }
void flext::AtomListStaticBase::Alloc(int sz,int keepix,int keeplen,int keepto)
{
- if(sz < precnt) {
+ if(sz <= precnt) {
+ // small enough for pre-allocated space
+
if(lst != predata && lst) {
- if(keepix >= 0)
+ // currently allocated memory is larger than what we need
+
+ if(keepix >= 0) {
// keep contents
- CopyAtoms(keeplen >= 0?keeplen:(cnt > sz?sz:cnt),predata+keepto,lst+keepix);
+ int c = keeplen >= 0?keeplen:(cnt > sz?sz:cnt);
+ FLEXT_ASSERT(c+keepto <= precnt);
+ FLEXT_ASSERT(c+keepix <= cnt);
+ CopyAtoms(c,predata+keepto,lst+keepix);
+ }
+
+ // free allocated memory
AtomList::Free();
}
lst = predata,cnt = sz;