[BACK]Return to memory.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp / tests

Annotation of OpenXM_contrib/gmp/tests/memory.c, Revision 1.1

1.1     ! ohara       1: /* Memory allocation used during tests.
        !             2:
        !             3: Copyright 2001, 2002 Free Software Foundation, Inc.
        !             4:
        !             5: This file is part of the GNU MP Library.
        !             6:
        !             7: The GNU MP Library is free software; you can redistribute it and/or modify
        !             8: it under the terms of the GNU Lesser General Public License as published by
        !             9: the Free Software Foundation; either version 2.1 of the License, or (at your
        !            10: option) any later version.
        !            11:
        !            12: The GNU MP Library is distributed in the hope that it will be useful, but
        !            13: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        !            14: or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
        !            15: License for more details.
        !            16:
        !            17: You should have received a copy of the GNU Lesser General Public License
        !            18: along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
        !            19: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
        !            20: MA 02111-1307, USA. */
        !            21:
        !            22: #include <stdio.h>
        !            23: #include <stdlib.h>  /* for abort */
        !            24: #include "gmp.h"
        !            25: #include "gmp-impl.h"
        !            26:
        !            27:
        !            28: /* Each block allocated is a separate malloc, for the benefit of a redzoning
        !            29:    malloc debugger during development or when bug hunting.
        !            30:
        !            31:    Sizes passed when reallocating or freeing are checked (the default
        !            32:    routines don't care about these).
        !            33:
        !            34:    Memory leaks are checked by requiring that all blocks have been freed
        !            35:    when tests_memory_end() is called.  Test programs must be sure to have
        !            36:    "clear"s for all temporary variables used.  */
        !            37:
        !            38:
        !            39: struct header {
        !            40:   void           *ptr;
        !            41:   size_t         size;
        !            42:   struct header  *next;
        !            43: };
        !            44:
        !            45: struct header  *tests_memory_list = NULL;
        !            46:
        !            47: /* Return a pointer to a pointer to the found block (so it can be updated
        !            48:    when unlinking). */
        !            49: struct header **
        !            50: tests_memory_find (void *ptr)
        !            51: {
        !            52:   struct header  **hp;
        !            53:
        !            54:   for (hp = &tests_memory_list; *hp != NULL; hp = &((*hp)->next))
        !            55:     if ((*hp)->ptr == ptr)
        !            56:       return hp;
        !            57:
        !            58:   return NULL;
        !            59: }
        !            60:
        !            61: int
        !            62: tests_memory_valid (void *ptr)
        !            63: {
        !            64:   return (tests_memory_find (ptr) != NULL);
        !            65: }
        !            66:
        !            67: void *
        !            68: tests_allocate (size_t size)
        !            69: {
        !            70:   struct header  *h;
        !            71:
        !            72:   if (size == 0)
        !            73:     {
        !            74:       printf ("tests_allocate(): attempt to allocate 0 bytes\n");
        !            75:       abort ();
        !            76:     }
        !            77:
        !            78:   h = (struct header *) __gmp_default_allocate (sizeof (*h));
        !            79:   h->next = tests_memory_list;
        !            80:   tests_memory_list = h;
        !            81:
        !            82:   h->size = size;
        !            83:   h->ptr = __gmp_default_allocate (size);
        !            84:   return h->ptr;
        !            85: }
        !            86:
        !            87: void *
        !            88: tests_reallocate (void *ptr, size_t old_size, size_t new_size)
        !            89: {
        !            90:   struct header  **hp, *h;
        !            91:
        !            92:   if (new_size == 0)
        !            93:     {
        !            94:       printf ("tests_reallocate(): attempt to reallocate 0x%lX to 0 bytes\n",
        !            95:               (unsigned long) ptr);
        !            96:       abort ();
        !            97:     }
        !            98:
        !            99:   hp = tests_memory_find (ptr);
        !           100:   if (hp == NULL)
        !           101:     {
        !           102:       printf ("tests_reallocate(): attempt to reallocate bad pointer 0x%lX\n",
        !           103:               (unsigned long) ptr);
        !           104:       abort ();
        !           105:     }
        !           106:   h = *hp;
        !           107:
        !           108:   if (h->size != old_size)
        !           109:     {
        !           110:       printf ("tests_reallocate(): bad old size %u, should be %u\n",
        !           111:               old_size, h->size);
        !           112:       abort ();
        !           113:     }
        !           114:
        !           115:   h->size = new_size;
        !           116:   h->ptr = __gmp_default_reallocate (ptr, old_size, new_size);
        !           117:   return h->ptr;
        !           118: }
        !           119:
        !           120: struct header **
        !           121: tests_free_find (void *ptr)
        !           122: {
        !           123:   struct header  **hp = tests_memory_find (ptr);
        !           124:   if (hp == NULL)
        !           125:     {
        !           126:       printf ("tests_free(): attempt to free bad pointer 0x%lX\n",
        !           127:               (unsigned long) ptr);
        !           128:       abort ();
        !           129:     }
        !           130:   return hp;
        !           131: }
        !           132:
        !           133: void
        !           134: tests_free_nosize (void *ptr)
        !           135: {
        !           136:   struct header  **hp = tests_free_find (ptr);
        !           137:   struct header  *h = *hp;
        !           138:
        !           139:   *hp = h->next;  /* unlink */
        !           140:
        !           141:   __gmp_default_free (ptr, h->size);
        !           142:   __gmp_default_free (h, sizeof (*h));
        !           143: }
        !           144:
        !           145: void
        !           146: tests_free (void *ptr, size_t size)
        !           147: {
        !           148:   struct header  **hp = tests_free_find (ptr);
        !           149:   struct header  *h = *hp;
        !           150:
        !           151:   if (h->size != size)
        !           152:     {
        !           153:       printf ("tests_free(): bad size %u, should be %u\n", size, h->size);
        !           154:       abort ();
        !           155:     }
        !           156:
        !           157:   tests_free_nosize (ptr);
        !           158: }
        !           159:
        !           160: void
        !           161: tests_memory_start (void)
        !           162: {
        !           163:   mp_set_memory_functions (tests_allocate, tests_reallocate, tests_free);
        !           164: }
        !           165:
        !           166: void
        !           167: tests_memory_end (void)
        !           168: {
        !           169:   if (tests_memory_list != NULL)
        !           170:     {
        !           171:       struct header  *h;
        !           172:       unsigned  count;
        !           173:
        !           174:       printf ("tests_memory_end(): not all memory freed\n");
        !           175:
        !           176:       count = 0;
        !           177:       for (h = tests_memory_list; h != NULL; h = h->next)
        !           178:         count++;
        !           179:
        !           180:       printf ("    %u blocks remaining\n", count);
        !           181:       abort ();
        !           182:     }
        !           183: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>