summaryrefslogtreecommitdiffstats
path: root/bitbake/lib
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib')
-rw-r--r--bitbake/lib/prserv/serv.py34
1 files changed, 31 insertions, 3 deletions
diff --git a/bitbake/lib/prserv/serv.py b/bitbake/lib/prserv/serv.py
index 05074854a2..5c0ffb9925 100644
--- a/bitbake/lib/prserv/serv.py
+++ b/bitbake/lib/prserv/serv.py
@@ -97,6 +97,13 @@ class PRServer(SimpleXMLRPCServer):
97 self.table.sync() 97 self.table.sync()
98 self.table.sync_if_dirty() 98 self.table.sync_if_dirty()
99 99
100 def sigint_handler(self, signum, stack):
101 self.table.sync()
102
103 def sigterm_handler(self, signum, stack):
104 self.table.sync()
105 raise SystemExit
106
100 def process_request(self, request, client_address): 107 def process_request(self, request, client_address):
101 self.requestqueue.put((request, client_address)) 108 self.requestqueue.put((request, client_address))
102 109
@@ -147,7 +154,11 @@ class PRServer(SimpleXMLRPCServer):
147 return 154 return
148 155
149 def start(self): 156 def start(self):
150 pid = self.daemonize() 157 if self.daemon:
158 pid = self.daemonize()
159 else:
160 pid = self.fork()
161
151 # Ensure both the parent sees this and the child from the work_forever log entry above 162 # Ensure both the parent sees this and the child from the work_forever log entry above
152 logger.info("Started PRServer with DBfile: %s, IP: %s, PORT: %s, PID: %s" % 163 logger.info("Started PRServer with DBfile: %s, IP: %s, PORT: %s, PID: %s" %
153 (self.dbfile, self.host, self.port, str(pid))) 164 (self.dbfile, self.host, self.port, str(pid)))
@@ -180,6 +191,24 @@ class PRServer(SimpleXMLRPCServer):
180 except OSError as e: 191 except OSError as e:
181 raise Exception("%s [%d]" % (e.strerror, e.errno)) 192 raise Exception("%s [%d]" % (e.strerror, e.errno))
182 193
194 self.cleanup_handles()
195 os._exit(0)
196
197 def fork(self):
198 try:
199 pid = os.fork()
200 if pid > 0:
201 return pid
202 except OSError as e:
203 raise Exception("%s [%d]" % (e.strerror, e.errno))
204
205 bb.utils.signal_on_parent_exit("SIGTERM")
206 self.cleanup_handles()
207 os._exit(0)
208
209 def cleanup_handles(self):
210 signal.signal(signal.SIGINT, self.sigint_handler)
211 signal.signal(signal.SIGTERM, self.sigterm_handler)
183 os.umask(0) 212 os.umask(0)
184 os.chdir("/") 213 os.chdir("/")
185 214
@@ -212,7 +241,6 @@ class PRServer(SimpleXMLRPCServer):
212 241
213 self.work_forever() 242 self.work_forever()
214 self.delpid() 243 self.delpid()
215 os._exit(0)
216 244
217class PRServSingleton(object): 245class PRServSingleton(object):
218 def __init__(self, dbfile, logfile, interface): 246 def __init__(self, dbfile, logfile, interface):
@@ -223,7 +251,7 @@ class PRServSingleton(object):
223 self.port = None 251 self.port = None
224 252
225 def start(self): 253 def start(self):
226 self.prserv = PRServer(self.dbfile, self.logfile, self.interface) 254 self.prserv = PRServer(self.dbfile, self.logfile, self.interface, daemon=False)
227 self.prserv.start() 255 self.prserv.start()
228 self.host, self.port = self.prserv.getinfo() 256 self.host, self.port = self.prserv.getinfo()
229 257