From f2b080baabd65c941b8c887cf4ea877414623a3a Mon Sep 17 00:00:00 2001 From: Pavel Pisa Date: Wed, 27 May 2009 13:23:34 +0200 Subject: [PATCH] Added signals blocking and waiting to cancel contracts on SIGINT and SIGTERM. Signed-off-by: Pavel Pisa --- streamer.c | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/streamer.c b/streamer.c index eb8adde..c3a0569 100644 --- a/streamer.c +++ b/streamer.c @@ -108,12 +108,14 @@ static int args_parse(int argc, char *argv[]) return 0; } +int streamer_run_done_rq; + void* streamer_run(void* args) { int done; done = 0; - while (!done) { + while (!(done = streamer_run_done_rq)) { AVPacket *pkt; pkt = read_input_packet(s); if (pkt == NULL) { @@ -139,12 +141,31 @@ void* streamer_run(void* args) return NULL; } +void wait_for_ending_command(void) { + sigset_t sigset; + sigemptyset(&sigset); + sigaddset(&sigset, SIGINT); + sigaddset(&sigset, SIGTERM); + sigwaitinfo(&sigset, NULL); +} +static void block_signals(void) { + sigset_t sigset; + sigemptyset(&sigset); + sigaddset(&sigset, SIGINT); + sigaddset(&sigset, SIGTERM); + sigprocmask(SIG_BLOCK,&sigset,NULL); + pthread_sigmask(SIG_BLOCK,&sigset,NULL); +} + + int main(int argc, char *argv[]) { //long int cpu_budget, cpu_period; int ret; + block_signals(); + #ifdef CONFIG_STREAMER_WITH_FRSH ret = frsh_init(); if (ret) PERROR_AND_EXIT(ret, "frsh_init1"); @@ -212,8 +233,20 @@ int main(int argc, char *argv[]) ret = frsh_thread_create_and_bind(cpu_vres, &thread, &frsh_attr, streamer_run, (void*) NULL); if (ret) PERROR_AND_EXIT(ret, "frsh_thread_create_and_bind"); + + wait_for_ending_command(); + + streamer_run_done_rq = 1; pthread_join(thread.pthread_id, (void**) NULL); + + printf("Ending contracts\n"); + + ret = frsh_contract_cancel(cpu_vres); + if (ret) PERROR_AND_EXIT(ret, "frsh_contract_cancel"); + + printf("Finishing\n"); + #else pthread_attr_t attr; pthread_t streamer_th; @@ -223,7 +256,14 @@ int main(int argc, char *argv[]) ret = pthread_create(&streamer_th, &attr, streamer_run, (void*) NULL); if (ret) printf("Failed to create streamer thread\n."); + + wait_for_ending_command(); + + streamer_run_done_rq = 1; + pthread_join(streamer_th, (void**) NULL); + + printf("Finishing\n"); #endif return 0; -- 2.39.2