This repository was archived by the owner on Jun 30, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 164
/
Copy pathtest_perf.c
126 lines (107 loc) · 3.68 KB
/
test_perf.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <errno.h>
#include <signal.h>
#include <inttypes.h>
#include "internal.h"
#include "evhtp/evhtp.h"
static int num_threads = 0;
static char * baddr = "127.0.0.1";
static uint16_t bport = 8081;
static int backlog = 1024;
static int nodelay = 0;
static int defer_accept = 0;
static int reuse_port = 0;
static size_t payload_sz = 100;
static void
response_cb(evhtp_request_t * r, void * a)
{
evbuffer_add_reference(r->buffer_out,
(const char *)a, payload_sz, NULL, NULL);
evhtp_send_reply(r, EVHTP_RES_OK);
}
int
main(int argc, char ** argv)
{
extern char * optarg;
extern int optind;
extern int opterr;
extern int optopt;
int c;
while ((c = getopt(argc, argv, "t:a:p:b:ndrs:")) != -1)
{
switch (c) {
case 't':
num_threads = atoi(optarg);
break;
case 'a':
baddr = strdup(optarg);
break;
case 'p':
bport = atoi(optarg);
break;
case 'b':
backlog = atoll(optarg);
break;
case 'n':
nodelay = 1;
break;
case 'd':
defer_accept = 1;
break;
case 'r':
reuse_port = 1;
break;
case 's':
payload_sz = atoll(optarg);
break;
default:
fprintf(stdout, "Usage: %s [flags]\n", argv[0]);
fprintf(stdout, " -t <n> : number of worker threads [Default: %d]\n", num_threads);
fprintf(stdout, " -a <s> : bind address [Default: %s]\n", baddr);
fprintf(stdout, " -p <n> : bind port [Default: %d]\n", bport);
fprintf(stdout, " -b <b> : listen backlog [Default: %d]\n", backlog);
fprintf(stdout, " -s <n> : size of the response [Default: %zu]\n", payload_sz);
fprintf(stdout, " -n : disable nagle (nodelay) [Default: %s]\n", nodelay ? "true" : "false");
fprintf(stdout, " -d : enable deferred accept [Default: %s]\n", defer_accept ? "true" : "false");
fprintf(stdout, " -r : enable linux reuseport [Default: %s]\n", reuse_port ? "true" : "false");
exit(EXIT_FAILURE);
} /* switch */
}
{
struct event_base * evbase;
evhtp_t * htp;
char payload[payload_sz];
evbase = event_base_new();
evhtp_alloc_assert(evbase);
htp = evhtp_new(evbase, NULL);
evhtp_alloc_assert(htp);
evhtp_set_parser_flags(htp, EVHTP_PARSE_QUERY_FLAG_LENIENT);
if (nodelay)
{
evhtp_enable_flag(htp, EVHTP_FLAG_ENABLE_NODELAY);
}
if (defer_accept)
{
evhtp_enable_flag(htp, EVHTP_FLAG_ENABLE_DEFER_ACCEPT);
}
if (reuse_port)
{
evhtp_enable_flag(htp, EVHTP_FLAG_ENABLE_REUSEPORT);
}
memset(payload, 0x42, payload_sz);
evhtp_assert(evhtp_set_cb(htp, "/data", response_cb, payload));
#ifndef EVHTP_DISABLE_EVTHR
if (num_threads > 0)
{
evhtp_assert(evhtp_use_threads_wexit(htp, NULL, NULL, num_threads, NULL) != -1);
}
#endif
evhtp_errno_assert(evhtp_bind_socket(htp, baddr, bport, backlog) >= 0);
event_base_loop(evbase, 0);
}
return 0;
} /* main */