1
1
#define _POSIX_C_SOURCE 200112L
2
+ #define _GNU_SOURCE
2
3
3
4
#include <assert.h>
4
5
#include <errno.h>
@@ -88,7 +89,7 @@ int main()
88
89
exit (EXIT_FAILURE );
89
90
}
90
91
91
- char * data , * sddata ;
92
+ char * data , * sddata , * complete_req ;
92
93
int n , fd , res , size , sdsize , rs , result ;
93
94
struct epoll_ctl_info epci = {epollfd , 0 , 0 };
94
95
struct queue * rcqu = NULL , * sdqu = NULL ;
@@ -116,9 +117,8 @@ int main()
116
117
}
117
118
118
119
// Receive all the data into the queue
119
- log_trace ("main epoll loop: handling POLLIN event on fd '%d'" , fd );
120
120
res = recv_request (fd , rcqu );
121
- size = queue_pop_no_copy ( rcqu , & data );
121
+ log_trace ( "main epoll loop: handling POLLIN event on fd '%d' with res: '%d'" , fd , res );
122
122
123
123
// Handle error case while recv data
124
124
if (res < -1 ) {
@@ -131,9 +131,18 @@ int main()
131
131
continue ;
132
132
}
133
133
134
- // Handle there's data to process
134
+ // Peek at the data to check if we have at least one complete request
135
+ complete_req = NULL ;
136
+ size = queue_peek (rcqu , & data );
135
137
if (size > 0 ) {
136
- log_trace ("main epoll loop: raw request(%d): '%s'" , fd , data );
138
+ complete_req = (char * ) memrchr (data , PRIME_REQUEST_DELIMITERS [0 ], size );
139
+ log_trace ("main epoll loop: complete_req = '%d'" , (complete_req == NULL ? 0 : 1 ));
140
+ }
141
+
142
+ // If we do, process it
143
+ if (complete_req != NULL ) {
144
+ size = queue_pop_no_copy (rcqu , & data );
145
+ log_trace ("main epoll loop: raw request: fd: '%d', size: '%d', data: '%s'" , fd , size , data );
137
146
result = handle_request (sdqu , data , (size_t )size );
138
147
sdsize = queue_pop_no_copy (sdqu , & sddata );
139
148
rs = sendall (fd , sddata , & sdsize );
0 commit comments