diff options
author | Sander Vrijders <[email protected]> | 2016-11-19 15:46:07 +0000 |
---|---|---|
committer | Sander Vrijders <[email protected]> | 2016-11-19 15:46:07 +0000 |
commit | c39e0cbc5e5fd18625dea6522fbd389eb9dc871f (patch) | |
tree | 1489683642a77e8a860e88fecbc7484ea2ad901f /src/tools/operf/operf_client.c | |
parent | 1d39184abd7495bb3a2230ae8165bcf2cb2329fc (diff) | |
parent | 26b338bbb6d10ca19eabee2bcb0bdf9ef82bca63 (diff) | |
download | ouroboros-c39e0cbc5e5fd18625dea6522fbd389eb9dc871f.tar.gz ouroboros-c39e0cbc5e5fd18625dea6522fbd389eb9dc871f.zip |
Merged in dstaesse/ouroboros/be-operf (pull request #305)
tools: Use busy waiting in operf
Diffstat (limited to 'src/tools/operf/operf_client.c')
-rw-r--r-- | src/tools/operf/operf_client.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/src/tools/operf/operf_client.c b/src/tools/operf/operf_client.c index 1f6226d4..902a7b41 100644 --- a/src/tools/operf/operf_client.c +++ b/src/tools/operf/operf_client.c @@ -36,6 +36,17 @@ #include <errno.h> #include <float.h> +static void busy_wait_until(const struct timespec * deadline) +{ + struct timespec now; + clock_gettime(CLOCK_REALTIME, &now); + while (now.tv_sec < deadline->tv_sec) + clock_gettime(CLOCK_REALTIME, &now); + while (now.tv_sec == deadline->tv_sec + && now.tv_nsec < deadline->tv_nsec) + clock_gettime(CLOCK_REALTIME, &now); +} + void shutdown_client(int signo, siginfo_t * info, void * c) { (void) info; @@ -85,6 +96,7 @@ void * writer(void * o) struct timespec now; struct timespec start; struct timespec intv = {(gap / BILLION), gap % BILLION}; + struct timespec end = {0, 0}; char * buf = malloc(client.size); if (buf == NULL) @@ -123,6 +135,9 @@ void * writer(void * o) } } else { while (ts_diff_ms(&start, &now) < client.duration) { + clock_gettime(CLOCK_REALTIME, &now); + ts_add(&now, &intv, &end); + if (flow_write(*fdp, buf, client.size) == -1) { printf("Failed to send SDU.\n"); flow_dealloc(*fdp); @@ -131,10 +146,10 @@ void * writer(void * o) } ++client.sent; - - nanosleep(&intv, NULL); - - clock_gettime(CLOCK_REALTIME, &now); + if (client.sleep) + nanosleep(&intv, NULL); + else + busy_wait_until(&end); } } |