diff --git a/build_linux64/libamsmathutil25.linux64.a b/build_linux64/libamsmathutil25.linux64.a index 7059581..7e9c8aa 100644 Binary files a/build_linux64/libamsmathutil25.linux64.a and b/build_linux64/libamsmathutil25.linux64.a differ diff --git a/build_linux64/objstore/amsmathtuil25_test1.o b/build_linux64/objstore/amsmathtuil25_test1.o index 8ae5f83..48c656d 100644 Binary files a/build_linux64/objstore/amsmathtuil25_test1.o and b/build_linux64/objstore/amsmathtuil25_test1.o differ diff --git a/build_linux64/objstore/amsmathutiil25_random.o b/build_linux64/objstore/amsmathutiil25_random.o index 34f1f90..47a5603 100644 Binary files a/build_linux64/objstore/amsmathutiil25_random.o and b/build_linux64/objstore/amsmathutiil25_random.o differ diff --git a/build_linux64/objstore/amsmathutil25_amsarray_sort.o b/build_linux64/objstore/amsmathutil25_amsarray_sort.o index 448bb86..a339892 100644 Binary files a/build_linux64/objstore/amsmathutil25_amsarray_sort.o and b/build_linux64/objstore/amsmathutil25_amsarray_sort.o differ diff --git a/build_linux64/tests b/build_linux64/tests index b48854c..eb01714 100644 Binary files a/build_linux64/tests and b/build_linux64/tests differ diff --git a/build_linux64/valgrind.supp b/build_linux64/valgrind.supp new file mode 100644 index 0000000..48c3d4e --- /dev/null +++ b/build_linux64/valgrind.supp @@ -0,0 +1,36 @@ +# Save this as valgrind.supp +{ + glibc_tls_init + Memcheck:Param + set_robust_list(head) + ... + fun:__libc_setup_tls +} + +{ + glibc_malloc_init + Memcheck:Cond + ... + fun:ptmalloc_init* +} + +{ + glibc_getrandom + Memcheck:Cond + fun:getrandom + ... +} + +{ + glibc_dl_init + Memcheck:Cond + ... + fun:_dl_* +} + +{ + glibc_tcache_init + Memcheck:Cond + ... + fun:tcache_init* +} \ No newline at end of file diff --git a/build_mingw64/libamsmathutil25.mingw64.a b/build_mingw64/libamsmathutil25.mingw64.a index e18b43c..faa83ce 100644 Binary files a/build_mingw64/libamsmathutil25.mingw64.a and b/build_mingw64/libamsmathutil25.mingw64.a differ diff --git a/build_mingw64/objstore/amsmathtuil25_test1.o b/build_mingw64/objstore/amsmathtuil25_test1.o index 705cebc..d4ec942 100644 Binary files a/build_mingw64/objstore/amsmathtuil25_test1.o and b/build_mingw64/objstore/amsmathtuil25_test1.o differ diff --git a/build_mingw64/objstore/amsmathutiil25_random.o b/build_mingw64/objstore/amsmathutiil25_random.o index a194143..25e958b 100644 Binary files a/build_mingw64/objstore/amsmathutiil25_random.o and b/build_mingw64/objstore/amsmathutiil25_random.o differ diff --git a/build_mingw64/objstore/amsmathutil25_amsarray_sort.o b/build_mingw64/objstore/amsmathutil25_amsarray_sort.o index 3b19c9d..2cee879 100644 Binary files a/build_mingw64/objstore/amsmathutil25_amsarray_sort.o and b/build_mingw64/objstore/amsmathutil25_amsarray_sort.o differ diff --git a/build_mingw64/tests.exe b/build_mingw64/tests.exe index 1d7b32f..165f964 100644 Binary files a/build_mingw64/tests.exe and b/build_mingw64/tests.exe differ diff --git a/include/amsmathutil25/testing/amsmathutil25_testing.hpp b/include/amsmathutil25/testing/amsmathutil25_testing.hpp index 636a7b6..0b0dacf 100644 --- a/include/amsmathutil25/testing/amsmathutil25_testing.hpp +++ b/include/amsmathutil25/testing/amsmathutil25_testing.hpp @@ -12,6 +12,8 @@ namespace amsmathutil25 void test_amsarray_select(); void test_amsarray_sort1(); void test_amsarray_insertdelete1(); + void test_amsarray_insertdelete2(); + void test_amsarray_minimal(); diff --git a/include/amsmathutil25/util/amsmathutil25_amsarray_impl.hpp b/include/amsmathutil25/util/amsmathutil25_amsarray_impl.hpp index 86579a8..e7d7898 100644 --- a/include/amsmathutil25/util/amsmathutil25_amsarray_impl.hpp +++ b/include/amsmathutil25/util/amsmathutil25_amsarray_impl.hpp @@ -39,6 +39,13 @@ namespace ams amsarray_size_t lmin = 0; T defval = T(); + void* test_ptr = malloc(16); + if(test_ptr) free(test_ptr); + else { + printf("HEAP CORRUPTED before reserve()!\n"); + return amsarray_failure; + } + if(_newcap<=0) { length = 0; @@ -61,12 +68,14 @@ namespace ams return ret; } + //this shouldn't be necessary, but I'm getting weird memory bugs. + ams::buffer_set(newdata,0,_newcap,defval); if(data!=NULL) { lmin = (_newcap>=reserved) ? reserved : _newcap; ams::buffer_cast_copy(newdata,data,lmin); } - ams::buffer_set(newdata,reserved,_newcap,defval); + //ams::buffer_set(newdata,reserved,_newcap,defval); if(data!=NULL) {delete[] data; data = NULL;} data = newdata; @@ -132,7 +141,7 @@ namespace ams return ret; } - q = (amsarray_size_t)((1.0/growfactor)*(double)_newlen); + q = (amsarray_size_t)((1.0/growfactor)*(double)reserved); if(_newlenreserve(_newlen); @@ -237,6 +246,8 @@ namespace ams growfactor = other.growfactor; data = other.data; other.length = 0; + other.reserved = 0; + other.growfactor = 0; other.data = NULL; } return *this; @@ -405,8 +416,8 @@ template int amsarray::insert(amsarray_size_t ind, const T& val) { int ret = amsarray_success; int res; - amsarray narr; - amsarray_size_t I; + amsarray_size_t I, oldlen; + amsarray_size_t I0,I1; if(ind<0) { @@ -415,61 +426,45 @@ template int amsarray::insert(amsarray_size_t ind, const T& val) } else if(ind<=this->length) { - res = narr.resize_insert(this->length+1); - if(res!=amsarray_success) + oldlen = this->length; + res = this->resize_insert(this->length + 1); + if(res==amsarray_success) + { + //for now, do things single threaded. + //to do things multithreaded, I'd need another buffer + if(this->data!=NULL) + { + for(I=oldlen;I>=ind+1;I--) + { + + this->data[I] = this->data[I-1]; + } + this->data[ind] = val; + } + ret = amsarray_success; + return ret; + } + else { ret = amsarray_failure; return ret; } - - if(this->data!=NULL) - { - for(I=0;Ilength;I++) - { - narr.data[I] = this->data[I]; - } - } - narr.data[ind] = val; - if(this->data!=NULL) - { - for(I=ind+1;Idata[I-1]; - } - } - - //steal data from narr - if(this->data!=NULL) {delete[] this->data; this->data=NULL;} - this->length = narr.length; - this->data = narr.data; - narr.length = 0; - narr.data = NULL; } else { //inserting past the end of the array - res = narr.resize_insert(ind+1); + res = this->resize_insert(ind+1); if(res!=amsarray_success) { ret = amsarray_failure; return ret; } - - if(this->data!=NULL) + else { - for(I=0;Ilength;I++) - { - narr.data[I] = this->data[I]; - } + this->data[ind] = val; + ret = amsarray_success; + return ret; } - narr.data[ind] = val; - - //steal data from narr - if(this->data!=NULL) {delete[] this->data; this->data=NULL;} - this->length = narr.length; - this->data = narr.data; - narr.length = 0; - narr.data = NULL; } return ret; @@ -480,7 +475,6 @@ template int amsarray::erase(amsarray_size_t ind) { int ret = amsarray_success; int res; - amsarray narr; amsarray_size_t I; if(ind<0 || ind>=this->length) @@ -489,31 +483,16 @@ template int amsarray::erase(amsarray_size_t ind) return ret; } - res = narr.resize_insert(this->length-1); - if(res!=amsarray_success) - { - ret = amsarray_failure; - return ret; - } - if(this->data!=NULL) { - for(I=0;Ilength && Ilength-1;I++) { - narr.data[I] = this->data[I]; - } - for(I=ind+1;Ilength && (I-1)data[I]; + this->data[I] = this->data[I+1]; } + this->data[this->length-1] = T(); } - - //steal data from narr (should be similar to what std::move would do?) - if(this->data!=NULL) {delete[] this->data; this->data=NULL;} - this->length = narr.length; - this->data = narr.data; - narr.length = 0; - narr.data = NULL; + res = this->resize_insert(this->length-1); + ret = res; return ret; } @@ -611,7 +590,7 @@ template bool amsarray::operator==(const amsarray& other) cons amsarray_size_t I; int J; int nthreads; - std::vector threads; + amsarray threads; if(this->length != other.length) { diff --git a/src/amsmathutil25/testing/amsmathtuil25_test1.cpp b/src/amsmathutil25/testing/amsmathtuil25_test1.cpp index 9e91e5c..56f64d4 100644 --- a/src/amsmathutil25/testing/amsmathtuil25_test1.cpp +++ b/src/amsmathutil25/testing/amsmathtuil25_test1.cpp @@ -246,6 +246,53 @@ void test_amsarray_insertdelete1() return; } +#include + +struct testing_amsarray_somelargestruct +{ + int q1[50]; + float q2[255]; + testing_amsarray_somelargestruct() { + memset(q1, 0, sizeof(q1)); + memset(q2, 0, sizeof(q2)); + return; + } +}; + +void test_amsarray_insertdelete2() +{ + int I,J; + //int K; + amsarray la; + + + la.resize(0); + + for(I=0;I<255;I++) + { + la.append(testing_amsarray_somelargestruct()); + printf("la length: %ld reserved: %ld\n", (long)la.length, (long)la.reserved); + } + for(I=0;I<255;I++) + { + J = la.length-1; + la.erase(J); + printf("la length: %ld reserved: %ld\n", (long)la.length, (long)la.reserved); + } + + return; +} + +void test_amsarray_minimal() +{ + amsarray simple_array; + for(int i = 0; i < 10; i++) + { + simple_array.append(i); + printf("Length: %ld\n", simple_array.length); + } +} + diff --git a/src/main.cpp b/src/main.cpp index d1c83e8..e8743b2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,8 @@ #include +using namespace ams; +using namespace ams::amsmathutil25; + int main(int argc, char* argv[]) { int ret = 0; @@ -9,7 +12,10 @@ int main(int argc, char* argv[]) //ams::amsmathutil25::test_amsarray2(); //ams::amsmathutil25::test_amsarray_select(); //ams::amsmathutil25::test_amsarray_sort1(); - ams::amsmathutil25::test_amsarray_insertdelete1(); + //test_amsarray_insertdelete1(); + //test_amsarray_insertdelete2(); + test_amsarray_minimal(); + return ret; } \ No newline at end of file