summaryrefslogtreecommitdiffstats
path: root/src/lib/kStuff/kLdr/tstkLdrHeap.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/kStuff/kLdr/tstkLdrHeap.c')
-rw-r--r--src/lib/kStuff/kLdr/tstkLdrHeap.c223
1 files changed, 223 insertions, 0 deletions
diff --git a/src/lib/kStuff/kLdr/tstkLdrHeap.c b/src/lib/kStuff/kLdr/tstkLdrHeap.c
new file mode 100644
index 0000000..a5891dd
--- /dev/null
+++ b/src/lib/kStuff/kLdr/tstkLdrHeap.c
@@ -0,0 +1,223 @@
+/* $Id: tstkLdrHeap.c 29 2009-07-01 20:30:29Z bird $ */
+/** @file
+ * kLdr - Heap testcase.
+ */
+
+/*
+ * Copyright (c) 2006-2007 Knut St. Osmundsen <bird-kStuff-spamix@anduin.net>
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*******************************************************************************
+* Header Files *
+*******************************************************************************/
+#include <k/kLdr.h>
+#include <k/kHlp.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+
+/*******************************************************************************
+* Defined Constants And Macros *
+*******************************************************************************/
+#define CHECK_FATAL(expr) \
+ do { if (!(expr)) { printf("tstkLdrHeap(%d): FATAL FAILURE - %s\n", __LINE__, #expr); return 1; } \
+ } while (0)
+
+#define CHECK(expr) \
+ do { if (!(expr)) { printf("tstkLdrHeap(%d): ERROR - %s\n", __LINE__, #expr); cErrors++; kHlpAssertBreakpoint();} \
+ } while (0)
+
+
+/**
+ * Get a random size.
+ * @returns random size.
+ */
+static unsigned RandSize(void)
+{
+ unsigned i = (unsigned)rand() % (256*1024 - 1);
+ return i ? i : 1;
+}
+
+/**
+ * Get a random index.
+ * @returns random index.
+ * @param cEntries The number of entries in the table.
+ */
+static unsigned RandIdx(unsigned cEntries)
+{
+ unsigned i = (unsigned)rand();
+ while (i >= cEntries)
+ i >>= 1;
+ return i;
+}
+
+#if 0
+# define kHlpAlloc(a) malloc(a)
+# define kHlpFree(a) free(a)
+#endif
+
+int main()
+{
+ int cErrors = 0;
+ int rc;
+#define MAX_ALLOCS 256
+ static struct
+ {
+ void *pv;
+ unsigned cb;
+ } s_aAllocs[MAX_ALLOCS];
+ unsigned cAllocs;
+ unsigned i;
+ unsigned j;
+
+ /*
+ * Some simple init / term.
+ */
+ rc = kHlpHeapInit();
+ CHECK_FATAL(!rc);
+ kHlpHeapTerm();
+
+ rc = kHlpHeapInit();
+ CHECK_FATAL(!rc);
+ kHlpHeapTerm();
+
+
+ /*
+ * Simple alloc all, free all in FIFO order.
+ */
+ rc = kHlpHeapInit();
+ CHECK_FATAL(!rc);
+
+ /* 1. allocate all slots. */
+ for (i = 0; i < MAX_ALLOCS; i++)
+ {
+ s_aAllocs[i].cb = RandSize();
+ s_aAllocs[i].pv = kHlpAlloc(s_aAllocs[i].cb);
+ CHECK(s_aAllocs[i].pv);
+ }
+
+ /* 2. free all slots. */
+ for (i = 0; i < MAX_ALLOCS; i++)
+ kHlpFree(s_aAllocs[i].pv);
+
+ /* terminate */
+ kHlpHeapTerm();
+
+
+ /*
+ * Simple alloc all, free all in LIFO order.
+ */
+ rc = kHlpHeapInit();
+ CHECK_FATAL(!rc);
+
+ /* 1. allocate all slots. */
+ for (i = 0; i < MAX_ALLOCS; i++)
+ {
+ s_aAllocs[i].cb = RandSize();
+ s_aAllocs[i].pv = kHlpAlloc(s_aAllocs[i].cb);
+ CHECK(s_aAllocs[i].pv);
+ }
+
+ /* 2. free all slots. */
+ i = MAX_ALLOCS;
+ while (i-- > 0)
+ kHlpFree(s_aAllocs[i].pv);
+
+ /* terminate */
+ kHlpHeapTerm();
+
+
+ /*
+ * Bunch of allocations, free half, allocate and free in pairs, free all.
+ */
+ rc = kHlpHeapInit();
+ CHECK_FATAL(!rc);
+
+ /* 1. allocate all slots. */
+ for (i = 0; i < MAX_ALLOCS; i++)
+ {
+ s_aAllocs[i].cb = RandSize();
+ s_aAllocs[i].pv = kHlpAlloc(s_aAllocs[i].cb);
+ CHECK(s_aAllocs[i].pv);
+ }
+ cAllocs = MAX_ALLOCS;
+
+ /* 2. free half (random order). */
+ while (cAllocs > MAX_ALLOCS / 2)
+ {
+ i = RandIdx(cAllocs);
+ kHlpFree(s_aAllocs[i].pv);
+ cAllocs--;
+ if (i != cAllocs)
+ s_aAllocs[i] = s_aAllocs[cAllocs];
+ }
+
+ /* 3. lots of alloc and free activity. */
+ for (j = 0; j < MAX_ALLOCS * 32; j++)
+ {
+ /* allocate */
+ unsigned cMax = RandIdx(MAX_ALLOCS / 4) + 1;
+ while (cAllocs < MAX_ALLOCS && cMax-- > 0)
+ {
+ i = cAllocs;
+ s_aAllocs[i].cb = RandSize();
+ s_aAllocs[i].pv = kHlpAlloc(s_aAllocs[i].cb);
+ CHECK(s_aAllocs[i].pv);
+ cAllocs++;
+ }
+
+ /* free */
+ cMax = RandIdx(MAX_ALLOCS / 4) + 1;
+ while (cAllocs > MAX_ALLOCS / 2 && cMax-- > 0)
+ {
+ i = RandIdx(cAllocs);
+ kHlpFree(s_aAllocs[i].pv);
+ cAllocs--;
+ if (i != cAllocs)
+ s_aAllocs[i] = s_aAllocs[cAllocs];
+ }
+ }
+
+ /* 4. free all */
+ while (cAllocs > 0)
+ {
+ i = RandIdx(cAllocs);
+ kHlpFree(s_aAllocs[i].pv);
+ cAllocs--;
+ if (i != cAllocs)
+ s_aAllocs[i] = s_aAllocs[cAllocs];
+ }
+
+ /* terminate */
+ kHlpHeapTerm();
+
+
+ /* summary */
+ if (!cErrors)
+ printf("tstkLdrHeap: SUCCESS\n");
+ else
+ printf("tstkLdrHeap: FAILURE - %d errors\n", cErrors);
+ return !!cErrors;
+}