deep memory issues. so many issues.
This commit is contained in:
		
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										36
									
								
								build_linux64/valgrind.supp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								build_linux64/valgrind.supp
									
									
									
									
									
										Normal file
									
								
							@ -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*
 | 
			
		||||
}
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							@ -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();
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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<T>(newdata,0,_newcap,defval);
 | 
			
		||||
        if(data!=NULL)
 | 
			
		||||
        {
 | 
			
		||||
            lmin = (_newcap>=reserved) ? reserved : _newcap;
 | 
			
		||||
            ams::buffer_cast_copy<T,T>(newdata,data,lmin);
 | 
			
		||||
        }
 | 
			
		||||
        ams::buffer_set<T>(newdata,reserved,_newcap,defval);
 | 
			
		||||
        //ams::buffer_set<T>(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(_newlen<q)
 | 
			
		||||
            {
 | 
			
		||||
                res = this->reserve(_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<typename T> int amsarray<T>::insert(amsarray_size_t ind, const T& val)
 | 
			
		||||
{
 | 
			
		||||
    int ret = amsarray_success;
 | 
			
		||||
    int res;
 | 
			
		||||
    amsarray<T> narr;
 | 
			
		||||
    amsarray_size_t I;
 | 
			
		||||
    amsarray_size_t I, oldlen;
 | 
			
		||||
    amsarray_size_t I0,I1;
 | 
			
		||||
 | 
			
		||||
    if(ind<0)
 | 
			
		||||
    {
 | 
			
		||||
@ -415,62 +426,46 @@ template<typename T> int amsarray<T>::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;I<ind && I<this->length;I++)
 | 
			
		||||
            {
 | 
			
		||||
                narr.data[I] = this->data[I];
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        narr.data[ind] = val;
 | 
			
		||||
        if(this->data!=NULL)
 | 
			
		||||
        {
 | 
			
		||||
            for(I=ind+1;I<narr.length;I++)
 | 
			
		||||
            {
 | 
			
		||||
                narr.data[I] = this->data[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;I<this->length;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<typename T> int amsarray<T>::erase(amsarray_size_t ind)
 | 
			
		||||
{
 | 
			
		||||
    int ret = amsarray_success;
 | 
			
		||||
    int res;
 | 
			
		||||
    amsarray<T> narr;
 | 
			
		||||
    amsarray_size_t I;
 | 
			
		||||
 | 
			
		||||
    if(ind<0 || ind>=this->length)
 | 
			
		||||
@ -489,31 +483,16 @@ template<typename T> int amsarray<T>::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;I<ind && I<this->length && I<narr.length;I++)
 | 
			
		||||
        for(I=ind;I<this->length-1;I++)
 | 
			
		||||
        {
 | 
			
		||||
            narr.data[I] = this->data[I];
 | 
			
		||||
            this->data[I] = this->data[I+1];
 | 
			
		||||
        }
 | 
			
		||||
        for(I=ind+1;I<this->length && (I-1)<narr.length;I++)
 | 
			
		||||
        {
 | 
			
		||||
            narr.data[I-1] = this->data[I];
 | 
			
		||||
        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<typename T> bool amsarray<T>::operator==(const amsarray<T>& other) cons
 | 
			
		||||
    amsarray_size_t I;
 | 
			
		||||
    int J;
 | 
			
		||||
    int nthreads;
 | 
			
		||||
    std::vector<std::thread*> threads;
 | 
			
		||||
    amsarray<std::thread*> threads;
 | 
			
		||||
 | 
			
		||||
    if(this->length != other.length)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
@ -246,6 +246,53 @@ void test_amsarray_insertdelete1()
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
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<testing_amsarray_somelargestruct> 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<int> simple_array;
 | 
			
		||||
    for(int i = 0; i < 10; i++)
 | 
			
		||||
    {
 | 
			
		||||
        simple_array.append(i);
 | 
			
		||||
        printf("Length: %ld\n", simple_array.length);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,8 @@
 | 
			
		||||
#include <amsmathutil25/amsmathutil25.hpp>
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user