static int flags = MSG_DONTWAIT;
static int poll_timeout = 0;
static int custom;
+static int use_fork;
+static pid_t fork_pid;
static enum rs_optimization optimization;
static int size_option;
static int iterations = 1;
perror("raccept");
}
- set_options(rs);
+ if (use_fork)
+ fork_pid = fork();
+ if (!fork_pid)
+ set_options(rs);
return ret;
}
if (ret)
goto free;
- for (i = 0; i < TEST_CNT; i++) {
+ for (i = 0; i < TEST_CNT && !fork_pid; i++) {
if (test_size[i].option > size_option)
continue;
init_latency_test(test_size[i].size);
run_test();
}
- rs_shutdown(rs, SHUT_RDWR);
+ if (!fork_pid)
+ rs_shutdown(rs, SHUT_RDWR);
rs_close(rs);
+ if (!dst_addr && use_fork && !fork_pid)
+ goto free;
+
optimization = opt_bandwidth;
ret = dst_addr ? client_connect() : server_connect();
if (ret)
goto free;
- for (i = 0; i < TEST_CNT; i++) {
+ for (i = 0; i < TEST_CNT && !fork_pid; i++) {
if (test_size[i].option > size_option)
continue;
init_bandwidth_test(test_size[i].size);
if (ret)
goto free;
- ret = run_test();
+ if (!fork_pid)
+ ret = run_test();
}
- rs_shutdown(rs, SHUT_RDWR);
+ if (!fork_pid)
+ rs_shutdown(rs, SHUT_RDWR);
rs_close(rs);
free:
free(buf);
case 'b':
flags &= ~MSG_DONTWAIT;
break;
+ case 'f':
+ use_fork = 1;
+ use_rs = 0;
+ break;
case 'n':
flags |= MSG_DONTWAIT;
break;
flags |= MSG_DONTWAIT;
} else if (!strncasecmp("verify", optarg, 6)) {
verify = 1;
+ } else if (!strncasecmp("fork", optarg, 4)) {
+ use_fork = 1;
+ use_rs = 0;
} else {
return -1;
}
printf("\t s|sockets - use standard tcp/ip sockets\n");
printf("\t a|async - asynchronous operation (use poll)\n");
printf("\t b|blocking - use blocking calls\n");
+ printf("\t f|fork - fork server processing\n");
printf("\t n|nonblocking - use nonblocking calls\n");
printf("\t v|verify - verify data\n");
exit(1);