diff options
Diffstat (limited to 'user/thunderbird/mach-linux-musl.patch')
-rw-r--r-- | user/thunderbird/mach-linux-musl.patch | 119 |
1 files changed, 0 insertions, 119 deletions
diff --git a/user/thunderbird/mach-linux-musl.patch b/user/thunderbird/mach-linux-musl.patch deleted file mode 100644 index 6bddf6ff6..000000000 --- a/user/thunderbird/mach-linux-musl.patch +++ /dev/null @@ -1,119 +0,0 @@ - -# HG changeset patch -# User Mike Hommey <mh+mozilla@glandium.org> -# Date 1502856976 -32400 -# Node ID 8d9ae8c45dd07496f164364f24c5f43edcf2eb6e -# Parent fa02d334033f0039ef82b3d7dc194312ba250279 -Bug 1384062 - Make SystemResourceMonitor.stop more resilient to errors. r=ahal,gps - -The poll() call in SystemResourceMonitor.stop might fail even though -there is something to read from the pipe, in some corner cases, and -python won't let us know about it. In that case, an exception is thrown, -leaving the SystemResourceMonitor (and its callers) in a weird state. In -practice, this leads BuildMonitor.__exit__ to recall stop, which then -fails. - -So when poll() throws an exception, we pretend there's still something -to read, and we try to read anyways. If there is something to read, -recv() will return it, otherwise, it will throw an exception of its own, -which we catch, pretending we're done. - -Furthermore, when there is nothing to read from the pipe, poll() simply -returns False, and our loop never sets `done` to True, and we then hit -an assert, which doesn't have its place here, so we remove it. - -Finally, the other end of the pipe might have died at any time, making -sending over the pipe fail, so we also protect against that. - -With all these changes, it feels like the reason to backout bug 1239939 -in bug 1272782 should have been dealt with, and we can drop the timeout -again. - -diff --git a/mozilla/testing/mozbase/mozsystemmonitor/mozsystemmonitor/resourcemonitor.py b/mozilla/testing/mozbase/mozsystemmonitor/mozsystemmonitor/resourcemonitor.py ---- a/mozilla/testing/mozbase/mozsystemmonitor/mozsystemmonitor/resourcemonitor.py -+++ b/mozilla/testing/mozbase/mozsystemmonitor/mozsystemmonitor/resourcemonitor.py -@@ -284,57 +284,71 @@ class SystemResourceMonitor(object): - """ - if not self._process: - self._stopped = True - return - - assert self._running - assert not self._stopped - -- self._pipe.send(('terminate',)) -+ try: -+ self._pipe.send(('terminate',)) -+ except Exception: -+ pass - self._running = False - self._stopped = True - - self.measurements = [] - -- done = False -- - # The child process will send each data sample over the pipe - # as a separate data structure. When it has finished sending - # samples, it sends a special "done" message to indicate it - # is finished. -- while self._pipe.poll(1.0): -- start_time, end_time, io_diff, cpu_diff, cpu_percent, virt_mem, \ -- swap_mem = self._pipe.recv() -+ -+ # multiprocessing.Pipe is not actually a pipe on at least Linux. that -+ # has an effect on the expected outcome of reading from it when the -+ # other end of the pipe dies, leading to possibly hanging on revc() -+ # below. So we must poll(). -+ def poll(): -+ try: -+ return self._pipe.poll(0.1) -+ except Exception: -+ # Poll might throw an exception even though there's still -+ # data to read. That happens when the underlying system call -+ # returns both POLLERR and POLLIN, but python doesn't tell us -+ # about it. So assume there is something to read, and we'll -+ # get an exception when trying to read the data. -+ return True -+ while poll(): -+ try: -+ start_time, end_time, io_diff, cpu_diff, cpu_percent, virt_mem, \ -+ swap_mem = self._pipe.recv() -+ except Exception: -+ # Let's assume we're done here -+ break - - # There should be nothing after the "done" message so - # terminate. - if start_time == 'done': -- done = True - break - - io = self._io_type(*io_diff) - virt = self._virt_type(*virt_mem) - swap = self._swap_type(*swap_mem) - cpu_times = [self._cpu_times_type(*v) for v in cpu_diff] - - self.measurements.append(SystemResourceUsage(start_time, end_time, - cpu_times, cpu_percent, io, virt, swap)) - - # We establish a timeout so we don't hang forever if the child - # process has crashed. - self._process.join(10) - if self._process.is_alive(): - self._process.terminate() - self._process.join(10) -- else: -- # We should have received a "done" message from the -- # child indicating it shut down properly. This only -- # happens if the child shuts down cleanly. -- assert done - - if len(self.measurements): - self.start_time = self.measurements[0].start - self.end_time = self.measurements[-1].end - - # Methods to record events alongside the monitored data. - - def record_event(self, name): - |