From cbbe0fcc9b39bd9a52d0bebc81dcca691040ec35 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Sat, 14 Mar 2015 19:45:01 +0100 Subject: [PATCH] serve: use os.write(stdout_fd, ...), fixes #233 this way, serve() is more consistent with the other code, which always uses os.read/write (not sys.std*.buffer.read/write). also: reduce code duplication a bit. --- attic/remote.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/attic/remote.py b/attic/remote.py index f2a0aed06..e60d9f718 100644 --- a/attic/remote.py +++ b/attic/remote.py @@ -30,17 +30,19 @@ def __init__(self, restrict_to_paths): self.restrict_to_paths = restrict_to_paths def serve(self): + stdin_fd = sys.stdin.fileno() + stdout_fd = sys.stdout.fileno() # Make stdin non-blocking - fl = fcntl.fcntl(sys.stdin.fileno(), fcntl.F_GETFL) - fcntl.fcntl(sys.stdin.fileno(), fcntl.F_SETFL, fl | os.O_NONBLOCK) + fl = fcntl.fcntl(stdin_fd, fcntl.F_GETFL) + fcntl.fcntl(stdin_fd, fcntl.F_SETFL, fl | os.O_NONBLOCK) # Make stdout blocking - fl = fcntl.fcntl(sys.stdout.fileno(), fcntl.F_GETFL) - fcntl.fcntl(sys.stdout.fileno(), fcntl.F_SETFL, fl & ~os.O_NONBLOCK) + fl = fcntl.fcntl(stdout_fd, fcntl.F_GETFL) + fcntl.fcntl(stdout_fd, fcntl.F_SETFL, fl & ~os.O_NONBLOCK) unpacker = msgpack.Unpacker(use_list=False) while True: - r, w, es = select.select([sys.stdin], [], [], 10) + r, w, es = select.select([stdin_fd], [], [], 10) if r: - data = os.read(sys.stdin.fileno(), BUFSIZE) + data = os.read(stdin_fd, BUFSIZE) if not data: return unpacker.feed(data) @@ -53,10 +55,9 @@ def serve(self): f = getattr(self.repository, method) res = f(*args) except Exception as e: - sys.stdout.buffer.write(msgpack.packb((1, msgid, e.__class__.__name__, e.args))) + os.write(stdout_fd, msgpack.packb((1, msgid, e.__class__.__name__, e.args))) else: - sys.stdout.buffer.write(msgpack.packb((1, msgid, None, res))) - sys.stdout.flush() + os.write(stdout_fd, msgpack.packb((1, msgid, None, res))) if es: return @@ -312,4 +313,4 @@ def get_many(self, keys): def cache_if_remote(repository): if isinstance(repository, RemoteRepository): return RepositoryCache(repository) - return repository \ No newline at end of file + return repository