summaryrefslogtreecommitdiffstats
path: root/apps/plugins/lua/tlsf_helper.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/lua/tlsf_helper.c')
-rw-r--r--apps/plugins/lua/tlsf_helper.c55
1 files changed, 52 insertions, 3 deletions
diff --git a/apps/plugins/lua/tlsf_helper.c b/apps/plugins/lua/tlsf_helper.c
index 097d39c8e4..52ef269bcd 100644
--- a/apps/plugins/lua/tlsf_helper.c
+++ b/apps/plugins/lua/tlsf_helper.c
@@ -21,16 +21,62 @@
#include "plugin.h"
#include <tlsf.h>
#include "lua.h"
+static const unsigned int sentinel = 0xBA5EFAC7;
+#define SENTINEL(n) (sentinel ^ (n))
-void *get_new_area(size_t *size)
+static char *pluginbuf_ptr = NULL;
+static size_t pluginbuf_size = 0;
+static char *audiobuf_ptr = NULL;
+static size_t audiobuf_size = 0;
+
+static void set_sentinel(void* buf, size_t size)
+{
+ size_t i;
+ unsigned int *b = (int*) buf;
+ for(i = 0; i < size / sizeof(sentinel); i++)
+ *b++ = SENTINEL(i);
+}
+
+static size_t check_sentinel(void* buf, size_t size)
+{
+ const size_t sz = size / sizeof(sentinel);
+ size_t unused = 0;
+ size_t i;
+ unsigned int *b = (int*) buf;
+ for(i = 0; i < sz; i++)
+ if (b[i] == SENTINEL(i))
+ {
+ unused++;
+ while(++i < sz && b[i] == SENTINEL(i) && ++unused)
+ ;;
+ }
+ return unused * sizeof(sentinel);
+}
+
+size_t rock_get_allocated_bytes(void)
{
- static char *pluginbuf_ptr = NULL;
- static char *audiobuf_ptr = NULL;
+ return pluginbuf_size + audiobuf_size;
+}
+
+size_t rock_get_unused_bytes(void)
+{
+ size_t unused = 0;
+ if (pluginbuf_size)
+ unused += check_sentinel(pluginbuf_ptr, pluginbuf_size);
+ if (audiobuf_size)
+ unused += check_sentinel(audiobuf_ptr, audiobuf_size);
+ return unused;
+}
+void *get_new_area(size_t *size)
+{
if (pluginbuf_ptr == NULL)
{
pluginbuf_ptr = rb->plugin_get_buffer(size);
+ pluginbuf_size = *size;
+ set_sentinel(pluginbuf_ptr, pluginbuf_size);
+
/* kill tlsf signature if any */
memset(pluginbuf_ptr, 0, 4);
@@ -43,6 +89,9 @@ void *get_new_area(size_t *size)
/* grab audiobuffer */
audiobuf_ptr = rb->plugin_get_audio_buffer(size);
+ audiobuf_size = *size;
+ set_sentinel(audiobuf_ptr, audiobuf_size);
+
return audiobuf_ptr;
}