From 8607a39dc9d979713f9434839ed1aef2602276a1 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Sun, 11 Jan 2009 05:07:27 +0000 Subject: [PATCH] If necessary, use /proc/loadavg to emulate os.getloadavg(). svn path=/main/trunk/; revision=12422 --- pym/_emerge/__init__.py | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/pym/_emerge/__init__.py b/pym/_emerge/__init__.py index 30b4940651..38f55ecafc 100644 --- a/pym/_emerge/__init__.py +++ b/pym/_emerge/__init__.py @@ -8951,6 +8951,29 @@ def create_poll_instance(): return select.poll() return PollSelectAdapter() +getloadavg = getattr(os, "getloadavg", None) +if getloadavg is None: + def getloadavg(): + """ + Uses /proc/loadavg to emulate os.getloadavg(). + Raises OSError if the load average was unobtainable. + """ + try: + loadavg_str = open('/proc/loadavg').readline() + except IOError: + # getloadavg() is only supposed to raise OSError, so convert + raise OSError('unknown') + loadavg_split = loadavg_str.split() + if len(loadavg_split) < 3: + raise OSError('unknown') + loadavg_floats = [] + for i in xrange(3): + try: + loadavg_floats.append(float(loadavg_split[i])) + except ValueError: + raise OSError('unknown') + return tuple(loadavg_floats) + class PollScheduler(object): class _sched_iface_class(SlotObject): @@ -8998,11 +9021,8 @@ def _can_add_job(self): (max_jobs is True or max_jobs > 1) and \ self._running_job_count() >= 1: try: - avg1, avg5, avg15 = os.getloadavg() - except (AttributeError, OSError), e: - writemsg("!!! getloadavg() failed: %s\n" % (e,), - noiselevel=-1) - del e + avg1, avg5, avg15 = getloadavg() + except OSError: return False if avg1 >= max_load: @@ -9383,9 +9403,9 @@ def _property_change(self, name, old_value, new_value): def _load_avg_str(self): try: - avg = os.getloadavg() - except (AttributeError, OSError), e: - return str(e) + avg = getloadavg() + except OSError: + return 'unknown' max_avg = max(avg)