]> rtime.felk.cvut.cz Git - frescor/streamer.git/commitdiff
Added signals blocking and waiting to cancel contracts on SIGINT and SIGTERM.
authorPavel Pisa <pi@baree.pikron.com>
Wed, 27 May 2009 11:23:34 +0000 (13:23 +0200)
committerPavel Pisa <pi@baree.pikron.com>
Wed, 27 May 2009 11:23:34 +0000 (13:23 +0200)
Signed-off-by: Pavel Pisa <pi@baree.pikron.com>
streamer.c

index eb8adde59b6c2a1d06fa686fda07c2917806f0bd..c3a05697938f3444319c5c3db6b138b03a35a2fc 100644 (file)
@@ -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;