This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: release GIL around getaddrinfo()
Type: Stage:
Components: Extension Modules Versions:
process
Status: closed Resolution: rejected
Dependencies: Superseder:
Assigned To: jhylton Nosy List: jhylton, jvr, loewis, nnorwitz
Priority: normal Keywords: patch

Created on 2002-09-03 21:48 by jhylton, last changed 2022-04-10 16:05 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
getaddrinfo.patch jhylton, 2002-09-03 21:48
Messages (7)
msg41096 - (view) Author: Jeremy Hylton (jhylton) (Python triager) Date: 2002-09-03 21:48
If getaddrinfo() is thread-safe, then we should release
the interpreter lock before calling it.  There is every
reason to believe that this operation will be slow.
msg41097 - (view) Author: Martin v. Löwis (loewis) * (Python committer) Date: 2002-09-04 06:25
Logged In: YES 
user_id=21627

How do you know getaddrinfo is thread-safe? In particular,
when using the getaddrinfo emulation, it is not.
msg41098 - (view) Author: Jeremy Hylton (jhylton) (Python triager) Date: 2002-09-04 19:20
Logged In: YES 
user_id=31392

The getaddrinfo() on Linux says it thread-safe.  It's a
name-fangled call.  Is it part of some standard?  It would
certainly be possible to make the fallback implementation
thread-safe.  Or, if we don't believe it is thread-safe, we
could add a separate lock to protect it.  The socket module
of 2.1 vintage had a separate lock for this purpose.  And
the 2.1 vintage Python performs much better when a
multi-threaded app does DNS lookups.
msg41099 - (view) Author: Neal Norwitz (nnorwitz) * (Python committer) Date: 2002-09-04 20:18
Logged In: YES 
user_id=33168

I looked on OpenBSD (I think, may have been NetBSD) and
FreeBSD.  The man pages were the same, both old (circa
1995), but they said their implementation was not
thread-safe.  I did a man on Dec UNIX and it said it
conformed to POSIX.1g Draft 6.6, but didn't indicate if it
was thread safe.  Solaris 8 doesn't say anything in the man
page.

Here's a NetBSD 1.6 man page dated 2002/05/14 and it's still
not thread-safe:
http://216.239.37.100/search?q=cache:4bTvQQqcwq4C:www.tac.eu.org/cgi-bin/man-cgi%3Fgetaddrinfo%2B3+getaddrinfo+thread+safe&hl=en&ie=UTF-8

This:
http://216.239.33.100/search?q=cache:q5egqJ5_mv4C:mail.gnu.org/pipermail/guile-devel/2001-October/004039.html+getaddrinfo+thread+safe&hl=en&ie=UTF-8
says "getaddrinfo and getnameinfo are the recommended APIs.
 They avoid hidden static data; they're supposed to be
thread-safe; they handle multiple address families."

It seems safest to do what Jeremy proposes and add a lock. 
There can always be a define if getaddrinfo is thread safe
or not.  Maybe we can even determine with autoconf.

Note:  I get much better performance with this patch under
linux.
msg41100 - (view) Author: Martin v. Löwis (loewis) * (Python committer) Date: 2002-09-05 08:38
Logged In: YES 
user_id=21627

RFC 2553 specifies that getaddrinfo, getipnodebyname, and
all the other new netdb functions must be thread-safe -
hence the BSD man pages document it as a bug that they are not.

So adding an additional lock, in general, might be overkill.
I'd suggest a strategy that assumes, in general, that
getaddrinfo is thread-safe. If it isn't (by hard-coded
knowledge), I'd propose just to continue using the
interpreter lock - those systems deserve to lose.

As for the fallback implementation - feel free to do
anything about it that you can find the time for. Recording
it as thread-unsafe might be fine, adding a lock is another
option, using the thread-safe API inside the fallback (where
available) is a third option. 

I would not care too much, except that this is used on
Windows. Notice that it won't be used on Windows if Python
is compiled with VC.NET, since that provides a "native"
getaddrinfo (and Python knows that it does). So if Python
2.3 is going to be compiled with VC.NET, I would not worry
about the fallback implementation at all.
msg41101 - (view) Author: Just van Rossum (jvr) * (Python triager) Date: 2003-05-03 18:07
Logged In: YES 
user_id=92689

FWIW, I opened a bug regarding this very same issue (I didn't know if this 
item): python.org/sf/731644. That item now also contains a new patch that 
takes care of locking.
msg41102 - (view) Author: Just van Rossum (jvr) * (Python triager) Date: 2003-05-09 07:57
Logged In: YES 
user_id=92689

The last patch from python.org/sf/731644 was accepted by MvL, and 
consequently checked in as socketmodule.c rev. 1.265.
History
Date User Action Args
2022-04-10 16:05:38adminsetgithub: 37130
2002-09-03 21:48:41jhyltoncreate