Exemplo n.º 1
0
class ForkDetector(threading.Thread):
    
    def __init__(self, spawmer):
        threading.Thread.__init__(self)
        open(_QUEUE_PATH_, _QUEUE_CHAR_)
        self.msgQueue = MessageQueue(_QUEUE_PATH_, _QUEUE_CHAR_, 0666, True)
        self.spawmer = spawmer
        self.eventHandler = publish_subscribe.eventHandler.EventHandler()
        self.pidToattach = []
        self.eventHandler.subscribe("debugger.attached", self.attached)
        
    def ObtenerID(self, msg):
        struct = unpack('<li', msg)
        return struct[1]
    
    def CrearRespuesta(self, pid):
        msg = pack('<li', pid, 0)
        return msg
    
    def salir(self):
        respuesta = pack('<li', 1, 1)
        self.msgQueue.push(respuesta)
        
    def attached(self, data):
        pid = data
        if pid in self.pidToattach:
            self.pidToattach.remove(pid)
            respuesta = self.CrearRespuesta(pid)
            self.msgQueue.push(respuesta)
        
    def run(self):
        while (True):
            msg = self.msgQueue.pull(type=1)
            pid = self.ObtenerID(msg)
            if pid == 1:
                del self.msgQueue
                return 0
            
            self.pidToattach.append(pid)
            self.eventHandler.publish("debugger.attach", pid)
Exemplo n.º 2
0
class ForkDetector(threading.Thread):
    
    def __init__(self):
        threading.Thread.__init__(self)
        open(_QUEUE_PATH_,'a')
        self.PID_of_forked = []
        self.PID_of_forked_lock = threading.Lock() 
        self.ev = publish_subscribe.eventHandler.EventHandler(name="ForkDetector")
        self.ev.subscribe('spawner.spawn_and_attach_completed', self.respondToForkedProcess)
        try:
            self.msgQueue = MessageQueue(_QUEUE_PATH_, _QUEUE_CHAR_, 0666, True)
        except:
            self.ev.publish("ERROR.forkDetector", {'info':"MSQ ya existente"})
            self.msgQueue = MessageQueue(_QUEUE_PATH_, _QUEUE_CHAR_, 0666, False)
    
    def respondToForkedProcess(self, data):
        pid = data['pid']

        self.PID_of_forked_lock.acquire() 
        if pid in self.PID_of_forked:
            msg = self.CrearMensaje(pid, 0)
            self.msgQueue.push(msg)
            self.PID_of_forked.remove(pid)
        self.PID_of_forked_lock.release()
            

    def ObtenerPID(self, msg):
#         print msg.encode('hex_codec')
#         print len(msg)

        struct = unpack(_STRUCT_FORMAT_, msg) 
        
#         print struct
        return struct[1]
    
    def CrearMensaje(self, mtype ,pid):
        msg = pack(_STRUCT_FORMAT_, mtype, pid)
        return msg
    
    def finalizar(self):
        if hasattr(self, 'msgQueue'):
            msg = pack(_STRUCT_FORMAT_, 1, 0)
#             print msg.encode('hex_codec')
#             print sys.getsizeof(msg)
            self.msgQueue.push(msg)
            
    def run(self):
        salir = False
        try:
            while (not salir): 
                msg = self.msgQueue.pull(type=1)
                pid = self.ObtenerPID(msg)
                if pid == 0:
                    salir = True
                else:
                    self.PID_of_forked_lock.acquire() 
                    self.PID_of_forked.append(pid)
                    self.PID_of_forked_lock.release()
                    self.ev.publish("spawner.add-debugger-and-attach.ForkDetector", {'pid': pid, "continue": True})

        except Exception as inst:
            print type(inst)
            print traceback.format_exc()
            self.msgQueue = None
            
        finally:
            del self.msgQueue
            os.remove(_QUEUE_PATH_)