[Aggregator] Flush the requests' list at exit
Instead of just freeing the requests' list, output every request and free the list at the same time.
This commit is contained in:
parent
47103f3360
commit
d9344673b0
2
TODO.t2t
2
TODO.t2t
|
@ -82,8 +82,6 @@ Work to do in OwlPS
|
||||||
|
|
||||||
= Aggregator =
|
= Aggregator =
|
||||||
|
|
||||||
- Flush the requests' list when exiting.
|
|
||||||
|
|
||||||
- Rename ap_check_interval to something more meaningful
|
- Rename ap_check_interval to something more meaningful
|
||||||
(something like autocalibration_order_interval).
|
(something like autocalibration_order_interval).
|
||||||
|
|
||||||
|
|
|
@ -111,12 +111,14 @@ int read_loop(int sockfd) ;
|
||||||
void got_request(owl_captured_request request) ;
|
void got_request(owl_captured_request request) ;
|
||||||
|
|
||||||
void* monitor_requests(void *NULL_value) ;
|
void* monitor_requests(void *NULL_value) ;
|
||||||
|
void flush_request_list(FILE *const stream,
|
||||||
|
const int sockfd,
|
||||||
|
const struct sockaddr_in *const serv) ;
|
||||||
void output_request(request_list *const request_ptr,
|
void output_request(request_list *const request_ptr,
|
||||||
FILE *const stream,
|
FILE *const stream,
|
||||||
const int sockfd,
|
const int sockfd,
|
||||||
const struct sockaddr_in *const serv) ;
|
const struct sockaddr_in *const serv) ;
|
||||||
|
|
||||||
void free_request_list(void) ;
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
void print_request_list(void) ;
|
void print_request_list(void) ;
|
||||||
void print_request_info(request_info_list *info) ;
|
void print_request_info(request_info_list *info) ;
|
||||||
|
|
|
@ -180,7 +180,7 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
if (sockfd >= 0)
|
if (sockfd >= 0)
|
||||||
close(sockfd) ; // Close socket
|
close(sockfd) ; // Close socket
|
||||||
free_request_list() ;
|
assert(requests == NULL) ;
|
||||||
free_ap_list() ;
|
free_ap_list() ;
|
||||||
cfg_free(cfg) ; // Clean configuration
|
cfg_free(cfg) ; // Clean configuration
|
||||||
// Destroy semaphores:
|
// Destroy semaphores:
|
||||||
|
@ -649,6 +649,13 @@ void got_request(owl_captured_request request)
|
||||||
/* Add it in the list */
|
/* Add it in the list */
|
||||||
sem_wait(&lock_requests) ;
|
sem_wait(&lock_requests) ;
|
||||||
|
|
||||||
|
// Make sure we are still running once we've got the lock
|
||||||
|
if (! owl_run)
|
||||||
|
{
|
||||||
|
free(tmp_info) ;
|
||||||
|
goto end ;
|
||||||
|
}
|
||||||
|
|
||||||
tmp_request = requests ;
|
tmp_request = requests ;
|
||||||
if (requests == NULL) // If the request list does not exist,
|
if (requests == NULL) // If the request list does not exist,
|
||||||
{
|
{
|
||||||
|
@ -823,6 +830,7 @@ void* monitor_requests(void *NULL_value)
|
||||||
}
|
}
|
||||||
pthread_cleanup_push(&owl_close_file, &stream) ;
|
pthread_cleanup_push(&owl_close_file, &stream) ;
|
||||||
|
|
||||||
|
/* Main loop */
|
||||||
while (owl_run)
|
while (owl_run)
|
||||||
{
|
{
|
||||||
request_prev = NULL ;
|
request_prev = NULL ;
|
||||||
|
@ -890,6 +898,9 @@ void* monitor_requests(void *NULL_value)
|
||||||
owl_msleep(cfg_getint(cfg, "check_interval")) ;
|
owl_msleep(cfg_getint(cfg, "check_interval")) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Flush the requests' list prior to return */
|
||||||
|
flush_request_list(stream, sockfd, &serv) ;
|
||||||
|
|
||||||
/* Close output file & socket */
|
/* Close output file & socket */
|
||||||
pthread_cleanup_pop(1) ;
|
pthread_cleanup_pop(1) ;
|
||||||
pthread_cleanup_pop(1) ;
|
pthread_cleanup_pop(1) ;
|
||||||
|
@ -898,6 +909,40 @@ void* monitor_requests(void *NULL_value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prints and sends all the requests in the requests' list and frees
|
||||||
|
* the list.
|
||||||
|
*/
|
||||||
|
void flush_request_list(FILE *const stream,
|
||||||
|
const int sockfd,
|
||||||
|
const struct sockaddr_in *const serv)
|
||||||
|
{
|
||||||
|
request_list *next_request ;
|
||||||
|
|
||||||
|
if (VERBOSE_CHATTERBOX)
|
||||||
|
fprintf(stderr, "Flushing the requests' list...") ;
|
||||||
|
|
||||||
|
sem_wait(&lock_requests) ;
|
||||||
|
|
||||||
|
while (requests)
|
||||||
|
{
|
||||||
|
// If the request was not treated already, we print its data
|
||||||
|
if (requests->info != NULL)
|
||||||
|
output_request(requests, stream, sockfd, serv) ;
|
||||||
|
|
||||||
|
// Free the current request and jump to the next
|
||||||
|
next_request = requests->next ;
|
||||||
|
free(requests) ;
|
||||||
|
requests = next_request ;
|
||||||
|
}
|
||||||
|
|
||||||
|
sem_post(&lock_requests) ;
|
||||||
|
|
||||||
|
if (VERBOSE_CHATTERBOX)
|
||||||
|
fprintf(stderr, " Requests' list flushed.\n") ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prints a request to the output file and sends it to the aggregation
|
* Prints a request to the output file and sends it to the aggregation
|
||||||
* server. The request's info field is deleted.
|
* server. The request's info field is deleted.
|
||||||
|
@ -1002,31 +1047,6 @@ void output_request(request_list *const request_ptr,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Empties the request list.
|
|
||||||
* Note that this function does not use lock_requests, so it should not
|
|
||||||
* be called in a concurrent context.
|
|
||||||
*/
|
|
||||||
void free_request_list()
|
|
||||||
{
|
|
||||||
request_list *next_request ;
|
|
||||||
request_info_list *next_request_info ;
|
|
||||||
|
|
||||||
while (requests != NULL)
|
|
||||||
{
|
|
||||||
while (requests->info != NULL)
|
|
||||||
{
|
|
||||||
next_request_info = requests->info->next ;
|
|
||||||
free(requests->info) ;
|
|
||||||
requests->info = next_request_info ;
|
|
||||||
}
|
|
||||||
next_request = requests->next ;
|
|
||||||
free(requests) ;
|
|
||||||
requests = next_request ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
/*
|
/*
|
||||||
* Prints the request list.
|
* Prints the request list.
|
||||||
|
|
Loading…
Reference in New Issue