t/memlock: sample utility to use X memory from Y threads
[fio.git] / t / memlock.c
diff --git a/t/memlock.c b/t/memlock.c
new file mode 100644 (file)
index 0000000..d9d586d
--- /dev/null
@@ -0,0 +1,58 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <pthread.h>
+
+static struct thread_data {
+       unsigned long mb;
+} td;
+
+static void *worker(void *data)
+{
+       struct thread_data *td = data;
+       unsigned long index;
+       size_t size;
+       char *buf;
+       int i, first = 1;
+
+       size = td->mb * 1024UL * 1024UL;
+       buf = malloc(size);
+
+       for (i = 0; i < 100000; i++) {
+               for (index = 0; index + 4096 < size; index += 4096)
+                       memset(&buf[index+512], 0x89, 512);
+               if (first) {
+                       printf("loop%d: did %lu MB\n", i+1, size/(1024UL*1024UL));
+                       first = 0;
+               }
+       }
+       return NULL;
+}
+
+int main(int argc, char *argv[])
+{
+       unsigned long mb, threads;
+       pthread_t *pthreads;
+       int i;
+
+       if (argc < 3) {
+               printf("%s: <mb per thread> <threads>\n", argv[0]);
+               return 1;
+       }
+
+       mb = strtoul(argv[1], NULL, 10);
+       threads = strtoul(argv[2], NULL, 10);
+
+       pthreads = calloc(threads, sizeof(pthread_t));
+       td.mb = mb;
+
+       for (i = 0; i < threads; i++)
+               pthread_create(&pthreads[i], NULL, worker, &td);
+
+       for (i = 0; i < threads; i++) {
+               void *ret;
+
+               pthread_join(pthreads[i], &ret);
+       }
+       return 0;
+}