T_PIPE_ASYNC_OBJS = t/read-to-pipe-async.o
T_PIPE_ASYNC_PROGS = t/read-to-pipe-async
+T_MEMLOCK_OBJS = t/memlock.o
+T_MEMLOCK_PROGS = t/memlock
+
T_OBJS = $(T_SMALLOC_OBJS)
T_OBJS += $(T_IEEE_OBJS)
T_OBJS += $(T_ZIPF_OBJS)
T_OBJS += $(T_DEDUPE_OBJS)
T_OBJS += $(T_VS_OBJS)
T_OBJS += $(T_PIPE_ASYNC_OBJS)
+T_OBJS += $(T_MEMLOCK_OBJS)
ifneq (,$(findstring CYGWIN,$(CONFIG_TARGET_OS)))
T_DEDUPE_OBJS += os/windows/posix.o lib/hweight.o
t/read-to-pipe-async: $(T_PIPE_ASYNC_OBJS)
$(QUIET_LINK)$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(T_PIPE_ASYNC_OBJS) $(LIBS)
+t/memlock: $(T_MEMLOCK_OBJS)
+ $(QUIET_LINK)$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(T_MEMLOCK_OBJS) $(LIBS)
+
t/stest: $(T_SMALLOC_OBJS)
$(QUIET_LINK)$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(T_SMALLOC_OBJS) $(LIBS)
--- /dev/null
+#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;
+}