diff options
author | Zac Medico <zmedico@gentoo.org> | 2012-12-30 01:33:10 -0800 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2012-12-30 01:33:10 -0800 |
commit | 7ebb2f54877edb28621c33e380f8777b1b1dc201 (patch) | |
tree | 194c0a465f502258b82f43797db7f4c4b679408b /pym/portage/dbapi/_SyncfsProcess.py | |
parent | 84139803585a9a415c6f94c765dadcdeb7592915 (diff) | |
download | portage-7ebb2f54877edb28621c33e380f8777b1b1dc201.tar.gz portage-7ebb2f54877edb28621c33e380f8777b1b1dc201.tar.bz2 portage-7ebb2f54877edb28621c33e380f8777b1b1dc201.zip |
Use ctypes in subprocess for bug #448858.
Isolate ctypes usage in a subprocess, in order to avoid potential
problems with stale cached libraries as described in bug #448858,
comment #14 (also see http://bugs.python.org/issue14597).
Diffstat (limited to 'pym/portage/dbapi/_SyncfsProcess.py')
-rw-r--r-- | pym/portage/dbapi/_SyncfsProcess.py | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/pym/portage/dbapi/_SyncfsProcess.py b/pym/portage/dbapi/_SyncfsProcess.py new file mode 100644 index 000000000..7518214ec --- /dev/null +++ b/pym/portage/dbapi/_SyncfsProcess.py @@ -0,0 +1,53 @@ +# Copyright 2012 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +from portage import os +from portage.util._ctypes import find_library, LoadLibrary +from portage.util._async.ForkProcess import ForkProcess + +class SyncfsProcess(ForkProcess): + """ + Isolate ctypes usage in a subprocess, in order to avoid + potential problems with stale cached libraries as + described in bug #448858, comment #14 (also see + http://bugs.python.org/issue14597). + """ + + __slots__ = ('paths',) + + @staticmethod + def _get_syncfs(): + + filename = find_library("c") + if filename is not None: + library = LoadLibrary(filename) + if library is not None: + try: + return library.syncfs + except AttributeError: + pass + + return None + + def _run(self): + + syncfs_failed = False + syncfs = self._get_syncfs() + + if syncfs is not None: + for path in self.paths: + try: + fd = os.open(path, os.O_RDONLY) + except OSError: + pass + else: + try: + if syncfs(fd) != 0: + # Happens with PyPy (bug #446610) + syncfs_failed = True + finally: + os.close(fd) + + if syncfs is None or syncfs_failed: + return 1 + return os.EX_OK |