Rev 3 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2 | pj | 1 | /* |
2 | * Copyright (c) 1997-1999 Massachusetts Institute of Technology |
||
3 | * |
||
4 | * This program is free software; you can redistribute it and/or modify |
||
5 | * it under the terms of the GNU General Public License as published by |
||
6 | * the Free Software Foundation; either version 2 of the License, or |
||
7 | * (at your option) any later version. |
||
8 | * |
||
9 | * This program is distributed in the hope that it will be useful, |
||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
12 | * GNU General Public License for more details. |
||
13 | * |
||
14 | * You should have received a copy of the GNU General Public License |
||
15 | * along with this program; if not, write to the Free Software |
||
16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||
17 | * |
||
18 | */ |
||
19 | |||
20 | /* |
||
21 | * malloc.c -- memory allocation related functions |
||
22 | */ |
||
23 | |||
107 | pj | 24 | /* $Id: malloc.c,v 1.2 2003-03-24 11:14:54 pj Exp $ */ |
2 | pj | 25 | #ifdef FFTW_USING_CILK |
107 | pj | 26 | #include <cilk.h> |
27 | #include <cilk-compat.h> |
||
2 | pj | 28 | #endif |
29 | |||
107 | pj | 30 | #include <fftw-int.h> |
2 | pj | 31 | //#include <stdio.h> |
32 | #include <stdlib.h> |
||
33 | |||
34 | #ifdef HAVE_MALLOC_H |
||
35 | //#include <ports/malloc.h> |
||
36 | #endif |
||
37 | |||
38 | #include <kernel/kern.h> |
||
39 | #define EXIT_FAILURE 1 |
||
40 | |||
41 | fftw_malloc_type_function fftw_malloc_hook = 0; |
||
42 | fftw_free_type_function fftw_free_hook = 0; |
||
43 | fftw_die_type_function fftw_die_hook = 0; |
||
44 | |||
45 | /********************************************************** |
||
46 | * DEBUGGING CODE |
||
47 | ********************************************************** |
||
48 | gettato via!!! |
||
49 | */ |
||
50 | |||
51 | /********************************************************** |
||
52 | * NON DEBUGGING CODE |
||
53 | **********************************************************/ |
||
54 | /* production version, no hacks */ |
||
55 | |||
56 | void *fftw_malloc(size_t n) |
||
57 | { |
||
58 | void *p; |
||
59 | |||
60 | if (fftw_malloc_hook) |
||
61 | return fftw_malloc_hook(n); |
||
62 | |||
63 | if (n == 0) |
||
64 | n = 1; |
||
65 | |||
66 | p = malloc(n); |
||
67 | |||
68 | if (!p) |
||
69 | fftw_die("fftw_malloc: out of memory\n"); |
||
70 | |||
71 | return p; |
||
72 | } |
||
73 | |||
74 | void fftw_free(void *p) |
||
75 | { |
||
76 | if (p) { |
||
77 | if (fftw_free_hook) { |
||
78 | fftw_free_hook(p); |
||
79 | return; |
||
80 | } |
||
81 | free(p); |
||
82 | } |
||
83 | } |
||
84 | |||
85 | /* die when fatal errors occur */ |
||
86 | void fftw_die(const char *s) |
||
87 | { |
||
88 | if (fftw_die_hook) |
||
89 | fftw_die_hook(s); |
||
90 | |||
91 | // fflush(stdout); |
||
92 | // fprintf(stderr, "fftw: %s", s); |
||
93 | |||
107 | pj | 94 | printk(KERN_ERR "fftw: %s", s); |
2 | pj | 95 | sys_abort(EXIT_FAILURE); |
96 | } |
||
97 | |||
98 | /* check for memory leaks when debugging */ |
||
99 | void fftw_check_memory_leaks(void) |
||
100 | { |
||
101 | extern int fftw_node_cnt, fftw_plan_cnt, fftw_twiddle_size; |
||
102 | |||
103 | #ifdef FFTW_DEBUG |
||
104 | if (fftw_malloc_cnt || fftw_malloc_total || |
||
105 | fftw_node_cnt || fftw_plan_cnt || fftw_twiddle_size) { |
||
106 | // fflush(stdout); |
||
107 | // fprintf(stderr, |
||
108 | kern_printf( |
||
109 | "MEMORY LEAK!!!\n" |
||
110 | "fftw_malloc = %d" |
||
111 | " node=%d plan=%d twiddle=%d\n" |
||
112 | "fftw_malloc_total = %d\n", |
||
113 | fftw_malloc_cnt, |
||
114 | fftw_node_cnt, fftw_plan_cnt, fftw_twiddle_size, |
||
115 | fftw_malloc_total); |
||
116 | sys_abort(EXIT_FAILURE); |
||
117 | } |
||
118 | #else |
||
119 | if (fftw_node_cnt || fftw_plan_cnt || fftw_twiddle_size) { |
||
120 | // fflush(stdout); |
||
121 | // fprintf(stderr, |
||
122 | kern_printf( |
||
123 | "MEMORY LEAK!!!\n" |
||
124 | " node=%d plan=%d twiddle=%d\n", |
||
125 | fftw_node_cnt, fftw_plan_cnt, fftw_twiddle_size); |
||
126 | sys_abort(EXIT_FAILURE); |
||
127 | } |
||
128 | #endif |
||
129 | } |
||
130 | |||
131 | void fftw_print_max_memory_usage(void) |
||
132 | { |
||
133 | #ifdef FFTW_DEBUG |
||
134 | printf("\nMaximum number of blocks allocated = %d\n" |
||
135 | "Maximum number of bytes allocated = %0.3f kB\n", |
||
136 | fftw_malloc_cnt_max, fftw_malloc_max / 1024.0); |
||
137 | #endif |
||
138 | } |