diff options
author | Zac Medico <zmedico@gentoo.org> | 2011-03-09 21:46:17 -0800 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2011-03-14 09:23:10 -0700 |
commit | 157382fae7b4b4c74a6f7ce319c602c269cc7e96 (patch) | |
tree | cceb7c5dc066497f37ce1d241d8773a7f55dcba6 /pym/_emerge/AbstractPollTask.py | |
parent | c1fba51ccab868d05f48fcc40bc2c959c9385e76 (diff) | |
download | portage-157382fae7b4b4c74a6f7ce319c602c269cc7e96.tar.gz portage-157382fae7b4b4c74a6f7ce319c602c269cc7e96.tar.bz2 portage-157382fae7b4b4c74a6f7ce319c602c269cc7e96.zip |
AbstractPollTask: log exceptional events
Previously, when AbstractPollTask receives a POLLERR or POLLNVAL event,
it would silently cancel the task. Now it will generate a message like
this:
!!! SpawnProcess received strange poll event: 8
The message is displayed via a new _log_poll_exception method, which
is overridden by AbstractEbuildProcess to log the message via elog.
This might help diagnose reported cases of SIGTERM signals killing
ebuild processes for no apparent reason:
http://code.google.com/p/chromium-os/issues/detail?id=12968
Diffstat (limited to 'pym/_emerge/AbstractPollTask.py')
-rw-r--r-- | pym/_emerge/AbstractPollTask.py | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/pym/_emerge/AbstractPollTask.py b/pym/_emerge/AbstractPollTask.py index 833ee3b4c..6cbf984b9 100644 --- a/pym/_emerge/AbstractPollTask.py +++ b/pym/_emerge/AbstractPollTask.py @@ -1,8 +1,10 @@ -# Copyright 1999-2010 Gentoo Foundation +# Copyright 1999-2011 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 import array +import logging +from portage.util import writemsg_level from _emerge.AsynchronousTask import AsynchronousTask from _emerge.PollConstants import PollConstants class AbstractPollTask(AsynchronousTask): @@ -39,9 +41,16 @@ class AbstractPollTask(AsynchronousTask): def _unregister(self): raise NotImplementedError(self) + def _log_poll_exception(self, event): + writemsg_level( + "!!! %s received strange poll event: %s\n" % \ + (self.__class__.__name__, event,), + level=logging.ERROR, noiselevel=-1) + def _unregister_if_appropriate(self, event): if self._registered: if event & self._exceptional_events: + self._log_poll_exception(event) self._unregister() self.cancel() elif event & PollConstants.POLLHUP: |