remove empty dir
[ghc-hetmet.git] / ghc / rts / gmp / memory.c
1 /* Memory allocation routines.
2
3 Copyright (C) 1991, 1993, 1994, 2000 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 malloc, realloc, free */
24
25 #include "gmp.h"
26 #include "gmp-impl.h"
27
28 #ifdef __NeXT__
29 #define static
30 #endif
31
32
33 void *  (*_mp_allocate_func) _PROTO ((size_t)) = _mp_default_allocate;
34 void *  (*_mp_reallocate_func) _PROTO ((void *, size_t, size_t))
35      = _mp_default_reallocate;
36 void    (*_mp_free_func) _PROTO ((void *, size_t)) = _mp_default_free;
37
38
39 /* Default allocation functions.  In case of failure to allocate/reallocate
40    an error message is written to stderr and the program aborts.  */
41
42 void *
43 #if __STDC__
44 _mp_default_allocate (size_t size)
45 #else
46 _mp_default_allocate (size)
47      size_t size;
48 #endif
49 {
50   void *ret;
51 #ifdef DEBUG
52   size_t req_size = size;
53   size += 2 * BYTES_PER_MP_LIMB;
54 #endif
55   ret = malloc (size);
56   if (ret == 0)
57     {
58       perror ("cannot allocate in gmp");
59       abort ();
60     }
61   
62 #ifdef DEBUG
63   {
64     mp_ptr p = ret;
65     p++;
66     p[-1] = (0xdeadbeef << 31) + 0xdeafdeed;
67     if (req_size % BYTES_PER_MP_LIMB == 0)
68       p[req_size / BYTES_PER_MP_LIMB] = ~((0xdeadbeef << 31) + 0xdeafdeed);
69     ret = p;
70   }
71 #endif
72   return ret;
73 }
74
75 void *
76 #if __STDC__
77 _mp_default_reallocate (void *oldptr, size_t old_size, size_t new_size)
78 #else
79 _mp_default_reallocate (oldptr, old_size, new_size)
80      void *oldptr;
81      size_t old_size;
82      size_t new_size;
83 #endif
84 {
85   void *ret;
86
87 #ifdef DEBUG
88   size_t req_size = new_size;
89
90   if (old_size != 0)
91     {
92       mp_ptr p = oldptr;
93       if (p[-1] != (0xdeadbeef << 31) + 0xdeafdeed)
94         {
95           fprintf (stderr, "gmp: (realloc) data clobbered before allocation block\n");
96           abort ();
97         }
98       if (old_size % BYTES_PER_MP_LIMB == 0)
99         if (p[old_size / BYTES_PER_MP_LIMB] != ~((0xdeadbeef << 31) + 0xdeafdeed))
100           {
101             fprintf (stderr, "gmp: (realloc) data clobbered after allocation block\n");
102             abort ();
103           }
104       oldptr = p - 1;
105     }
106
107   new_size += 2 * BYTES_PER_MP_LIMB;
108 #endif
109
110   ret = realloc (oldptr, new_size);
111   if (ret == 0)
112     {
113       perror ("cannot allocate in gmp");
114       abort ();
115     }
116
117 #ifdef DEBUG
118   {
119     mp_ptr p = ret;
120     p++;
121     p[-1] = (0xdeadbeef << 31) + 0xdeafdeed;
122     if (req_size % BYTES_PER_MP_LIMB == 0)
123       p[req_size / BYTES_PER_MP_LIMB] = ~((0xdeadbeef << 31) + 0xdeafdeed);
124     ret = p;
125   }
126 #endif
127   return ret;
128 }
129
130 void
131 #if __STDC__
132 _mp_default_free (void *blk_ptr, size_t blk_size)
133 #else
134 _mp_default_free (blk_ptr, blk_size)
135      void *blk_ptr;
136      size_t blk_size;
137 #endif
138 {
139 #ifdef DEBUG
140   {
141     mp_ptr p = blk_ptr;
142     if (blk_size != 0)
143       {
144         if (p[-1] != (0xdeadbeef << 31) + 0xdeafdeed)
145           {
146             fprintf (stderr, "gmp: (free) data clobbered before allocation block\n");
147             abort ();
148           }
149         if (blk_size % BYTES_PER_MP_LIMB == 0)
150           if (p[blk_size / BYTES_PER_MP_LIMB] != ~((0xdeadbeef << 31) + 0xdeafdeed))
151             {
152               fprintf (stderr, "gmp: (free) data clobbered after allocation block\n");
153               abort ();
154             }
155       }
156     blk_ptr = p - 1;
157   }
158 #endif
159   free (blk_ptr);
160 }