xref: /aosp_15_r20/external/autotest/client/common_lib/pidfile.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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