Detect potential issues with mtime granlarity in env_update() and sleep if necessary...
authorZac Medico <zmedico@gentoo.org>
Fri, 16 Feb 2007 01:43:47 +0000 (01:43 -0000)
committerZac Medico <zmedico@gentoo.org>
Fri, 16 Feb 2007 01:43:47 +0000 (01:43 -0000)
svn path=/main/branches/2.1.2/; revision=5972

pym/portage.py

index 32907c32e4f033d2dfffd606123111f61b5ddfff..fe023f3781b4fcc8e80b2f53bcacfbfa61500cd5 100644 (file)
@@ -674,12 +674,18 @@ def env_update(makelinks=1, target_root=None, prev_mtimes=None, contents=None):
                        newprelink.write("-b "+x+"\n")
                newprelink.close()
 
+       # Portage stores mtimes with 1 second granularity but in >=python-2.5 finer
+       # granularity is possible.  In order to avoid the potential ambiguity of
+       # mtimes that differ by less than 1 second, sleep here if any of the
+       # directories have been modified during the current second.
+       sleep_for_mtime_granularity = False
+       current_time = long(time.time())
        mtime_changed = False
        lib_dirs = set()
        for lib_dir in portage_util.unique_array(specials["LDPATH"]+['usr/lib','usr/lib64','usr/lib32','lib','lib64','lib32']):
                x = os.path.join(target_root, lib_dir.lstrip(os.sep))
                try:
-                       newldpathtime = os.stat(x)[stat.ST_MTIME]
+                       newldpathtime = long(os.stat(x).st_mtime)
                        lib_dirs.add(normalize_path(x))
                except OSError, oe:
                        if oe.errno == errno.ENOENT:
@@ -690,6 +696,8 @@ def env_update(makelinks=1, target_root=None, prev_mtimes=None, contents=None):
                                # ignore this path because it doesn't exist
                                continue
                        raise
+               if newldpathtime == current_time:
+                       sleep_for_mtime_granularity = True
                if x in prev_mtimes:
                        if prev_mtimes[x] == newldpathtime:
                                pass
@@ -761,6 +769,10 @@ def env_update(makelinks=1, target_root=None, prev_mtimes=None, contents=None):
                outfile.write("setenv %s '%s'\n" % (x, env[x]))
        outfile.close()
 
+       if sleep_for_mtime_granularity:
+               while current_time == long(time.time()):
+                       sleep(1)
+
 def ExtractKernelVersion(base_dir):
        """
        Try to figure out what kernel version we are running