SignalApp.py 3.82 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
import sys

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


class SignalApp(Thread):
German Leon's avatar
German Leon committed
16
17
    def __init__(self,file_connection, max_wait_time, log_path, unique_id, signals_to_send, init_sleep, syncro,waitfinish):
        global crashsystem,hang
German Leon's avatar
German Leon committed
18
19
        hang=False
        super(SignalApp, self).__init__()
German Leon's avatar
German Leon committed
20
        self.__file_connection = file_connection
German Leon's avatar
German Leon committed
21
22
23
24
25
26
27
28
29
30
31
32
33
34
        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
German Leon's avatar
German Leon committed
35
36
        #log_string = "Sending a signal using command: {} after {}s and each {}s.".format(self.__signal_cmd, self.__init_wait_time,self.__time_to_sleep)
        log_string = "Sending a signal  each {}s of {} times.".format(self.__time_to_sleep,self.__signals_to_send )
German Leon's avatar
German Leon committed
37
        if cp.DEBUG:
German Leon's avatar
German Leon committed
38
            self.__log.info(log_string)
German Leon's avatar
German Leon committed
39
        crashsystem=False
German Leon's avatar
German Leon committed
40
41
42
43
        try:
           (self._syncro).wait()
        #except threading.BrokenBarrierError:
        except:	
German Leon's avatar
German Leon committed
44
          (self._syncro).abort()
German Leon's avatar
German Leon committed
45
46
47
          self.__log.info("Breakpoint inicial fuera de tiempo")
          #(self._waitfinish).wait()
          (self._syncro).reset()   
German Leon's avatar
German Leon committed
48
49
50
          crashsystem=True
          return 
          #self.__log.info("Timeout syncron of breakpoint\n")
German Leon's avatar
German Leon committed
51
           
German Leon's avatar
German Leon committed
52
53
54
55
        pidf=open(self.__file_connection,"r")
        pid=int(pidf.read())
        pidf.close()
        
German Leon's avatar
German Leon committed
56
57
        time.sleep(self.__init_wait_time)	
        self.__log.info("Begin injection")   
German Leon's avatar
German Leon committed
58
        crash=False
German Leon's avatar
German Leon committed
59
        for signals in range(0, self.__signals_to_send):
German Leon's avatar
German Leon committed
60
61
62
            #os.system("{} > /dev/null 2>/dev/null".format(self.__signal_cmd))
            try:
              os.kill(pid,signal.SIGINT)
German Leon's avatar
German Leon committed
63
              self.__log.info("sending signal {}".format(signals))
German Leon's avatar
German Leon committed
64
            except:
German Leon's avatar
German Leon committed
65
66
67
              self.__log.info("Crash? o DeadLock")  
          
              print ("Voy por aqui")    
German Leon's avatar
German Leon committed
68
69
70
71
              (self._waitfinish).abort()
              (self._waitfinish).reset()
              (self._syncro).abort()
              (self._syncro).reset()  
German Leon's avatar
German Leon committed
72
73
74
75
              try:
                os.kill(pid,signal.SIGKILL)
              except:
                 self.__log.info("Process is dead")     
German Leon's avatar
German Leon committed
76
              crash=True
German Leon's avatar
German Leon committed
77
              break
German Leon's avatar
German Leon committed
78
            
German Leon's avatar
German Leon committed
79
80
81
82
#            try:
#               (self._syncro).wait()
#            except:	
#               (self._syncro).abort()
German Leon's avatar
German Leon committed
83
               #break
German Leon's avatar
German Leon committed
84
#            (self._syncro).reset()   
German Leon's avatar
German Leon committed
85
            time.sleep(self.__time_to_sleep)
German Leon's avatar
German Leon committed
86
        #(self._syncro).reset() 
German Leon's avatar
German Leon committed
87
88
89
90
91
92
93
94
95
        if not crash:
         try:
           (self._waitfinish).wait()
          #except  threading.BrokenBarrierError:
         except:	
           (self._waitfinish).abort()
           self.__log.info("Hang timeout execution")
           hang=True
           self.__log.info("Timeout execution programa")  
German Leon's avatar
German Leon committed
96
97
        else:
           print ("He salido por aqui")    
German Leon's avatar
German Leon committed
98
99
100
101
102
103
        (self._waitfinish).reset()

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