summaryrefslogtreecommitdiffstats
path: root/pym/portage/dbapi/_SyncfsProcess.py
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2012-12-30 01:33:10 -0800
committerZac Medico <zmedico@gentoo.org>2012-12-30 01:33:10 -0800
commit7ebb2f54877edb28621c33e380f8777b1b1dc201 (patch)
tree194c0a465f502258b82f43797db7f4c4b679408b /pym/portage/dbapi/_SyncfsProcess.py
parent84139803585a9a415c6f94c765dadcdeb7592915 (diff)
downloadportage-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.py53
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