diff options
Diffstat (limited to 'apps/plugins/puzzles/malloc.c')
-rw-r--r-- | apps/plugins/puzzles/malloc.c | 38 |
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 @@ | |||
14 | int allocs = 0; | 14 | int allocs = 0; |
15 | int frees = 0; | 15 | int frees = 0; |
16 | 16 | ||
17 | bool audiobuf_available = | ||
18 | #ifndef COMBINED | ||
19 | true; | ||
20 | #else | ||
21 | false; | ||
22 | #endif | ||
23 | |||
24 | static 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 | |||
17 | void *smalloc(size_t size) { | 41 | void *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 | ||