diff --git a/lib/utils/wrapper.py b/lib/utils/wrapper.py index 256d2f1d6d1f1ad686bf75ae7dd3739526d4aca1..55cfbf21459ecdb3131cb5ce83f9f744e254f7fa 100644 --- a/lib/utils/wrapper.py +++ b/lib/utils/wrapper.py @@ -171,7 +171,7 @@ def GetClosedTempfile(*args, **kwargs): return path -def ResetTempfileModule(): +def ResetTempfileModule(_time=time.time): """Resets the random name generator of the tempfile module. This function should be called after C{os.fork} in the child process to @@ -182,13 +182,15 @@ def ResetTempfileModule(): """ # pylint: disable=W0212 - if hasattr(tempfile, "_once_lock") and hasattr(tempfile, "_name_sequence"): - tempfile._once_lock.acquire() + try: + lock = tempfile._once_lock + lock.acquire() try: - # Reset random name generator - tempfile._name_sequence = None + # Re-seed random name generator + if tempfile._name_sequence: + tempfile._name_sequence.rng.seed(hash(_time()) ^ os.getpid()) finally: - tempfile._once_lock.release() - else: + lock.release() + except AttributeError: logging.critical("The tempfile module misses at least one of the" " '_once_lock' and '_name_sequence' attributes")