Redesign resolver to fix performance problem on OS X
parent
32c2543571
commit
445747ee4e
|
@ -77,17 +77,9 @@ M: inet4 make-sockaddr ( inet -- sockaddr )
|
||||||
"0.0.0.0" or
|
"0.0.0.0" or
|
||||||
rot inet-pton *uint over set-sockaddr-in-addr ;
|
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
|
M: inet4 parse-sockaddr
|
||||||
>r dup sockaddr-in-addr <uint> r> inet-ntop
|
>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 ;
|
TUPLE: inet6 host port ;
|
||||||
|
|
||||||
|
@ -140,7 +132,7 @@ M: inet6 make-sockaddr ( inet -- sockaddr )
|
||||||
|
|
||||||
M: inet6 parse-sockaddr
|
M: inet6 parse-sockaddr
|
||||||
>r dup sockaddr-in6-addr r> inet-ntop
|
>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 )
|
: addrspec-of-family ( af -- addrspec )
|
||||||
{
|
{
|
||||||
|
@ -259,17 +251,6 @@ HOOK: (send) io-backend ( packet addrspec datagram -- )
|
||||||
[ addrinfo>addrspec ] map
|
[ addrinfo>addrspec ] map
|
||||||
sift ;
|
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 -- )
|
HOOK: addrinfo-error io-backend ( n -- )
|
||||||
|
|
||||||
GENERIC: resolve-host ( addrspec -- seq )
|
GENERIC: resolve-host ( addrspec -- seq )
|
||||||
|
@ -278,17 +259,24 @@ TUPLE: inet host port ;
|
||||||
|
|
||||||
C: <inet> inet
|
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
|
M: inet resolve-host
|
||||||
[
|
[ port>> ] [ host>> ] bi [
|
||||||
prepare-resolve-host
|
f prepare-addrinfo f <void*>
|
||||||
"addrinfo" <c-object>
|
[ getaddrinfo addrinfo-error ] keep *void*
|
||||||
[ set-addrinfo-flags ] keep
|
[ parse-addrinfo-list ] keep freeaddrinfo
|
||||||
PF_UNSPEC over set-addrinfo-family
|
] [ resolve-passive-host ] if*
|
||||||
IPPROTO_TCP over set-addrinfo-protocol
|
swap fill-in-ports ;
|
||||||
f <void*> [ getaddrinfo addrinfo-error ] keep *void*
|
|
||||||
[ parse-addrinfo-list ] keep
|
|
||||||
freeaddrinfo
|
|
||||||
] with-scope ;
|
|
||||||
|
|
||||||
M: f resolve-host drop { } ;
|
M: f resolve-host drop { } ;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue