io.sockets.windows: recv to byte-array via malloc
WSARecvFrom on Windows does its work asynchronously, so the buffer cannot be in the managed heap during the extent of the operation.db4
parent
8fc0be3c2f
commit
68621c4d79
|
@ -111,7 +111,7 @@ TUPLE: ConnectEx-args port
|
||||||
s name namelen lpSendBuffer dwSendDataLength
|
s name namelen lpSendBuffer dwSendDataLength
|
||||||
lpdwBytesSent lpOverlapped ptr ;
|
lpdwBytesSent lpOverlapped ptr ;
|
||||||
|
|
||||||
: wait-for-socket ( args -- n )
|
: wait-for-socket ( args -- count )
|
||||||
[ lpOverlapped>> ] [ port>> ] bi twiddle-thumbs ; inline
|
[ lpOverlapped>> ] [ port>> ] bi twiddle-thumbs ; inline
|
||||||
|
|
||||||
: <ConnectEx-args> ( sockaddr size -- ConnectEx )
|
: <ConnectEx-args> ( sockaddr size -- ConnectEx )
|
||||||
|
@ -211,19 +211,24 @@ TUPLE: WSARecvFrom-args port
|
||||||
s lpBuffers dwBufferCount lpNumberOfBytesRecvd
|
s lpBuffers dwBufferCount lpNumberOfBytesRecvd
|
||||||
lpFlags lpFrom lpFromLen lpOverlapped lpCompletionRoutine ;
|
lpFlags lpFrom lpFromLen lpOverlapped lpCompletionRoutine ;
|
||||||
|
|
||||||
: make-receive-buffer ( n buf -- WSABUF )
|
:: make-receive-buffer ( n buf -- buf' WSABUF )
|
||||||
|
buf >c-ptr pinned-alien?
|
||||||
|
[ buf ] [ n malloc [ buf n memcpy ] keep ] if :> buf'
|
||||||
|
buf'
|
||||||
WSABUF malloc-struct &free
|
WSABUF malloc-struct &free
|
||||||
n >>len
|
n >>len
|
||||||
buf >>buf ; inline
|
buf' >>buf ; inline
|
||||||
|
|
||||||
:: <WSARecvFrom-args> ( n buf datagram -- WSARecvFrom )
|
:: <WSARecvFrom-args> ( n buf datagram -- buf buf' WSARecvFrom )
|
||||||
|
n buf make-receive-buffer :> ( buf' wsaBuf )
|
||||||
|
buf buf'
|
||||||
WSARecvFrom-args new
|
WSARecvFrom-args new
|
||||||
datagram >>port
|
datagram >>port
|
||||||
datagram handle>> handle>> >>s
|
datagram handle>> handle>> >>s
|
||||||
datagram addr>> sockaddr-size
|
datagram addr>> sockaddr-size
|
||||||
[ malloc &free >>lpFrom ]
|
[ malloc &free >>lpFrom ]
|
||||||
[ malloc-int &free >>lpFromLen ] bi
|
[ malloc-int &free >>lpFromLen ] bi
|
||||||
n buf make-receive-buffer >>lpBuffers
|
wsaBuf >>lpBuffers
|
||||||
1 >>dwBufferCount
|
1 >>dwBufferCount
|
||||||
0 malloc-int &free >>lpFlags
|
0 malloc-int &free >>lpFlags
|
||||||
0 malloc-int &free >>lpNumberOfBytesRecvd
|
0 malloc-int &free >>lpNumberOfBytesRecvd
|
||||||
|
@ -242,16 +247,18 @@ TUPLE: WSARecvFrom-args port
|
||||||
[ lpCompletionRoutine>> ]
|
[ lpCompletionRoutine>> ]
|
||||||
} cleave WSARecvFrom socket-error* ; inline
|
} cleave WSARecvFrom socket-error* ; inline
|
||||||
|
|
||||||
: parse-WSARecvFrom ( n WSARecvFrom -- packet sockaddr )
|
:: finalize-buf ( buf buf' count -- )
|
||||||
[ lpBuffers>> buf>> swap memory>byte-array ]
|
buf buf' eq? [ buf buf' count memcpy ] unless ; inline
|
||||||
[
|
|
||||||
|
:: parse-WSARecvFrom ( buf buf' count wsaRecvFrom -- count sockaddr )
|
||||||
|
buf buf' count finalize-buf
|
||||||
|
wsaRecvFrom
|
||||||
[ port>> addr>> empty-sockaddr dup ]
|
[ port>> addr>> empty-sockaddr dup ]
|
||||||
[ lpFrom>> ]
|
[ lpFrom>> ]
|
||||||
[ lpFromLen>> int deref ]
|
[ lpFromLen>> int deref ]
|
||||||
tri memcpy
|
tri memcpy ; inline
|
||||||
] bi ; inline
|
|
||||||
|
|
||||||
M: windows (receive) ( n buf datagram -- packet addrspec )
|
M: windows (receive) ( n buf datagram -- count addrspec )
|
||||||
[
|
[
|
||||||
<WSARecvFrom-args>
|
<WSARecvFrom-args>
|
||||||
[ call-WSARecvFrom ]
|
[ call-WSARecvFrom ]
|
||||||
|
|
Loading…
Reference in New Issue