# HG changeset patch # User Yuya Nishihara # Date 1456720914 -32400 # Node ID 7f2313450e865e8822ef306e03341ab73d7450eb # Parent bc5d0e6fd9f37ad12f5736f535e6895572dd019f cmdserver: write channel header and payload by a single write() call This makes a channeledoutput thread-safe as long as the underlying fwrite() is thread-safe. Both POSIX and Windows implementations are documented as MT-safe. MT-safety is necessary to use ui.fout and ui.ferr in hgweb. diff -r bc5d0e6fd9f3 -r 7f2313450e86 mercurial/commandserver.py --- a/mercurial/commandserver.py Fri Mar 18 17:15:06 2016 -0700 +++ b/mercurial/commandserver.py Mon Feb 29 13:41:54 2016 +0900 @@ -54,8 +54,8 @@ def write(self, data): if not data: return - self.out.write(struct.pack('>cI', self.channel, len(data))) - self.out.write(data) + # single write() to guarantee the same atomicity as the underlying file + self.out.write(struct.pack('>cI', self.channel, len(data)) + data) self.out.flush() def __getattr__(self, attr):