avr-libc-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[avr-libc-commit] [2123] Add some initial malloc and realloc tests to te


From: Joerg Wunsch
Subject: [avr-libc-commit] [2123] Add some initial malloc and realloc tests to test
Date: Fri, 04 Jun 2010 14:38:24 +0000

Revision: 2123
          http://svn.sv.gnu.org/viewvc/?view=rev&root=avr-libc&revision=2123
Author:   joerg_wunsch
Date:     2010-06-04 14:38:23 +0000 (Fri, 04 Jun 2010)
Log Message:
-----------
Add some initial malloc and realloc tests to test
suite.

Modified Paths:
--------------
    trunk/avr-libc/ChangeLog
    trunk/avr-libc/libc/stdlib/malloc.c

Added Paths:
-----------
    trunk/avr-libc/tests/simulate/stdlib/malloc-1.c
    trunk/avr-libc/tests/simulate/stdlib/malloc-2.c
    trunk/avr-libc/tests/simulate/stdlib/malloc-3.c
    trunk/avr-libc/tests/simulate/stdlib/realloc-1.c

Modified: trunk/avr-libc/ChangeLog
===================================================================
--- trunk/avr-libc/ChangeLog    2010-04-16 02:52:03 UTC (rev 2122)
+++ trunk/avr-libc/ChangeLog    2010-06-04 14:38:23 UTC (rev 2123)
@@ -1,3 +1,12 @@
+2010-06-04  Joerg Wunsch <address@hidden>
+
+       Add some initial malloc and realloc tests to test
+       suite.
+       * tests/simulate/stdlib/malloc-1.c: New file.
+       * tests/simulate/stdlib/malloc-2.c: (Ditto.)
+       * tests/simulate/stdlib/malloc-3.c: (Ditto.)
+       * tests/simulate/stdlib/realloc-1.c: (Ditto.)
+
 2010-04-16  Anitha Boyapati <address@hidden>
 
         Fix bug #28574.

Modified: trunk/avr-libc/libc/stdlib/malloc.c
===================================================================
--- trunk/avr-libc/libc/stdlib/malloc.c 2010-04-16 02:52:03 UTC (rev 2122)
+++ trunk/avr-libc/libc/stdlib/malloc.c 2010-06-04 14:38:23 UTC (rev 2123)
@@ -164,7 +164,22 @@
         * segment as dynamically requested from the operating system.
         * Since we don't have an operating system, just make sure
         * that we don't collide with the stack.
+        * But first we check if there is a free chunk at the end of
+        * the allocation area. Brkval is corrected downwards then,
+        * so the free chunk gets added to the new chunk.
+        * (fp2 still points to the last list entry from step 1)         
         */
+       if (fp2 && (char*)fp2 + fp2->sz + sizeof(size_t) == __brkval) {
+       __brkval = (char*)fp2;
+               for (fp1 = __flp, fp2 = 0;
+                    fp1->nx;
+                fp2 = fp1, fp1 = fp1->nx)
+                       {} 
+               if (fp2)
+                       fp2->nx = 0;
+               else
+                       __flp = 0;
+       }
        if (__brkval == 0)
                __brkval = __malloc_heap_start;
        cp = __malloc_heap_end;

Added: trunk/avr-libc/tests/simulate/stdlib/malloc-1.c
===================================================================
--- trunk/avr-libc/tests/simulate/stdlib/malloc-1.c                             
(rev 0)
+++ trunk/avr-libc/tests/simulate/stdlib/malloc-1.c     2010-06-04 14:38:23 UTC 
(rev 2123)
@@ -0,0 +1,105 @@
+/* Copyright (c) 2010  Joerg Wunsch
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are met:
+
+   * Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+   * Neither the name of the copyright holders nor the names of
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* $Id$ */
+
+/* Allocate a bunch of things, and free them again.  At the end,
+   the freelist is supposed to consist of a single entry. */
+
+#ifndef        __AVR__
+
+/* There is no sense to check on host computer. */
+int main ()
+{
+    return 0;
+}
+
+#else
+
+#include <stdint.h>
+#include <stdlib.h>
+
+struct __freelist {
+        size_t sz;
+        struct __freelist *nx;
+};
+
+extern char *__brkval;          /* first location not yet allocated */
+extern struct __freelist *__flp; /* freelist pointer (head of freelist) */
+extern char *__malloc_heap_start;
+extern char *__malloc_heap_end;
+
+#if defined(__AVR_ATmega128__)
+static const int sizes[8] =
+{
+    5, 8, 2, 122, 256, 1, 32, 25 /* 451 + 1 [padding] + 2 * 8 [ptrs] = 468 */
+};
+#define TARGETVAL 468
+#elif defined(__AVR_AT90S8515__)
+static const int sizes[8] =
+{
+    5, 8, 2, 22, 256, 1, 12, 25 /* 331 + 1 [padding] + 2 * 8 [ptrs] = 348 */
+};
+#define TARGETVAL 348
+#else
+#  error "Unknown MCU type"
+#endif
+
+
+int main(void)
+{
+    void *ptrs[8];
+    uint8_t i;
+
+    for (i = 0; i < 8; i++)
+    {
+        void *p = malloc(sizes[i]);
+        /* first test: all allocations are supposed to fit */
+        if (p == NULL) return __LINE__;
+        ptrs[i] = p;
+    }
+    /* second test: the amount of memory allocated to the heap must
+       match the expected TARGETVAL */
+    if (__brkval - __malloc_heap_start != TARGETVAL) return __LINE__;
+
+    for (i = 0; i < 8; i++)
+    {
+        free(ptrs[i]);
+    }
+
+    /* after freeing everything, the freelist must contain one
+       chunk of the full TARGETVAL size (minus the size for one
+       pointer), and the "nx" pointer must be NULL */
+    if (__flp->nx != NULL) return __LINE__;
+    if (__flp->sz != TARGETVAL - 2) return __LINE__;
+
+    return 0;
+}
+
+#endif  /* !AVR */


Property changes on: trunk/avr-libc/tests/simulate/stdlib/malloc-1.c
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Author Id Date
Added: svn:eol-style
   + native

Added: trunk/avr-libc/tests/simulate/stdlib/malloc-2.c
===================================================================
--- trunk/avr-libc/tests/simulate/stdlib/malloc-2.c                             
(rev 0)
+++ trunk/avr-libc/tests/simulate/stdlib/malloc-2.c     2010-06-04 14:38:23 UTC 
(rev 2123)
@@ -0,0 +1,90 @@
+/* Copyright (c) 2010  Joerg Wunsch
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are met:
+
+   * Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+   * Neither the name of the copyright holders nor the names of
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* $Id$ */
+
+/* Setup the heap to a certain area, and make sure allocation won't go
+   beyond the restriction. */
+
+#ifndef        __AVR__
+
+/* There is no sense to check on host computer. */
+int main ()
+{
+    return 0;
+}
+
+#else
+
+#include <stdint.h>
+#include <stdlib.h>
+
+struct __freelist {
+        size_t sz;
+        struct __freelist *nx;
+};
+
+extern char *__brkval;          /* first location not yet allocated */
+extern struct __freelist *__flp; /* freelist pointer (head of freelist) */
+extern char *__malloc_heap_start;
+extern char *__malloc_heap_end;
+
+#if defined(__AVR_ATmega128__)
+#define HEAP_START 0x200
+#define HEAP_END   0x1000
+#define ALLOC_FAILS 0xe00
+#define ALLOC_WORKS 0xdfe
+#elif defined(__AVR_AT90S8515__)
+#define HEAP_START 0x100
+#define HEAP_END   0x200
+#define ALLOC_FAILS 0x100
+#define ALLOC_WORKS 0xfe
+#else
+#  error "Unknown MCU type"
+#endif
+
+
+int main(void)
+{
+    void *p;
+
+    __malloc_heap_start = (void *)HEAP_START;
+    __malloc_heap_end = (void *)HEAP_END;
+
+    p = malloc(ALLOC_FAILS);
+    if (p != NULL) return __LINE__;
+
+    p = malloc(ALLOC_WORKS);
+    if (p == NULL) return __LINE__;
+    if (p != (void *)(HEAP_START + 2)) return __LINE__;
+
+    return 0;
+}
+
+#endif  /* !AVR */


Property changes on: trunk/avr-libc/tests/simulate/stdlib/malloc-2.c
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Author Id Date
Added: svn:eol-style
   + native

Added: trunk/avr-libc/tests/simulate/stdlib/malloc-3.c
===================================================================
--- trunk/avr-libc/tests/simulate/stdlib/malloc-3.c                             
(rev 0)
+++ trunk/avr-libc/tests/simulate/stdlib/malloc-3.c     2010-06-04 14:38:23 UTC 
(rev 2123)
@@ -0,0 +1,94 @@
+/* Copyright (c) 2010  Joerg Wunsch
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are met:
+
+   * Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+   * Neither the name of the copyright holders nor the names of
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* $Id$ */
+
+/* Test heap restrictions implied by __malloc_margin. */
+
+#ifndef        __AVR__
+
+/* There is no sense to check on host computer. */
+int main ()
+{
+    return 0;
+}
+
+#else
+
+#include <stdint.h>
+#include <stdlib.h>
+
+struct __freelist {
+        size_t sz;
+        struct __freelist *nx;
+};
+
+extern char *__brkval;          /* first location not yet allocated */
+extern struct __freelist *__flp; /* freelist pointer (head of freelist) */
+extern char *__malloc_heap_start;
+extern char *__malloc_heap_end;
+
+#if defined(__AVR_ATmega128__)
+#define HEAP_START 0x200
+#elif defined(__AVR_AT90S8515__)
+#define HEAP_START 0x100
+#else
+#  error "Unknown MCU type"
+#endif
+
+
+int main(void)
+{
+    volatile void *dummy;
+
+    __malloc_heap_start = (void *)HEAP_START;
+    unsigned int bottom_of_stack = (unsigned int)&dummy;
+    size_t s = bottom_of_stack - HEAP_START;
+
+    /* try allocating everything from heap start through bottom
+       of stack; expected to fail */
+    void *p = malloc(s);
+    if (p != NULL) return __LINE__;
+
+    /* reduce by __malloc_margin's default value; still expected to
+       fail*/
+    s -= 32;
+    p = malloc(s);
+    if (p != NULL) return __LINE__;
+
+    /* reduce by some more bytes (size of malloc()'s stack frame);
+       expected to work */
+    s -= 10;                    /* AVR-GCC 4.3.4: 8 bytes needed */
+    p = malloc(s);
+    if (p == NULL) return __LINE__;
+
+    return 0;
+}
+
+#endif  /* !AVR */


Property changes on: trunk/avr-libc/tests/simulate/stdlib/malloc-3.c
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Author Id Date
Added: svn:eol-style
   + native

Added: trunk/avr-libc/tests/simulate/stdlib/realloc-1.c
===================================================================
--- trunk/avr-libc/tests/simulate/stdlib/realloc-1.c                            
(rev 0)
+++ trunk/avr-libc/tests/simulate/stdlib/realloc-1.c    2010-06-04 14:38:23 UTC 
(rev 2123)
@@ -0,0 +1,86 @@
+/* Copyright (c) 2010  Joerg Wunsch
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are met:
+
+   * Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+   * Neither the name of the copyright holders nor the names of
+     contributors may be used to endorse or promote products derived
+     from this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* $Id$ */
+
+/* Basic realloc() test: ensure the realloc'ed area's initial
+   contents matches the previously malloc'ed one. */
+
+#ifndef        __AVR__
+
+/* There is no sense to check on host computer. */
+int main ()
+{
+    return 0;
+}
+
+#else
+
+#include <stdint.h>
+#include <stdlib.h>
+
+struct __freelist {
+        size_t sz;
+        struct __freelist *nx;
+};
+
+extern char *__brkval;          /* first location not yet allocated */
+extern struct __freelist *__flp; /* freelist pointer (head of freelist) */
+extern char *__malloc_heap_start;
+extern char *__malloc_heap_end;
+
+int main(void)
+{
+    /* allocate first chunk; expected to work */
+    uint8_t *p = malloc(42);
+    if (p == NULL) return __LINE__;
+
+    /* allocate second chunk; also expected to work */
+    void *q = malloc(23);
+    if (q == NULL) return __LINE__;
+
+    /* fill some data into first chunk */
+    uint8_t i;
+    for (i = 0; i < 42; i++)
+        p[i] = i ^ 0x42;
+
+    /* extend first chunk; expected to work but expected to go into a
+       different location than the initial allocation */
+    uint8_t *r = realloc(p, 142);
+    if (r == NULL) return __LINE__;
+    if (r == p) return __LINE__;
+
+    /* verify contents */
+    for (i = 0; i < 42; i++)
+        if (r[i] != (i ^ 0x42)) return __LINE__;
+
+    return 0;
+}
+
+#endif  /* !AVR */


Property changes on: trunk/avr-libc/tests/simulate/stdlib/realloc-1.c
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Author Id Date
Added: svn:eol-style
   + native




reply via email to

[Prev in Thread] Current Thread [Next in Thread]