Author: Alex Gaynor <[email protected]>
Branch:
Changeset: r63752:580451252cc7
Date: 2013-04-29 07:51 -0700
http://bitbucket.org/pypy/pypy/changeset/580451252cc7/
Log: merged upstream
diff --git a/lib-python/2.7/pydoc.py b/lib-python/2.7/pydoc.py
--- a/lib-python/2.7/pydoc.py
+++ b/lib-python/2.7/pydoc.py
@@ -1953,7 +1953,11 @@
if key is None:
callback(None, modname, '')
else:
- desc = split(__import__(modname).__doc__ or '', '\n')[0]
+ try:
+ module_doc = __import__(modname).__doc__
+ except ImportError:
+ module_doc = None
+ desc = split(module_doc or '', '\n')[0]
if find(lower(modname + ' - ' + desc), key) >= 0:
callback(None, modname, desc)
diff --git a/py/_path/local.py b/py/_path/local.py
--- a/py/_path/local.py
+++ b/py/_path/local.py
@@ -655,7 +655,8 @@
mkdtemp = classmethod(mkdtemp)
def make_numbered_dir(cls, prefix='session-', rootdir=None, keep=3,
- lock_timeout = 172800): # two days
+ lock_timeout = 172800, # two days
+ min_timeout = 300): # five minutes
""" return unique directory with a number greater than the current
maximum one. The number is assumed to start directly after prefix.
if keep is true directories with a number less than (maxnum-keep)
@@ -723,6 +724,20 @@
for path in rootdir.listdir():
num = parse_num(path)
if num is not None and num <= (maxnum - keep):
+ if min_timeout:
+ # NB: doing this is needed to prevent (or reduce
+ # a lot the chance of) the following situation:
+ # 'keep+1' processes call make_numbered_dir() at
+ # the same time, they create dirs, but then the
+ # last process notices the first dir doesn't have
+ # (yet) a .lock in it and kills it.
+ try:
+ t1 = path.lstat().mtime
+ t2 = lockfile.lstat().mtime
+ if abs(t2-t1) < min_timeout:
+ continue # skip directories too recent
+ except py.error.Error:
+ continue # failure to get a time, better skip
lf = path.join('.lock')
try:
t1 = lf.lstat().mtime
diff --git a/pypy/module/_cffi_backend/test/_backend_test_c.py
b/pypy/module/_cffi_backend/test/_backend_test_c.py
--- a/pypy/module/_cffi_backend/test/_backend_test_c.py
+++ b/pypy/module/_cffi_backend/test/_backend_test_c.py
@@ -2136,6 +2136,7 @@
def test_errno_callback():
if globals().get('PY_DOT_PY') == '2.5':
py.test.skip("cannot run this test on py.py with Python 2.5")
+ set_errno(95)
def cb():
e = get_errno()
set_errno(e - 6)
diff --git a/rpython/rtyper/test/test_runicode.py
b/rpython/rtyper/test/test_runicode.py
--- a/rpython/rtyper/test/test_runicode.py
+++ b/rpython/rtyper/test/test_runicode.py
@@ -274,6 +274,7 @@
test_char_isxxx = unsupported
test_isdigit = unsupported
test_str_isalpha = unsupported
+ test_str_isalnum = unsupported
test_upper = unsupported
test_lower = unsupported
test_splitlines = unsupported
diff --git a/rpython/rtyper/tool/rffi_platform.py
b/rpython/rtyper/tool/rffi_platform.py
--- a/rpython/rtyper/tool/rffi_platform.py
+++ b/rpython/rtyper/tool/rffi_platform.py
@@ -721,6 +721,8 @@
eci = eci.convert_sources_to_files()
files = [filepath]
output = build_executable_cache(files, eci, ignore_errors=ignore_errors)
+ if not output.startswith('-+- '):
+ raise Exception("run_example_code failed!\nlocals = %r" % (locals(),))
section = None
for line in output.splitlines():
line = line.strip()
diff --git a/rpython/tool/gcc_cache.py b/rpython/tool/gcc_cache.py
--- a/rpython/tool/gcc_cache.py
+++ b/rpython/tool/gcc_cache.py
@@ -1,7 +1,7 @@
from rpython.translator.platform import CompilationError
from rpython.conftest import cache_dir
from hashlib import md5
-import py
+import py, os
cache_dir_root = py.path.local(cache_dir).ensure(dir=1)
@@ -35,37 +35,45 @@
# compare equal to another instance without it
if platform.log_errors != _previous:
platform.log_errors = _previous
- path.write(result.out)
+ try_atomic_write(path, result.out)
return result.out
+def try_atomic_write(path, data):
+ path = str(path)
+ tmppath = '%s~%d' % (path, os.getpid())
+ f = open(tmppath, 'wb')
+ f.write(data)
+ f.close()
+ try:
+ os.rename(tmppath, path)
+ except OSError:
+ try:
+ os.unlink(tmppath)
+ except OSError:
+ pass
+
def try_compile_cache(c_files, eci):
- "Try to compile a program; caches the result (starts with 'True' or
'FAIL')"
+ "Try to compile a program. If it works, caches this fact."
# Import 'platform' every time, the compiler may have been changed
from rpython.translator.platform import platform
path = cache_file_path(c_files, eci, 'try_compile_cache')
try:
data = path.read()
+ if data == 'True':
+ return True
except py.error.Error:
- data = ''
- if not (data.startswith('True') or data.startswith('FAIL\n')):
- try:
- _previous = platform.log_errors
- try:
- platform.log_errors = False
- platform.compile(c_files, eci)
- finally:
- del platform.log_errors
- # ^^^remove from the instance --- needed so that it can
- # compare equal to another instance without it
- if platform.log_errors != _previous:
- platform.log_errors = _previous
- data = 'True'
- path.write(data)
- except CompilationError, e:
- data = 'FAIL\n%s\n' % (e,)
- if data.startswith('True'):
- return True
- else:
- assert data.startswith('FAIL\n')
- msg = data[len('FAIL\n'):]
- raise CompilationError(msg.strip(), '')
+ pass
+ #
+ _previous = platform.log_errors
+ try:
+ platform.log_errors = False
+ platform.compile(c_files, eci)
+ # ^^^ may raise CompilationError. We don't cache such results.
+ finally:
+ del platform.log_errors
+ # ^^^remove from the instance --- needed so that it can
+ # compare equal to another instance without it
+ if platform.log_errors != _previous:
+ platform.log_errors = _previous
+ path.write('True')
+ return True
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit