summaryrefslogtreecommitdiff
path: root/apps/plugins/puzzles/malloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/puzzles/malloc.c')
-rw-r--r--apps/plugins/puzzles/malloc.c38
1 files changed, 35 insertions, 3 deletions
diff --git a/apps/plugins/puzzles/malloc.c b/apps/plugins/puzzles/malloc.c
index d9943c6b40..47a7137459 100644
--- a/apps/plugins/puzzles/malloc.c
+++ b/apps/plugins/puzzles/malloc.c
@@ -14,12 +14,40 @@
14int allocs = 0; 14int allocs = 0;
15int frees = 0; 15int frees = 0;
16 16
17bool audiobuf_available =
18#ifndef COMBINED
19 true;
20#else
21 false;
22#endif
23
24static bool grab_audiobuf(void)
25{
26 if(!audiobuf_available)
27 return false;
28
29 if(rb->audio_status())
30 rb->audio_stop();
31
32 size_t sz, junk;
33 void *audiobuf = rb->plugin_get_audio_buffer(&sz);
34 extern char *giant_buffer;
35
36 add_new_area(audiobuf, sz, giant_buffer);
37 audiobuf_available = false;
38 return true;
39}
40
17void *smalloc(size_t size) { 41void *smalloc(size_t size) {
18 void *p; 42 void *p;
19 p = malloc(size); 43 p = malloc(size);
20 LOGF("allocs: %d", ++allocs); 44 LOGF("allocs: %d", ++allocs);
21 if (!p) 45 if (!p)
22 fatal("out of memory"); 46 {
47 if(grab_audiobuf())
48 return smalloc(size);
49 fatal("out of memory");
50 }
23 return p; 51 return p;
24} 52}
25 53
@@ -30,7 +58,7 @@ void sfree(void *p) {
30 if (p) { 58 if (p) {
31 ++frees; 59 ++frees;
32 LOGF("frees: %d, total outstanding: %d", frees, allocs - frees); 60 LOGF("frees: %d, total outstanding: %d", frees, allocs - frees);
33 free(p); 61 free(p);
34 } 62 }
35} 63}
36 64
@@ -46,7 +74,11 @@ void *srealloc(void *p, size_t size) {
46 q = malloc(size); 74 q = malloc(size);
47 } 75 }
48 if (!q) 76 if (!q)
49 fatal("out of memory"); 77 {
78 if(grab_audiobuf())
79 return srealloc(p, size);
80 fatal("out of memory");
81 }
50 return q; 82 return q;
51} 83}
52 84