SignalApp.py 3.68 KB
Newer Older
German Leon's avatar
German Leon committed
1
2
3
4
5
6
import time
from classes.Logging import Logging
from threading  import Thread
from random import uniform

import common_parameters as cp  # All common parameters will bet at common_parameters module
German Leon's avatar
German Leon committed
7
import os,signal
German Leon's avatar
German Leon committed
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import sys

"""
Signal the app to stop so GDB can execute the script to flip a value
"""


class SignalApp(Thread):
    def __init__(self, signal_cmd, max_wait_time, log_path, unique_id, signals_to_send, init_sleep, syncro,waitfinish):
        global hang
        hang=False
        super(SignalApp, self).__init__()
        self.__signal_cmd = signal_cmd
        os.system("rm -f {}".format(log_path))
        self.__log = Logging(log_file=log_path, unique_id=unique_id)

        # Most of the benchmarks we cannot wait until the end of the processing
        # Considering most of 90% of the time
        #self.__init_wait_time = uniform(init_sleep, max_wait_time * cp.MAX_SIGNAL_BEFORE_ENDING)
        self.__init_wait_time = uniform(0, max_wait_time * cp.MAX_SIGNAL_BEFORE_ENDING)
        self.__signals_to_send = signals_to_send
        self.__time_to_sleep = (max_wait_time - self.__init_wait_time) / self.__signals_to_send
       # self.__time_to_sleep = (max_wait_time) / self.__signals_to_send
        self._syncro=syncro
        self._waitfinish=waitfinish
    def run(self):
        # Send a series of signal to make sure gdb will flip a value in one of the interrupt signals
        log_string = "Sending a signal using command: {} after {}s and each {}s.".format(self.__signal_cmd, self.__init_wait_time,self.__time_to_sleep)

        if cp.DEBUG:
German Leon's avatar
German Leon committed
38
            self.__log.info(log_string)
German Leon's avatar
German Leon committed
39
40
41
42
43
      
        # Sleep for a random time
#        time.sleep(self.__init_wait_time)
#a=[ uniform.randint(1,1000) for _ in range(self.__signals_to_send))]
#a.sort()
German Leon's avatar
German Leon committed
44
45
46
47
48
49
50
        #os.system(self.__signal_cmd)
        #for line in os.popen(self.__signal_cmd):
        #   pid=int(line)
        

       
        #os.kill(int(self.__signal_cmd),signal.SIGINT)
German Leon's avatar
German Leon committed
51
52
53
54
55
        self.__log.info(log_string)
        try:
           (self._syncro).wait()
        #except threading.BrokenBarrierError:
        except:	
German Leon's avatar
German Leon committed
56
          (self._syncro).abort()
German Leon's avatar
German Leon committed
57
58
59
60
61
62
63
64
          self.__log.info("Breakpoint inicial fuera de tiempo")
          #(self._waitfinish).wait()
          (self._syncro).reset()   
          hang=True
          self.__log.info("Timeout syncron of breakpoint\n")
        pid = (os.popen(self.__signal_cmd)).read()       
        pid=int(pid.split('\n')[0])
        #print("Comando {} y resultado {} de tipo {}".format(self.__signal_cmd,pid, type (pid)) )  
German Leon's avatar
German Leon committed
65
66
67
68
        # Time random
        #print ("INIT:"+str(self.__init_wait_time)+"sleep"+str())
        time.sleep(self.__init_wait_time)	   
        for signals in range(0, self.__signals_to_send):
German Leon's avatar
German Leon committed
69
70
71
72
73
74
            #os.system("{} > /dev/null 2>/dev/null".format(self.__signal_cmd))
            try:
              os.kill(pid,signal.SIGINT)
            except:
              self.__log.info("Process is dead")  
              break
German Leon's avatar
German Leon committed
75
            self.__log.info("sending signal {}".format(signals))
German Leon's avatar
German Leon committed
76
77
78
79
80
            try:
               (self._syncro).wait()
            except:	
               (self._syncro).abort()
               break
German Leon's avatar
German Leon committed
81
               #print("Breakpoint fuera de tiempo")
German Leon's avatar
German Leon committed
82
            (self._syncro).reset()   
German Leon's avatar
German Leon committed
83
            time.sleep(self.__time_to_sleep)
German Leon's avatar
German Leon committed
84
        #(self._syncro).reset() 
German Leon's avatar
German Leon committed
85
86
87
88
89
        try:
          (self._waitfinish).wait()
        #except  threading.BrokenBarrierError:
        except:	
          (self._waitfinish).abort()
German Leon's avatar
German Leon committed
90
          self.__log.info("Hang timeout execution")
German Leon's avatar
German Leon committed
91
92
93
94
95
96
97
98
          hang=True
          self.__log.info("Timeout execution programa")  
        (self._waitfinish).reset()

    def ishang (self):
        return hang
    def get_int_wait_time(self):
        return self.__init_wait_time