X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3261a9f4db993fa8854eb68bd0a2b0d7a5355480..19676e284575c2ab70cc36622fdf1837a513ba27:/teshsuite/xbt/mmalloc_test.c diff --git a/teshsuite/xbt/mmalloc_test.c b/teshsuite/xbt/mmalloc_test.c index 8606e3a21c..cc70aa6ee4 100644 --- a/teshsuite/xbt/mmalloc_test.c +++ b/teshsuite/xbt/mmalloc_test.c @@ -1,4 +1,5 @@ #include "xbt/mmalloc.h" +#include "xbt.h" #include #include #include @@ -7,16 +8,19 @@ #include #include +XBT_LOG_NEW_DEFAULT_CATEGORY(test,"this test"); #define BUFFSIZE 204800 #define TESTSIZE 100 +#define size_of_block(i) (((i % 50)+1)* 100) -int main() +int main(int argc, char**argv) { void *heapA; void *pointers[TESTSIZE]; - srand(0); // we need the test to be reproducible + xbt_init(&argc,argv); + XBT_INFO("Allocating a new heap"); heapA = xbt_mheap_new(-1, ((char*)sbrk(0)) + BUFFSIZE); if (heapA == NULL) { perror("attach 1 failed"); @@ -24,19 +28,62 @@ int main() exit(1); } - fprintf(stderr, "HeapA=%p\n", heapA); - fflush(stderr); + XBT_INFO("HeapA allocated"); + int i, size; for (i = 0; i < TESTSIZE; i++) { - size = rand() % 1000; + size = size_of_block(i); + pointers[i] = mmalloc(heapA, size); + XBT_INFO("%d bytes allocated with offset %tx", size, ((char*)pointers[i])-((char*)heapA)); + } + XBT_INFO("All blocks were correctly allocated. Free every second block"); + for (i = 0; i < TESTSIZE; i+=2) { + size = size_of_block(i); + mfree(heapA,pointers[i]); + } + XBT_INFO("Memset every second block to zero (yeah, they are not currently allocated :)"); + for (i = 0; i < TESTSIZE; i+=2) { + size = size_of_block(i); + memset(pointers[i],0, size); + } + XBT_INFO("Re-allocate every second block"); + for (i = 0; i < TESTSIZE; i+=2) { + size = size_of_block(i); pointers[i] = mmalloc(heapA, size); - fprintf(stderr, "%d bytes allocated with offset %li\n", size, ((char*)pointers[i])-((char*)heapA)); } + XBT_INFO("free all blocks (each one twice, to check that double free are correctly catched)"); for (i = 0; i < TESTSIZE; i++) { + xbt_ex_t e; + int gotit = 1; + mfree(heapA, pointers[i]); + TRY { + mfree(heapA, pointers[i]); + gotit = 0; + } CATCH(e) { + xbt_ex_free(e); + } + if (!gotit) + xbt_die("FAIL: A double-free went undetected (for size:%d)",size_of_block(i)); } - fprintf(stderr, "Ok bye bye\n"); + XBT_INFO("free again all blocks (to really check that double free are correctly catched)"); + for (i = 0; i < TESTSIZE; i++) { + xbt_ex_t e; + int gotit = 1; + + TRY { + mfree(heapA, pointers[i]); + gotit = 0; + } CATCH(e) { + xbt_ex_free(e); + } + if (!gotit) + xbt_die("FAIL: A double-free went undetected (for size:%d)",size_of_block(i)); + } + + + XBT_INFO("Damnit, I cannot break mmalloc this time. That's SO disappointing."); return 0; }