11#define _POSIX_C_SOURCE 200112L
2+ #define _GNU_SOURCE
23
34#include <assert.h>
45#include <errno.h>
@@ -88,7 +89,7 @@ int main()
8889 exit (EXIT_FAILURE );
8990 }
9091
91- char * data , * sddata ;
92+ char * data , * sddata , * complete_req ;
9293 int n , fd , res , size , sdsize , rs , result ;
9394 struct epoll_ctl_info epci = {epollfd , 0 , 0 };
9495 struct queue * rcqu = NULL , * sdqu = NULL ;
@@ -116,9 +117,8 @@ int main()
116117 }
117118
118119 // Receive all the data into the queue
119- log_trace ("main epoll loop: handling POLLIN event on fd '%d'" , fd );
120120 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 );
122122
123123 // Handle error case while recv data
124124 if (res < -1 ) {
@@ -131,9 +131,18 @@ int main()
131131 continue ;
132132 }
133133
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 );
135137 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 );
137146 result = handle_request (sdqu , data , (size_t )size );
138147 sdsize = queue_pop_no_copy (sdqu , & sddata );
139148 rs = sendall (fd , sddata , & sdsize );
0 commit comments