Skip to content

Commit 97afe99

Browse files
committed
perf: use queue for response
- Tests passing
1 parent 7b20faa commit 97afe99

File tree

4 files changed

+56
-29
lines changed

4 files changed

+56
-29
lines changed

source/prime-time/is-prime-request.c

+14-9
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,23 @@
2121
#include <json-c/json_tokener.h>
2222

2323
#include "log/log.h"
24+
#include "utils/queue.h"
2425

2526
#include "prime-time/is-prime-request.h"
2627

2728
#define DELIMITERS "\n"
2829

2930
/// Return the number of requests processed
30-
int is_prime_request_builder(struct is_prime_request** request,
31+
int is_prime_request_builder(struct queue *sdq, struct is_prime_request** request,
3132
char* raw_request,
3233
size_t req_size)
3334
{
35+
assert(sdq != NULL);
3436
assert(raw_request != NULL);
3537
assert(req_size > 0);
3638

3739
bool malformed;
38-
int j = 1;
40+
int j = 1, size;
3941
char *str1 = raw_request, *token, *saveptr1;
4042
struct is_prime_request* prev;
4143

@@ -45,7 +47,7 @@ int is_prime_request_builder(struct is_prime_request** request,
4547
if (token == NULL)
4648
break;
4749
// We have exceeded the request size
48-
if ((token - raw_request) >= req_size)
50+
if ((token - raw_request) >= (long) req_size)
4951
break;
5052

5153
// The very first request pointer should be the one passed
@@ -57,7 +59,8 @@ int is_prime_request_builder(struct is_prime_request** request,
5759

5860
malformed = is_prime_request_malformed(curr, token);
5961
is_prime_request_f(curr);
60-
is_prime_beget_response(curr);
62+
is_prime_beget_response(curr, sdq->head, &size);
63+
queue_push_ex(sdq, (size_t) size);
6164

6265
// Singly linked list logic
6366
if (j > 1)
@@ -187,21 +190,23 @@ void is_prime_request_f(struct is_prime_request *request)
187190
request->is_prime = true;
188191
}
189192

190-
void is_prime_beget_response(struct is_prime_request* request)
193+
void is_prime_beget_response(struct is_prime_request* request, char *response, int *size)
191194
{
192195
assert(request != NULL);
196+
assert(response != NULL);
197+
assert(size != NULL);
193198

194199
if (request->is_malformed) {
195-
request->resp_size = sprintf(request->response,
200+
*size = sprintf(response,
196201
PRIME_RESPONSE_FORMAT,
197202
PRIME_RESPONSE_ILL_RESPONSE);
198-
log_trace("is_prime_beget_response: '%s'", request->response);
203+
log_trace("is_prime_beget_response: '%s'", response);
199204
return;
200205
}
201-
request->resp_size = sprintf(request->response,
206+
*size = sprintf(response,
202207
PRIME_RESPONSE_FORMAT,
203208
(request->is_prime ? "true" : "false"));
204-
log_trace("is_prime_beget_response: '%s'", request->response);
209+
log_trace("is_prime_beget_response: '%s'", response);
205210
}
206211

207212
void is_prime_free(struct is_prime_request** request)

source/prime-time/is-prime-request.h

+2-4
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,18 @@ extern "C" {
1818
#endif
1919

2020
struct is_prime_request {
21-
size_t resp_size;
22-
char response[PRIME_MAX_RESPONSE_SIZE];
2321
bool is_prime;
2422
bool is_malformed;
2523
int number;
2624
struct is_prime_request* next;
2725
};
2826

29-
int is_prime_request_builder(struct is_prime_request** request,
27+
int is_prime_request_builder(struct queue *sdq, struct is_prime_request** request,
3028
char* raw_request,
3129
size_t req_size);
3230
bool is_prime_request_malformed(struct is_prime_request *request, char* req);
3331
void is_prime_request_f(struct is_prime_request *request);
34-
void is_prime_beget_response(struct is_prime_request* request);
32+
void is_prime_beget_response(struct is_prime_request* request, char *response, int *size);
3533
void is_prime_init(struct is_prime_request** request);
3634
void is_prime_free(struct is_prime_request** request);
3735

test/is-prime/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11

22
add_executable(is-prime-test
33
"${CMAKE_SOURCE_DIR}/source/log/log.c"
4+
"${CMAKE_SOURCE_DIR}/source/utils/queue.c"
45
"${CMAKE_SOURCE_DIR}/source/prime-time/is-prime-request.c"
56
is-prime-request-test.cpp
67
)

test/is-prime/is-prime-request-test.cpp

+39-16
Original file line numberDiff line numberDiff line change
@@ -21,94 +21,115 @@
2121
#include <catch2/catch.hpp>
2222
#include "prime-time/is-prime-request.h"
2323

24+
#include "utils/queue.h"
25+
2426
#define PRIME_TRUE "{\"method\":\"isPrime\",\"prime\":true}\n"
2527
#define PRIME_FALSE "{\"method\":\"isPrime\",\"prime\":false}\n"
2628
#define PRIME_MALFORMED \
2729
"{\"method\":\"isPrime\",\"prime\":\"ill-formed-request!!!\"}\n"
2830

2931
TEST_CASE("is_prime_request_builder handles valid requests", "[request]")
3032
{
33+
char *data;
34+
int size;
3135
struct is_prime_request* request = NULL;
36+
struct queue *sdqu = NULL;
37+
queue_init(&sdqu, 1024);
38+
3239

3340
SECTION("Valid request with prime number")
3441
{
3542
char raw_request[] = "{\"method\":\"isPrime\",\"number\":17}\n";
36-
REQUIRE(is_prime_request_builder(&request, raw_request, strlen(raw_request))
43+
REQUIRE(is_prime_request_builder(sdqu, &request, raw_request, strlen(raw_request))
3744
== 1);
3845
REQUIRE(request != NULL);
3946
REQUIRE(request->number == 17);
4047
REQUIRE(request->is_prime == true);
4148
REQUIRE(request->is_malformed == false);
4249
REQUIRE(request->next == NULL);
43-
REQUIRE(strcmp(request->response, PRIME_TRUE) == 0);
50+
size = queue_pop_no_copy(sdqu, &data);
51+
REQUIRE(strncmp(data, PRIME_TRUE, size) == 0);
4452
}
4553

4654
SECTION("Valid request with non-prime number")
4755
{
4856
char raw_request[] = "{\"method\":\"isPrime\",\"number\":24}\n";
49-
REQUIRE(is_prime_request_builder(&request, raw_request, strlen(raw_request))
57+
REQUIRE(is_prime_request_builder(sdqu, &request, raw_request, strlen(raw_request))
5058
== 1);
5159
REQUIRE(request != NULL);
5260
REQUIRE(request->number == 24);
5361
REQUIRE(request->is_prime == false);
5462
REQUIRE(request->is_malformed == false);
5563
REQUIRE(request->next == NULL);
56-
REQUIRE(strcmp(request->response, PRIME_FALSE) == 0);
64+
size = queue_pop_no_copy(sdqu, &data);
65+
REQUIRE(strncmp(data, PRIME_FALSE, size) == 0);
5766
}
5867

5968
SECTION("Valid request with floating-point number")
6069
{
6170
char raw_request[] = "{\"method\":\"isPrime\",\"number\":17.5}\n";
62-
REQUIRE(is_prime_request_builder(&request, raw_request, strlen(raw_request))
71+
REQUIRE(is_prime_request_builder(sdqu, &request, raw_request, strlen(raw_request))
6372
== 1);
6473
REQUIRE(request != NULL);
6574
REQUIRE(request->is_prime == false);
6675
REQUIRE(request->is_malformed == true);
6776
REQUIRE(request->next == NULL);
68-
REQUIRE(strcmp(request->response, PRIME_MALFORMED) == 0);
77+
size = queue_pop_no_copy(sdqu, &data);
78+
REQUIRE(strncmp(data, PRIME_MALFORMED, size) == 0);
6979
}
7080

7181
SECTION(
7282
"Valid composite request with prime number; followed by non prime "
7383
"request")
7484
{
85+
char response[1024];
7586
char raw_request[] =
7687
"{\"method\":\"isPrime\",\"number\":17}\n{\"method\":\"isPrime\","
7788
"\"number\":24}\n";
78-
REQUIRE(is_prime_request_builder(&request, raw_request, strlen(raw_request))
89+
REQUIRE(is_prime_request_builder(sdqu, &request, raw_request, strlen(raw_request))
7990
== 2);
8091
REQUIRE(request != NULL);
8192
REQUIRE(request->number == 17);
8293
REQUIRE(request->is_prime == true);
8394
REQUIRE(request->is_malformed == false);
8495
REQUIRE(request->next != NULL);
85-
REQUIRE(strcmp(request->response, PRIME_TRUE) == 0);
8696
struct is_prime_request* next = request->next;
8797
REQUIRE(next->number == 24);
8898
REQUIRE(next->is_prime == false);
8999
REQUIRE(request->is_malformed == false);
90100
REQUIRE(next->next == NULL);
91-
REQUIRE(strcmp(next->response, PRIME_FALSE) == 0);
101+
102+
sprintf(response, "%s%s", PRIME_TRUE, PRIME_FALSE);
103+
size = queue_pop_no_copy(sdqu, &data);
104+
REQUIRE(strncmp(data, response, size) == 0);
92105
}
93106

94107
if (request)
95108
is_prime_free(&request);
109+
if (sdqu)
110+
queue_free(&sdqu);
96111
}
97112

98113
TEST_CASE("is_prime_request_builder handles invalid requests", "[request]")
99114
{
115+
char *data;
116+
int size;
100117
struct is_prime_request* request = NULL;
118+
struct queue *sdqu = NULL;
119+
queue_init(&sdqu, 1024);
120+
char response[1024];
101121

102122
SECTION("Valid request with prime number")
103123
{
104124
char raw_request[] = "{\"method\":\"isPrime\",\"number\":\"foo\"}\n";
105-
REQUIRE(is_prime_request_builder(&request, raw_request, strlen(raw_request))
125+
REQUIRE(is_prime_request_builder(sdqu, &request, raw_request, strlen(raw_request))
106126
== 1);
107127
REQUIRE(request != NULL);
108128
REQUIRE(request->is_prime == false);
109129
REQUIRE(request->is_malformed == true);
110130
REQUIRE(request->next == NULL);
111-
REQUIRE(strcmp(request->response, PRIME_MALFORMED) == 0);
131+
size = queue_pop_no_copy(sdqu, &data);
132+
REQUIRE(strncmp(data, PRIME_MALFORMED, size) == 0);
112133
}
113134

114135
SECTION(
@@ -121,36 +142,38 @@ TEST_CASE("is_prime_request_builder handles invalid requests", "[request]")
121142
"{\"method\":\"isPrime\",\"number\":13}\n"
122143
"{\"method\":\"isPrime\",\"number\":\"hola\"}\n"
123144
"{\"method\":\"isPrime\",\"number\":23}\n";
124-
REQUIRE(is_prime_request_builder(&request, raw_request, strlen(raw_request))
145+
REQUIRE(is_prime_request_builder(sdqu, &request, raw_request, strlen(raw_request))
125146
== 4);
126147
REQUIRE(request != NULL);
127148
REQUIRE(request->number == 72727);
128149
REQUIRE(request->is_prime == true);
129150
REQUIRE(request->is_malformed == false);
130151
REQUIRE(request->next != NULL);
131-
REQUIRE(strcmp(request->response, PRIME_TRUE) == 0);
132152

133153
struct is_prime_request* next = request->next;
134154
REQUIRE(next->number == 24);
135155
REQUIRE(next->is_prime == false);
136156
REQUIRE(next->is_malformed == false);
137157
REQUIRE(next->next != NULL);
138-
REQUIRE(strcmp(next->response, PRIME_FALSE) == 0);
139158

140159
next = next->next;
141160
REQUIRE(next->number == 13);
142161
REQUIRE(next->is_prime == true);
143162
REQUIRE(next->is_malformed == false);
144163
REQUIRE(next->next != NULL);
145-
REQUIRE(strcmp(next->response, PRIME_TRUE) == 0);
146164

147165
next = next->next;
148166
REQUIRE(next->is_prime == false);
149167
REQUIRE(next->is_malformed == true);
150168
REQUIRE(next->next == NULL);
151-
REQUIRE(strcmp(next->response, PRIME_MALFORMED) == 0);
169+
170+
sprintf(response, "%s%s%s%s", PRIME_TRUE, PRIME_FALSE, PRIME_TRUE, PRIME_MALFORMED);
171+
size = queue_pop_no_copy(sdqu, &data);
172+
REQUIRE(strncmp(data, response, size) == 0);
152173
}
153174

154175
if (request)
155176
is_prime_free(&request);
177+
if (sdqu)
178+
queue_free(&sdqu);
156179
}

0 commit comments

Comments
 (0)