If necessary, use /proc/loadavg to emulate os.getloadavg(). (trunk r12422)
authorZac Medico <zmedico@gentoo.org>
Mon, 12 Jan 2009 08:28:04 +0000 (08:28 -0000)
committerZac Medico <zmedico@gentoo.org>
Mon, 12 Jan 2009 08:28:04 +0000 (08:28 -0000)
svn path=/main/branches/2.1.6/; revision=12478

pym/_emerge/__init__.py

index adb740cd17f5c1baf4ced592a3b969f5246ec452..14590a5e0c174a469aa70ac022421fc0fb2753cf 100644 (file)
@@ -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)