Redesign resolver to fix performance problem on OS X

db4
Slava Pestov 2008-09-06 05:40:15 -05:00
parent 32c2543571
commit 445747ee4e
1 changed files with 19 additions and 31 deletions

View File

@ -77,17 +77,9 @@ M: inet4 make-sockaddr ( inet -- sockaddr )
"0.0.0.0" or
rot inet-pton *uint over set-sockaddr-in-addr ;
<PRIVATE
SYMBOL: port-override
: (port) ( port -- port' ) port-override get swap or ;
PRIVATE>
M: inet4 parse-sockaddr
>r dup sockaddr-in-addr <uint> r> inet-ntop
swap sockaddr-in-port ntohs (port) <inet4> ;
swap sockaddr-in-port ntohs <inet4> ;
TUPLE: inet6 host port ;
@ -140,7 +132,7 @@ M: inet6 make-sockaddr ( inet -- sockaddr )
M: inet6 parse-sockaddr
>r dup sockaddr-in6-addr r> inet-ntop
swap sockaddr-in6-port ntohs (port) <inet6> ;
swap sockaddr-in6-port ntohs <inet6> ;
: addrspec-of-family ( af -- addrspec )
{
@ -259,17 +251,6 @@ HOOK: (send) io-backend ( packet addrspec datagram -- )
[ addrinfo>addrspec ] map
sift ;
: prepare-resolve-host ( addrspec -- host' serv' flags )
#! If the port is a number, we resolve for 'http' then
#! change it later. This is a workaround for a FreeBSD
#! getaddrinfo() limitation -- on Windows, Linux and Mac,
#! we can convert a number to a string and pass that as the
#! service name, but on FreeBSD this gives us an unknown
#! service error.
[ host>> ]
[ port>> dup integer? [ port-override set "http" ] when ] bi
over 0 AI_PASSIVE ? ;
HOOK: addrinfo-error io-backend ( n -- )
GENERIC: resolve-host ( addrspec -- seq )
@ -278,17 +259,24 @@ TUPLE: inet host port ;
C: <inet> inet
: resolve-passive-host ( -- addrspecs )
{ T{ inet6 f "::" f } T{ inet4 f "0.0.0.0" f } } [ clone ] map ;
: prepare-addrinfo ( -- addrinfo )
"addrinfo" <c-object>
PF_UNSPEC over set-addrinfo-family
IPPROTO_TCP over set-addrinfo-protocol ;
: fill-in-ports ( addrspecs port -- addrspecs )
[ >>port ] curry map ;
M: inet resolve-host
[
prepare-resolve-host
"addrinfo" <c-object>
[ set-addrinfo-flags ] keep
PF_UNSPEC over set-addrinfo-family
IPPROTO_TCP over set-addrinfo-protocol
f <void*> [ getaddrinfo addrinfo-error ] keep *void*
[ parse-addrinfo-list ] keep
freeaddrinfo
] with-scope ;
[ port>> ] [ host>> ] bi [
f prepare-addrinfo f <void*>
[ getaddrinfo addrinfo-error ] keep *void*
[ parse-addrinfo-list ] keep freeaddrinfo
] [ resolve-passive-host ] if*
swap fill-in-ports ;
M: f resolve-host drop { } ;