better(?) polling
This commit is contained in:
parent
b8076256cb
commit
f455d9f4d6
@ -462,11 +462,27 @@ def main():
|
|||||||
stderr_logger = proc_logger.getChild("stderr")
|
stderr_logger = proc_logger.getChild("stderr")
|
||||||
|
|
||||||
poll = select.poll()
|
poll = select.poll()
|
||||||
poll.register(proc.stdin, select.POLLOUT | select.POLLHUP)
|
poll.register(
|
||||||
poll.register(proc.stdout, select.POLLIN | select.POLLHUP)
|
proc.stdin, select.POLLOUT | select.POLLHUP | select.POLLERR
|
||||||
poll.register(proc.stderr, select.POLLIN | select.POLLHUP)
|
)
|
||||||
|
poll.register(
|
||||||
|
proc.stdout,
|
||||||
|
select.POLLIN
|
||||||
|
| select.POLLPRI
|
||||||
|
| select.POLLHUP
|
||||||
|
| select.POLLERR,
|
||||||
|
)
|
||||||
|
poll.register(
|
||||||
|
proc.stderr,
|
||||||
|
select.POLLIN
|
||||||
|
| select.POLLPRI
|
||||||
|
| select.POLLHUP
|
||||||
|
| select.POLLERR,
|
||||||
|
)
|
||||||
pollc = 3
|
pollc = 3
|
||||||
events = poll.poll(500)
|
logger.debug("First poll...")
|
||||||
|
events = poll.poll()
|
||||||
|
logger.debug("Done, %d events", len(events))
|
||||||
while pollc > 0 and len(events) > 0:
|
while pollc > 0 and len(events) > 0:
|
||||||
for rfd, event in events:
|
for rfd, event in events:
|
||||||
if event & select.POLLOUT:
|
if event & select.POLLOUT:
|
||||||
@ -479,13 +495,20 @@ def main():
|
|||||||
logger.debug("Done")
|
logger.debug("Done")
|
||||||
else:
|
else:
|
||||||
proc.stdin.close()
|
proc.stdin.close()
|
||||||
if event & select.POLLIN:
|
if event & select.POLLIN or event & select.POLLPRI:
|
||||||
if rfd == proc.stdout.fileno():
|
if rfd == proc.stdout.fileno():
|
||||||
if line := proc.stdout.readline():
|
if line := proc.stdout.readline():
|
||||||
stdout_logger.info(line[:-1])
|
stdout_logger.info(line[:-1])
|
||||||
if rfd == proc.stderr.fileno():
|
if rfd == proc.stderr.fileno():
|
||||||
if line := proc.stderr.readline():
|
if line := proc.stderr.readline():
|
||||||
stderr_logger.info(line[:-1])
|
stderr_logger.info(line[:-1])
|
||||||
|
if event & select.POLLERR:
|
||||||
|
if rfd == proc.stdin.fileno():
|
||||||
|
logger.error("STDIN error")
|
||||||
|
if rfd == proc.stdout.fileno():
|
||||||
|
logger.error("STDOUT error")
|
||||||
|
if rfd == proc.stderr.fileno():
|
||||||
|
logger.error("STDERR error")
|
||||||
if event & select.POLLHUP:
|
if event & select.POLLHUP:
|
||||||
if rfd == proc.stdin.fileno():
|
if rfd == proc.stdin.fileno():
|
||||||
logger.debug("STDIN closed")
|
logger.debug("STDIN closed")
|
||||||
@ -497,12 +520,19 @@ def main():
|
|||||||
pollc -= 1
|
pollc -= 1
|
||||||
|
|
||||||
if pollc > 0:
|
if pollc > 0:
|
||||||
events = poll.poll(500)
|
logger.debug("Poll...")
|
||||||
|
events = poll.poll()
|
||||||
|
logger.debug("Done, %d events", len(events))
|
||||||
|
else:
|
||||||
|
logger.debug("Nothing left to poll")
|
||||||
|
events = []
|
||||||
|
|
||||||
for handler in proc_logger.handlers:
|
for handler in proc_logger.handlers:
|
||||||
handler.flush()
|
handler.flush()
|
||||||
|
|
||||||
|
logger.debug("Waiting on subprocess...")
|
||||||
ret = proc.wait()
|
ret = proc.wait()
|
||||||
|
logger.debug("Done")
|
||||||
if ret != 0:
|
if ret != 0:
|
||||||
raise Exception(f"borg subprocess exited with returncode {ret}")
|
raise Exception(f"borg subprocess exited with returncode {ret}")
|
||||||
finally:
|
finally:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user