From: Zac Medico Date: Mon, 12 Jan 2009 08:28:04 +0000 (-0000) Subject: If necessary, use /proc/loadavg to emulate os.getloadavg(). (trunk r12422) X-Git-Tag: v2.1.6.5~9 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=dd253e773b1aead47afa95c2aabec1bf58c49088;p=portage.git If necessary, use /proc/loadavg to emulate os.getloadavg(). (trunk r12422) svn path=/main/branches/2.1.6/; revision=12478 --- diff --git a/pym/_emerge/__init__.py b/pym/_emerge/__init__.py index adb740cd1..14590a5e0 100644 --- a/pym/_emerge/__init__.py +++ b/pym/_emerge/__init__.py @@ -8935,6 +8935,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): @@ -8982,11 +9005,8 @@ class PollScheduler(object): (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: @@ -9367,9 +9387,9 @@ class JobStatusDisplay(object): 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)