Author: Armin Rigo <[email protected]>
Branch:
Changeset: r73785:a86675035c46
Date: 2014-10-05 17:53 +0200
http://bitbucket.org/pypy/pypy/changeset/a86675035c46/
Log: Remove the extra "lock" argument to two functions from rlib.rpython.
Instead, use internal logic to create a lock if necessary.
diff --git a/pypy/module/_socket/interp_func.py
b/pypy/module/_socket/interp_func.py
--- a/pypy/module/_socket/interp_func.py
+++ b/pypy/module/_socket/interp_func.py
@@ -46,9 +46,8 @@
Return the true host name, a list of aliases, and a list of IP addresses,
for a host. The host argument is a string giving a host name or IP number.
"""
- lock = space.fromcache(State).netdb_lock
try:
- res = rsocket.gethostbyname_ex(host, lock)
+ res = rsocket.gethostbyname_ex(host)
except SocketError, e:
raise converted_error(space, e)
return common_wrapgethost(space, res)
@@ -60,9 +59,8 @@
Return the true host name, a list of aliases, and a list of IP addresses,
for a host. The host argument is a string giving a host name or IP number.
"""
- lock = space.fromcache(State).netdb_lock
try:
- res = rsocket.gethostbyaddr(host, lock)
+ res = rsocket.gethostbyaddr(host)
except SocketError, e:
raise converted_error(space, e)
return common_wrapgethost(space, res)
@@ -319,10 +317,3 @@
raise OperationError(space.w_ValueError,
space.wrap('Timeout value out of range'))
rsocket.setdefaulttimeout(timeout)
-
-class State(object):
- def __init__(self, space):
- self.netdb_lock = None
-
- def startup(self, space):
- self.netdb_lock = space.allocate_lock()
diff --git a/rpython/rlib/rsocket.py b/rpython/rlib/rsocket.py
--- a/rpython/rlib/rsocket.py
+++ b/rpython/rlib/rsocket.py
@@ -18,9 +18,10 @@
from rpython.rlib import _rsocket_rffi as _c, jit, rgc
from rpython.rlib.objectmodel import instantiate, keepalive_until_here
from rpython.rlib.rarithmetic import intmask, r_uint
-from rpython.rlib.rthread import dummy_lock
+from rpython.rlib import rthread
from rpython.rtyper.lltypesystem import lltype, rffi
from rpython.rtyper.lltypesystem.rffi import sizeof, offsetof
+from rpython.rtyper.extregistry import ExtRegistryEntry
# Usage of @jit.dont_look_inside in this file is possibly temporary
@@ -1135,18 +1136,18 @@
paddr = h_addr_list[i]
return (rffi.charp2str(hostent.c_h_name), aliases, address_list)
-def gethostbyname_ex(name, lock=dummy_lock):
+def gethostbyname_ex(name):
# XXX use gethostbyname_r() if available instead of locks
addr = gethostbyname(name)
- with lock:
+ with _get_netdb_lock():
hostent = _c.gethostbyname(name)
return gethost_common(name, hostent, addr)
-def gethostbyaddr(ip, lock=dummy_lock):
+def gethostbyaddr(ip):
# XXX use gethostbyaddr_r() if available, instead of locks
addr = makeipaddr(ip)
assert isinstance(addr, IPAddress)
- with lock:
+ with _get_netdb_lock():
p, size = addr.lock_in_addr()
try:
hostent = _c.gethostbyaddr(p, size, addr.family)
@@ -1154,6 +1155,36 @@
addr.unlock()
return gethost_common(ip, hostent, addr)
+# RPython magic to make _netdb_lock turn either into a regular
+# rthread.Lock or a rthread.DummyLock, depending on the config
+def _get_netdb_lock():
+ return rthread.dummy_lock
+
+class _Entry(ExtRegistryEntry):
+ _about_ = _get_netdb_lock
+
+ def compute_annotation(self):
+ config = self.bookkeeper.annotator.translator.config
+ if config.translation.thread:
+ fn = _get_netdb_lock_thread
+ else:
+ fn = _get_netdb_lock_nothread
+ return self.bookkeeper.immutablevalue(fn)
+
+def _get_netdb_lock_nothread():
+ return rthread.dummy_lock
+
+class _LockCache(object):
+ lock = None
+_lock_cache = _LockCache()
+
[email protected]
+def _get_netdb_lock_thread():
+ if _lock_cache.lock is None:
+ _lock_cache.lock = rthread.allocate_lock()
+ return _lock_cache.lock
+# done RPython magic
+
def getaddrinfo(host, port_or_service,
family=AF_UNSPEC, socktype=0, proto=0, flags=0,
address_to_fill=None):
diff --git a/rpython/rlib/test/test_rsocket.py
b/rpython/rlib/test/test_rsocket.py
--- a/rpython/rlib/test/test_rsocket.py
+++ b/rpython/rlib/test/test_rsocket.py
@@ -2,6 +2,7 @@
from rpython.rlib import rsocket
from rpython.rlib.rsocket import *
import socket as cpy_socket
+from rpython.translator.c.test.test_genc import compile
def setup_module(mod):
@@ -570,4 +571,17 @@
for i in range(nthreads):
threads[i].join()
assert sum(result) == nthreads
-
+
+def test_translate_netdb_lock():
+ def f():
+ gethostbyaddr("localhost")
+ return 0
+ fc = compile(f, [])
+ assert fc() == 0
+
+def test_translate_netdb_lock_thread():
+ def f():
+ gethostbyaddr("localhost")
+ return 0
+ fc = compile(f, [], thread=True)
+ assert fc() == 0
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit