Add simple stest smalloc tester
authorJens Axboe <jaxboe@fusionio.com>
Tue, 16 Aug 2011 07:56:27 +0000 (09:56 +0200)
committerJens Axboe <jaxboe@fusionio.com>
Tue, 16 Aug 2011 07:56:27 +0000 (09:56 +0200)
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
Makefile
t/stest.c [new file with mode: 0644]

index 40d47d5ef66329af53e8657cbbddf67737ee9205..3831ab8df2e74e740db99a665188e3326b6f6222 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -80,6 +80,9 @@ all: .depend $(PROGS) $(SCRIPTS)
 .c.o: .depend
        $(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) $(CPPFLAGS) $<
 
+t/stest: t/stest.o smalloc.o mutex.o
+       $(QUIET_CC)$(CC) $(LDFLAGS) $(CFLAGS) -o $@ t/stest.o smalloc.o mutex.o $(LIBS) $(LDFLAGS)
+
 fio: $(OBJS)
        $(QUIET_CC)$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(OBJS) $(LIBS) $(LDFLAGS)
 
diff --git a/t/stest.c b/t/stest.c
new file mode 100644 (file)
index 0000000..c179484
--- /dev/null
+++ b/t/stest.c
@@ -0,0 +1,84 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#include "../smalloc.h"
+#include "../flist.h"
+
+FILE *f_err;
+
+#define MAGIC1 0xa9b1c8d2
+#define MAGIC2 0xf0a1e9b3
+
+#define LOOPS  32
+
+struct elem {
+       unsigned int magic1;
+       struct flist_head list;
+       unsigned int magic2;
+};
+
+FLIST_HEAD(list);
+
+static int do_rand_allocs(void)
+{
+       unsigned int size, nr, rounds = 0;
+       unsigned long total;
+       struct elem *e;
+
+       while (rounds++ < LOOPS) {
+#ifdef STEST_SEED
+               srand(MAGIC1);
+#endif
+               nr = total = 0;
+               while (total < 128*1024*1024UL) {
+                       size = 8 * sizeof(struct elem) + (int) (999.0 * (rand() / (RAND_MAX + 1.0)));
+                       e = smalloc(size);
+                       if (!e) {
+                               printf("fail at %lu, size %u\n", total, size);
+                               break;
+                       }
+                       e->magic1 = MAGIC1;
+                       e->magic2 = MAGIC2;
+                       total += size;
+                       flist_add_tail(&e->list, &list);
+                       nr++;
+               }
+
+               printf("Got items: %u\n", nr);
+
+               while (!flist_empty(&list)) {
+                       e = flist_entry(list.next, struct elem, list);
+                       assert(e->magic1 == MAGIC1);
+                       assert(e->magic2 == MAGIC2);
+                       flist_del(&e->list);
+                       sfree(e);
+               }
+       }
+
+       return 0;
+}
+
+static int do_specific_alloc(unsigned long size)
+{
+       void *ptr;
+
+       ptr = smalloc(size);
+       sfree(ptr);
+       return 0;
+}
+
+int main(int argc, char *argv[])
+{
+       f_err = stderr;
+
+       sinit();
+
+       do_rand_allocs();
+
+       /* smalloc bug, commit 271067a6 */
+       do_specific_alloc(671386584);
+
+       scleanup();
+       return 0;
+}