1*9c5db199SXin Liimport os 2*9c5db199SXin Liimport logging 3*9c5db199SXin Li 4*9c5db199SXin Li 5*9c5db199SXin Liclass PidFileManager(object): 6*9c5db199SXin Li def __init__(self, label, results_dir): 7*9c5db199SXin Li self.path = os.path.join(results_dir, ".%s_execute" % label) 8*9c5db199SXin Li self.pid_file = None 9*9c5db199SXin Li self.num_tests_failed = 0 10*9c5db199SXin Li 11*9c5db199SXin Li 12*9c5db199SXin Li def open_file(self): 13*9c5db199SXin Li self.pid_file = open(self.path, "w") 14*9c5db199SXin Li self.pid_file.write("%s\n" % os.getpid()) 15*9c5db199SXin Li self.pid_file.flush() 16*9c5db199SXin Li logging.info("Logged pid %s to %s", os.getpid(), self.path) 17*9c5db199SXin Li 18*9c5db199SXin Li 19*9c5db199SXin Li def close_file(self, exit_code, signal_code=0): 20*9c5db199SXin Li if not self.pid_file: 21*9c5db199SXin Li return 22*9c5db199SXin Li pid_file = self.pid_file 23*9c5db199SXin Li self.pid_file = None 24*9c5db199SXin Li encoded_exit_code = ((exit_code & 0xFF) << 8) | (signal_code & 0xFF) 25*9c5db199SXin Li pid_file.write("%s\n" % encoded_exit_code) 26*9c5db199SXin Li pid_file.write("%s\n" % self.num_tests_failed) 27*9c5db199SXin Li pid_file.close() 28