summaryrefslogtreecommitdiff
path: root/tests/test-memory.c
diff options
context:
space:
mode:
authorpaul <paul>2005-04-13 03:31:35 +0000
committerpaul <paul>2005-04-13 03:31:35 +0000
commit4dcadf7efd58e9d91a52c5f06c02cb40bbf21823 (patch)
tree5968d1e9773c79cfe0db364ce91314087cb57f6e /tests/test-memory.c
parent5d6e26910b6790e7ea759893c16e9f0e380fcc1e (diff)
2004-05-13 Paul Jakma <paul@dishone.st>
* test-buffer.c: Andrew's buffer tester * test-memory.c: basic memory tester * Makefile.am: Add new tests
Diffstat (limited to 'tests/test-memory.c')
-rw-r--r--tests/test-memory.c103
1 files changed, 103 insertions, 0 deletions
diff --git a/tests/test-memory.c b/tests/test-memory.c
new file mode 100644
index 00000000..2971160b
--- /dev/null
+++ b/tests/test-memory.c
@@ -0,0 +1,103 @@
+#include <zebra.h>
+#include <memory.h>
+
+/* Memory torture tests
+ *
+ * Tests below are generic but comments are focused on interaction with
+ * Paul's proposed memory 'quick' cache, which may never be included in
+ * CVS
+ */
+
+struct thread_master *master;
+
+#if 0 /* set to 1 to use system alloc directly */
+#undef XMALLOC
+#undef XCALLOC
+#undef XREALLOC
+#undef XFREE
+#define XMALLOC(T,S) malloc((S))
+#define XCALLOC(T,S) calloc(1, (S))
+#define XREALLOC(T,P,S) realloc((P),(S))
+#define XFREE(T,P) free((P))
+#endif
+
+#define TIMES 10
+
+int
+main(int argc, char **argv)
+{
+ void *a[10];
+ int i;
+
+ printf ("malloc x, malloc x, free, malloc x, free free\n\n");
+ /* simple case, test cache */
+ for (i = 0; i < TIMES; i++)
+ {
+ a[0] = XMALLOC (MTYPE_VTY, 1024);
+ memset (a[0], 1, 1024);
+ a[1] = XMALLOC (MTYPE_VTY, 1024);
+ memset (a[1], 1, 1024);
+ XFREE(MTYPE_VTY, a[0]); /* should go to cache */
+ a[0] = XMALLOC (MTYPE_VTY, 1024); /* should be satisfied from cache */
+ XFREE(MTYPE_VTY, a[0]);
+ XFREE(MTYPE_VTY, a[1]);
+ }
+
+ printf ("malloc x, malloc y, free x, malloc y, free free\n\n");
+ /* cache should go invalid, valid, invalid, etc.. */
+ for (i = 0; i < TIMES; i++)
+ {
+ a[0] = XMALLOC (MTYPE_VTY, 512);
+ memset (a[0], 1, 512);
+ a[1] = XMALLOC (MTYPE_VTY, 1024); /* invalidate cache */
+ memset (a[1], 1, 1024);
+ XFREE(MTYPE_VTY, a[0]);
+ a[0] = XMALLOC (MTYPE_VTY, 1024);
+ XFREE(MTYPE_VTY, a[0]);
+ XFREE(MTYPE_VTY, a[1]);
+ /* cache should become valid again on next request */
+ }
+
+ printf ("calloc\n\n");
+ /* test calloc */
+ for (i = 0; i < TIMES; i++)
+ {
+ a[0] = XCALLOC (MTYPE_VTY, 1024);
+ memset (a[0], 1, 1024);
+ a[1] = XCALLOC (MTYPE_VTY, 512); /* invalidate cache */
+ memset (a[1], 1, 512);
+ XFREE(MTYPE_VTY, a[1]);
+ XFREE(MTYPE_VTY, a[0]);
+ /* alloc == 0, cache can become valid again on next request */
+ }
+
+ printf ("calloc and realloc\n\n");
+ /* check calloc + realloc */
+ for (i = 0; i < TIMES; i++)
+ {
+ printf ("calloc a0 1024\n");
+ a[0] = XCALLOC (MTYPE_VTY, 1024);
+ memset (a[0], 1, 1024/2);
+
+ printf ("calloc 1 1024\n");
+ a[1] = XCALLOC (MTYPE_VTY, 1024);
+ memset (a[1], 1, 1024/2);
+
+ printf ("realloc 0 1024\n");
+ a[3] = XREALLOC (MTYPE_VTY, a[0], 2048); /* invalidate cache */
+ if (a[3] != NULL)
+ a[0] = a[3];
+ memset (a[0], 1, 1024);
+
+ printf ("calloc 2 512\n");
+ a[2] = XCALLOC (MTYPE_VTY, 512);
+ memset (a[2], 1, 512);
+
+ printf ("free 1 0 2\n");
+ XFREE(MTYPE_VTY, a[1]);
+ XFREE(MTYPE_VTY, a[0]);
+ XFREE(MTYPE_VTY, a[2]);
+ /* alloc == 0, cache valid next request */
+ }
+ return 0;
+}