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)
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_)