is this code bugfree? if yes, I'll commit this to the library. Please consider including BSD license and send the complete coe as attachement.
cheers, ~d On Wednesday 21 January 2004 22:11, soltras wrote: > Lately I found the bug in my mymalloc function. > Change really is in below lines: > if (xsize == 0x7FFF) f = 1; //was (xsize<<1)+2 == 0) // 0x7FFF > means > empty else{ > heap_next = &heap_top[xsize + 1]; > 1: if(heap_next >= heap_bottom ) f = 1;//f=1 mean do loop once and > end if > you reach over stack > } > > The basic disadvantage of below code is the way of description bit > allocation. When You overrun buffer you almost loose all data ie: > char * buffer = "abcd"; > char* ptr = mymalloc(4); //you overrun buffer because '\0' deletes next and > all above allocations. Moreover this improvement prevents deleting stack. > however I have no idea where to put malloc information data. All ideas have > pros and cons. > > > > all code is below: > //released under GNU PUBLIC LICENCE > #include <stdlib.h> > > #define XSIZE(x) ((*x)>>1) > #define FREE_P(x) (!((*x)&1)) > #define MARK_BUSY(x) ((*x)|=1) > #define MARK_FREE(x) ((*x)&=0xfffe) > > //extern size_t __bss_end; > extern size_t __noinit_end; > #define GET_HEAP_BOTTOM(__x) __asm__ __volatile__("mov r1, %0": "=r" > ((uint16_t)__x) :) > > void myfree (void *p); > void *mymalloc (size_t size); > > void *mymalloc (size_t size) > { > static char once; > size_t * heap_bottom; > size_t * heap_top = &__noinit_end; > size_t * heap_next; > size_t xsize; > char f = 0; > > if (!once) > { > once = 1; > *heap_top = 0xFFFE; > } > GET_HEAP_BOTTOM (heap_bottom); > heap_bottom -= 20; > > size = (size+1)>>1; /* round to 2 */ > do > { > xsize = XSIZE (heap_top); > if (xsize == 0x7FFF) f = 1; //(xsize<<1)+2 == 0) > else{ > heap_next = &heap_top[xsize + 1]; > if(heap_next >= heap_bottom ) f = 1; > } > > if (FREE_P (heap_top)) > { > if (f>0) > { > xsize = heap_bottom - heap_top - 1;//(heap_b - heap_t)/2 in > fact > } > else if (FREE_P(heap_next)) > { > *heap_top = ( (XSIZE(heap_next)== 0x7FFF)/*<<1) + 2 == 0*/ > ? 0xFFFE > > : (xsize + XSIZE(heap_next) + 1)<<1); > > continue; > } > > > if (xsize >= size) > { > > if (f>0) > heap_top[size + 1] = 0xFFFE; > else if (xsize != size) > heap_top[size + 1] = (xsize - size - 1) << 1; > *heap_top = size << 1; > MARK_BUSY (heap_top); > return heap_top+1; > } > } > heap_top += xsize + 1; > } > while (!f); > return NULL; > } > > void myfree (void *p) > { > size_t *t = (size_t*)p - 1; > MARK_FREE (t); > } > > > > > ------------------------------------------------------- > The SF.Net email is sponsored by EclipseCon 2004 > Premiere Conference on Open Tools Development and Integration > See the breadth of Eclipse activity. February 3-5 in Anaheim, CA. > http://www.eclipsecon.org/osdn > _______________________________________________ > Mspgcc-users mailing list > Mspgcc-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/mspgcc-users -- /***************************************************************** ("`-''-/").___..--''"`-._ (\ Dimmy the Wild UA1ACZ `6_ 6 ) `-. ( ).`-.__.`) State Polytechnical Univ. (_Y_.)' ._ ) `._ `. ``-..-' Radio-Physics Departament _..`--'_..-_/ /--'_.' ,' Saint Petersburg, Russia (il),-'' (li),' ((!.-' +7 (812) 5403923, 5585314 *****************************************************************/