Merge git://factorcode.org/git/factor

release
Doug Coleman 2007-11-07 13:02:43 -06:00
commit 379ac4ec31
13 changed files with 317 additions and 318 deletions

24
extra/io/nonblocking/nonblocking.factor Normal file → Executable file
View File

@ -1,11 +1,12 @@
! Copyright (C) 2007 Slava Pestov, Doug Coleman ! Copyright (C) 2005, 2007 Slava Pestov, Doug Coleman
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
IN: io.nonblocking IN: io.nonblocking
USING: math kernel io sequences io.buffers generic sbufs USING: math kernel io sequences io.buffers generic sbufs
system io.streams.lines io.streams.plain io.streams.duplex system io.streams.lines io.streams.plain io.streams.duplex
continuations debugger classes byte-arrays ; continuations debugger classes byte-arrays namespaces ;
: default-buffer-size 64 1024 * ; inline SYMBOL: default-buffer-size
64 1024 * default-buffer-size set-global
! Common delegate of native stream readers and writers ! Common delegate of native stream readers and writers
TUPLE: port handle error timeout cutoff type eof? ; TUPLE: port handle error timeout cutoff type eof? ;
@ -18,6 +19,7 @@ PREDICATE: port input-port port-type input eq? ;
PREDICATE: port output-port port-type output eq? ; PREDICATE: port output-port port-type output eq? ;
GENERIC: init-handle ( handle -- ) GENERIC: init-handle ( handle -- )
GENERIC: close-handle ( handle -- )
: <port> ( handle buffer -- port ) : <port> ( handle buffer -- port )
over init-handle over init-handle
@ -29,7 +31,7 @@ GENERIC: init-handle ( handle -- )
} port construct ; } port construct ;
: <buffered-port> ( handle -- port ) : <buffered-port> ( handle -- port )
default-buffer-size <buffer> <port> ; default-buffer-size get <buffer> <port> ;
: <reader> ( handle -- stream ) : <reader> ( handle -- stream )
<buffered-port> input over set-port-type <line-reader> ; <buffered-port> input over set-port-type <line-reader> ;
@ -150,6 +152,20 @@ M: output-port stream-write1
M: output-port stream-write M: output-port stream-write
over length over wait-to-write >buffer ; over length over wait-to-write >buffer ;
GENERIC: port-flush ( port -- )
M: output-port stream-flush ( port -- )
dup port-flush pending-error ;
M: port stream-close
dup port-type closed eq? [
dup port-type >r closed over set-port-type r>
output eq? [ dup port-flush ] when
dup port-handle close-handle
dup delegate [ buffer-free ] when*
f over set-delegate
] unless drop ;
TUPLE: server-port addr client ; TUPLE: server-port addr client ;
: <server-port> ( port addr -- server ) : <server-port> ( port addr -- server )

17
extra/io/unix/backend/backend.factor Normal file → Executable file
View File

@ -34,6 +34,9 @@ M: integer init-handle ( fd -- )
#! 1 are closed). #! 1 are closed).
F_SETFL O_NONBLOCK fcntl drop ; F_SETFL O_NONBLOCK fcntl drop ;
M: integer close-handle ( fd -- )
close ;
: report-error ( error port -- ) : report-error ( error port -- )
[ "Error on fd " % dup port-handle # ": " % swap % ] "" make [ "Error on fd " % dup port-handle # ": " % swap % ] "" make
swap set-port-error ; swap set-port-error ;
@ -168,21 +171,9 @@ M: write-task task-container drop write-tasks get-global ;
: (wait-to-write) ( port -- ) : (wait-to-write) ( port -- )
[ swap <write-task> add-write-io-task stop ] callcc0 drop ; [ swap <write-task> add-write-io-task stop ] callcc0 drop ;
: port-flush ( port -- ) M: port port-flush ( port -- )
dup buffer-empty? [ drop ] [ (wait-to-write) ] if ; dup buffer-empty? [ drop ] [ (wait-to-write) ] if ;
M: output-port stream-flush
dup port-flush pending-error ;
M: port stream-close
dup port-type closed eq? [
dup port-type >r closed over set-port-type r>
output eq? [ dup port-flush ] when
dup port-handle close
dup delegate [ buffer-free ] when*
f over set-delegate
] unless drop ;
USE: io USE: io
M: unix-io init-io ( -- ) M: unix-io init-io ( -- )

View File

@ -0,0 +1,42 @@
USING: io.nonblocking io.windows threads.private kernel
io.backend windows.winsock windows.kernel32 windows
io.streams.duplex io namespaces alien.syntax system combinators ;
IN: io.windows.ce.backend
: port-errored ( port -- )
win32-error-string swap set-port-error ;
M: windows-ce-io io-multiplex ( ms -- ) (sleep) ;
M: windows-ce-io add-completion ( port -- ) drop ;
GENERIC: wince-read ( port port-handle -- )
M: input-port (wait-to-read) ( port -- )
dup port-handle wince-read ;
GENERIC: wince-write ( port port-handle -- )
M: windows-ce-io flush-output ( port -- )
dup port-handle wince-write ;
M: windows-ce-io init-io ( -- )
init-winsock ;
LIBRARY: libc
FUNCTION: void* _getstdfilex int fd ;
FUNCTION: void* _fileno void* file ;
M: windows-ce-io init-stdio ( -- )
#! We support Windows NT too, to make this I/O backend
#! easier to debug.
4096 default-buffer-size [
winnt? [
STD_INPUT_HANDLE GetStdHandle
STD_OUTPUT_HANDLE GetStdHandle
] [
0 _getstdfilex _fileno
1 _getstdfilex _fileno
] if
>r f <win32-file> <reader>
r> f <win32-file> <writer>
] with-variable <duplex-stream> stdio set ;

234
extra/io/windows/ce/ce.factor Normal file → Executable file
View File

@ -1,235 +1,5 @@
USING: alien alien.c-types combinators USING: io.backend io.windows io.windows.ce.backend
io io.backend io.buffers io.files io.nonblocking io.sockets io.windows.ce.files io.windows.ce.sockets namespaces ;
io.sockets.impl io.windows kernel libc math namespaces
prettyprint qualified sequences strings threads threads.private
windows windows.kernel32 ;
QUALIFIED: windows.winsock
IN: io.windows.ce IN: io.windows.ce
! M: windows-ce-io normalize-pathname ( string -- string )
! dup 1 tail* CHAR: \\ = [ "*" append ] [ "\\*" append ] if ;
M: windows-ce-io CreateFile-flags ( -- DWORD ) FILE_ATTRIBUTE_NORMAL ;
M: windows-ce-io FileArgs-overlapped ( port -- f ) drop f ;
M: windows-ce-io io-multiplex ( ms -- ) (sleep) ;
M: windows-ce-io add-completion ( port -- ? ) drop f ;
: port-errored ( port -- )
win32-error-string swap set-port-error ;
GENERIC: wince-read ( port port-handle -- )
M: win32-file wince-read
drop dup make-FileArgs dup setup-read ReadFile zero? [
drop port-errored
] [
FileArgs-lpNumberOfBytesRet *uint dup zero? [
drop
t swap set-port-eof?
] [
swap n>buffer
] if
] if ;
TUPLE: WSAArgs
s
lpBuffers
dwBufferCount
lpNumberOfBytesRet
lpFlags
lpOverlapped
lpCompletionRoutine ;
C: <WSAArgs> WSAArgs
: make-WSAArgs ( port -- <WSARecv> )
[ port-handle win32-file-handle ] keep
delegate 1 "DWORD" <c-object> f f f <WSAArgs> ;
: setup-WSARecv ( <WSAArgs> -- s lpBuffers dwBufferCount lpNumberOfBytesRet lpFlags lpOverlapped lpCompletionRoutine )
[ WSAArgs-s ] keep
[
WSAArgs-lpBuffers [ buffer-capacity ] keep
buffer-end
"WSABUF" <c-object>
[ windows.winsock:set-WSABUF-buf ] keep
[ windows.winsock:set-WSABUF-len ] keep
] keep
[ WSAArgs-dwBufferCount ] keep
[ WSAArgs-lpNumberOfBytesRet ] keep
[ WSAArgs-lpFlags ] keep
[ WSAArgs-lpOverlapped ] keep
WSAArgs-lpCompletionRoutine ;
! M: win32-socket wince-read ( port port-handle -- )
! drop dup make-WSAArgs dup setup-WSARecv WSARecv zero? [
! drop port-errored
! ] [
! WSAArgs-lpNumberOfBytesRet *uint dup zero? [
! drop
! t swap set-port-eof?
! ] [
! swap n>buffer
! ] if
! ] if ;
M: win32-socket wince-read ( port port-handle -- )
win32-file-handle over
delegate [ buffer-end ] keep buffer-capacity 0
windows.winsock:recv dup windows.winsock:SOCKET_ERROR = [
drop port-errored
] [
dup zero? [
drop
t swap set-port-eof?
] [
swap n>buffer
] if
] if ;
M: input-port (wait-to-read) ( port -- )
dup port-handle wince-read ;
GENERIC: wince-write ( port port-handle -- )
M: win32-file wince-write ( port port-handle -- )
drop dup make-FileArgs dup setup-write WriteFile zero? [
drop port-errored
] [
FileArgs-lpNumberOfBytesRet *uint ! *DWORD
over delegate [ buffer-consume ] keep
buffer-length 0 > [
flush-output
] [
drop
] if
] if ;
: setup-WSASend ( <WSAArgs> -- s lpBuffers dwBufferCount lpNumberOfBytesRet lpFlags lpOverlapped lpCompletionRoutine )
[ WSAArgs-s ] keep
[
WSAArgs-lpBuffers [ buffer-length ] keep
buffer@
"WSABUF" <c-object>
[ windows.winsock:set-WSABUF-buf ] keep
[ windows.winsock:set-WSABUF-len ] keep
] keep
[ WSAArgs-dwBufferCount ] keep
[ WSAArgs-lpNumberOfBytesRet ] keep
[ WSAArgs-lpFlags ] keep
[ WSAArgs-lpOverlapped ] keep
WSAArgs-lpCompletionRoutine ;
! M: win32-socket wince-write ( port port-handle -- )
! drop dup make-WSAArgs dup setup-WSASend WSASend zero? [
! drop port-errored
! ] [
! FileArgs-lpNumberOfBytesRet *uint ! *DWORD
! over delegate [ buffer-consume ] keep
! buffer-length 0 > [
! flush-output
! ] [
! drop
! ] if
! ] if ;
M: win32-socket wince-write ( port port-handle -- )
win32-file-handle over
delegate [ buffer@ ] keep
buffer-length 0 windows.winsock:send dup windows.winsock:SOCKET_ERROR = [
drop port-errored
] [
over delegate [ buffer-consume ] keep
buffer-length 0 > [
flush-output
] [
drop
] if
] if ;
M: windows-ce-io flush-output ( port -- )
dup port-handle wince-write ;
M: windows-ce-io WSASocket-flags ( -- DWORD ) 0 ;
: do-connect ( addrspec -- socket )
[ tcp-socket dup ] keep
make-sockaddr/size
f f f f windows.winsock:WSAConnect zero? [
winsock-error-string throw
] unless ;
M: windows-ce-io (client) ( addrspec -- duplex-stream )
do-connect <win32-socket> dup handle>duplex-stream ;
M: windows-ce-io <server> ( addrspec -- duplex-stream )
[
windows.winsock:SOCK_STREAM server-fd
dup listen-on-socket
<win32-socket> f <port>
] keep <server-port> ;
M: windows-ce-io accept ( server -- client )
dup check-server-port
[
[ touch-port ] keep
[ port-handle win32-file-handle ] keep
server-port-addr sockaddr-type heap-size
[ "char" <c-array> ] keep [
<int>
f 0
windows.winsock:WSAAccept dup windows.winsock:INVALID_SOCKET = [
winsock-error-string throw
] when
] keep
] keep server-port-addr parse-sockaddr swap
<win32-socket> dup handle>duplex-stream <client-stream> ;
T{ windows-ce-io } io-backend set-global T{ windows-ce-io } io-backend set-global
M: windows-ce-io init-io ( -- )
init-winsock ;
M: windows-ce-io <datagram> ( addrspec -- datagram )
[
windows.winsock:SOCK_DGRAM server-fd <win32-socket> f <port>
] keep <datagram-port> ;
M: windows-ce-io receive ( datagram -- packet addrspec )
dup check-datagram-port
[
port-handle delegate win32-file-handle
"WSABUF" <c-object>
default-buffer-size over windows.winsock:set-WSABUF-len
default-buffer-size "char" <c-array> over windows.winsock:set-WSABUF-buf
[
1
0 <uint> [
0 <uint>
64 "char" <c-array> [
64 <int>
f
f
windows.winsock:WSARecvFrom zero? [
winsock-error-string throw
] unless
] keep
] keep *uint
] keep
] keep
! sockaddr count buf datagram
>r windows.winsock:WSABUF-buf swap memory>string swap r>
datagram-port-addr parse-sockaddr ;
M: windows-ce-io send ( packet addrspec datagram -- )
3dup check-datagram-send
delegate port-handle delegate win32-file-handle
rot dup length "WSABUF" <c-object>
[ windows.winsock:set-WSABUF-len ] keep
[ windows.winsock:set-WSABUF-buf ] keep
rot make-sockaddr/size
>r >r 1 0 <uint> 0 r> r> f f
windows.winsock:WSASendTo zero? [
winsock-error-string throw
] unless ;

View File

@ -0,0 +1,28 @@
USING: alien alien.c-types combinators io io.backend io.buffers
io.files io.nonblocking io.windows kernel libc math namespaces
prettyprint sequences strings threads threads.private
windows windows.kernel32 io.windows.ce.backend ;
IN: windows.ce.files
! M: windows-ce-io normalize-pathname ( string -- string )
! dup 1 tail* CHAR: \\ = [ "*" append ] [ "\\*" append ] if ;
M: windows-ce-io CreateFile-flags ( -- DWORD ) FILE_ATTRIBUTE_NORMAL ;
M: windows-ce-io FileArgs-overlapped ( port -- f ) drop f ;
M: win32-file wince-read
drop dup make-FileArgs dup setup-read ReadFile zero? [
drop port-errored
] [
FileArgs-lpNumberOfBytesRet *uint dup zero?
[ drop t swap set-port-eof? ] [ swap n>buffer ] if
] if ;
M: win32-file wince-write ( port port-handle -- )
drop dup make-FileArgs dup setup-write WriteFile zero? [
drop port-errored
] [
FileArgs-lpNumberOfBytesRet *uint
over buffer-consume
port-flush
] if ;

View File

@ -0,0 +1,170 @@
USING: alien alien.c-types combinators io io.backend io.buffers
io.nonblocking io.sockets io.sockets.impl io.windows kernel libc
math namespaces prettyprint qualified sequences strings threads
threads.private windows windows.kernel32 io.windows.ce.backend
byte-arrays ;
QUALIFIED: windows.winsock
IN: io.windows.ce
M: windows-ce-io WSASocket-flags ( -- DWORD ) 0 ;
TUPLE: WSAArgs
s
lpBuffers
dwBufferCount
lpNumberOfBytesRet
lpFlags
lpOverlapped
lpCompletionRoutine ;
C: <WSAArgs> WSAArgs
: make-WSAArgs ( port -- <WSARecv> )
[ port-handle win32-file-handle ] keep
1 "DWORD" <c-object> f f f <WSAArgs> ;
: setup-WSARecv ( <WSAArgs> -- s lpBuffers dwBufferCount lpNumberOfBytesRet lpFlags lpOverlapped lpCompletionRoutine )
[ WSAArgs-s ] keep
[
WSAArgs-lpBuffers [ buffer-capacity ] keep
buffer-end
"WSABUF" <c-object>
[ windows.winsock:set-WSABUF-buf ] keep
[ windows.winsock:set-WSABUF-len ] keep
] keep
[ WSAArgs-dwBufferCount ] keep
[ WSAArgs-lpNumberOfBytesRet ] keep
[ WSAArgs-lpFlags ] keep
[ WSAArgs-lpOverlapped ] keep
WSAArgs-lpCompletionRoutine ;
! M: win32-socket wince-read ( port port-handle -- )
! drop dup make-WSAArgs dup setup-WSARecv WSARecv zero? [
! drop port-errored
! ] [
! WSAArgs-lpNumberOfBytesRet *uint dup zero? [
! drop
! t swap set-port-eof?
! ] [
! swap n>buffer
! ] if
! ] if ;
M: win32-socket wince-read ( port port-handle -- )
win32-file-handle over buffer-end pick buffer-capacity 0
windows.winsock:recv
dup windows.winsock:SOCKET_ERROR = [
drop port-errored
] [
dup zero? [
drop
t swap set-port-eof?
] [
swap n>buffer
] if
] if ;
: setup-WSASend ( <WSAArgs> -- s lpBuffers dwBufferCount lpNumberOfBytesRet lpFlags lpOverlapped lpCompletionRoutine )
[ WSAArgs-s ] keep
[
WSAArgs-lpBuffers [ buffer-length ] keep
buffer@
"WSABUF" <c-object>
[ windows.winsock:set-WSABUF-buf ] keep
[ windows.winsock:set-WSABUF-len ] keep
] keep
[ WSAArgs-dwBufferCount ] keep
[ WSAArgs-lpNumberOfBytesRet ] keep
[ WSAArgs-lpFlags ] keep
[ WSAArgs-lpOverlapped ] keep
WSAArgs-lpCompletionRoutine ;
! M: win32-socket wince-write ( port port-handle -- )
! drop dup make-WSAArgs dup setup-WSASend WSASend zero? [
! drop port-errored
! ] [
! FileArgs-lpNumberOfBytesRet *uint ! *DWORD
! over delegate [ buffer-consume ] keep
! buffer-length 0 > [
! flush-output
! ] [
! drop
! ] if
! ] if ;
M: win32-socket wince-write ( port port-handle -- )
win32-file-handle over buffer@ pick buffer-length 0
windows.winsock:send
dup windows.winsock:SOCKET_ERROR =
[ drop port-errored ] [ over buffer-consume port-flush ] if ;
: do-connect ( addrspec -- socket )
[ tcp-socket dup ] keep
make-sockaddr/size
f f f f windows.winsock:WSAConnect zero?
[ windows.winsock:winsock-error ] unless ;
M: windows-ce-io (client) ( addrspec -- duplex-stream )
do-connect <win32-socket> dup handle>duplex-stream ;
M: windows-ce-io <server> ( addrspec -- duplex-stream )
[
windows.winsock:SOCK_STREAM server-fd
dup listen-on-socket
<win32-socket> f <port>
] keep <server-port> ;
M: windows-ce-io accept ( server -- client )
dup check-server-port
[
dup touch-port
dup port-handle win32-file-handle
swap server-port-addr sockaddr-type heap-size
dup <byte-array> [
swap <int> f 0
windows.winsock:WSAAccept dup windows.winsock:INVALID_SOCKET =
[ windows.winsock:winsock-error ] when
] keep
] keep server-port-addr parse-sockaddr swap
<win32-socket> dup handle>duplex-stream <client-stream> ;
M: windows-ce-io <datagram> ( addrspec -- datagram )
[
windows.winsock:SOCK_DGRAM server-fd <win32-socket> f <port>
] keep <datagram-port> ;
M: windows-ce-io receive ( datagram -- packet addrspec )
dup check-datagram-port
[
port-handle win32-file-handle
"WSABUF" <c-object>
default-buffer-size get over windows.winsock:set-WSABUF-len
default-buffer-size get <byte-array> over windows.winsock:set-WSABUF-buf
[
1
0 <uint> [
0 <uint>
64 "char" <c-array> [
64 <int>
f
f
windows.winsock:WSARecvFrom zero?
[ windows.winsock:winsock-error ] unless
] keep
] keep *uint
] keep
] keep
! sockaddr count buf datagram
>r windows.winsock:WSABUF-buf swap memory>string swap r>
datagram-port-addr parse-sockaddr ;
M: windows-ce-io send ( packet addrspec datagram -- )
3dup check-datagram-send
port-handle win32-file-handle
rot dup length "WSABUF" <c-object>
[ windows.winsock:set-WSABUF-len ] keep
[ windows.winsock:set-WSABUF-buf ] keep
rot make-sockaddr/size
>r >r 1 0 <uint> 0 r> r> f f
windows.winsock:WSASendTo zero?
[ windows.winsock:winsock-error ] unless ;

View File

@ -83,8 +83,8 @@ C: <pipe> pipe
PIPE_ACCESS_DUPLEX FILE_FLAG_OVERLAPPED bitor PIPE_ACCESS_DUPLEX FILE_FLAG_OVERLAPPED bitor
PIPE_TYPE_BYTE PIPE_READMODE_BYTE PIPE_NOWAIT bitor bitor PIPE_TYPE_BYTE PIPE_READMODE_BYTE PIPE_NOWAIT bitor bitor
PIPE_UNLIMITED_INSTANCES PIPE_UNLIMITED_INSTANCES
default-buffer-size default-buffer-size get
default-buffer-size default-buffer-size get
0 0
security-attributes-inherit security-attributes-inherit
CreateNamedPipe dup invalid-handle? ; CreateNamedPipe dup invalid-handle? ;

View File

@ -1,13 +1,10 @@
USING: alien alien.c-types arrays assocs combinators continuations USING: alien alien.c-types arrays assocs combinators
destructors io io.backend io.nonblocking io.windows libc continuations destructors io io.backend io.nonblocking
kernel math namespaces sequences threads tuples.lib windows io.windows libc kernel math namespaces sequences threads
windows.errors windows.kernel32 prettyprint strings splitting tuples.lib windows windows.errors windows.kernel32 strings
io.files windows.winsock ; splitting io.files windows.winsock ;
IN: io.windows.nt.backend IN: io.windows.nt.backend
: .. global [ . flush ] bind ;
: .S global [ .s flush ] bind ;
: unicode-prefix ( -- seq ) : unicode-prefix ( -- seq )
"\\\\?\\" ; inline "\\\\?\\" ; inline
@ -51,6 +48,12 @@ C: <io-callback> io-callback
>r (make-overlapped) r> port-handle win32-file-ptr >r (make-overlapped) r> port-handle win32-file-ptr
[ over set-OVERLAPPED-offset ] when* ; [ over set-OVERLAPPED-offset ] when* ;
: port-overlapped ( port -- overlapped )
port-handle win32-file-overlapped ;
: set-port-overlapped ( overlapped port -- )
port-handle set-win32-file-overlapped ;
: completion-port ( handle existing -- handle ) : completion-port ( handle existing -- handle )
f 1 CreateIoCompletionPort dup win32-error=0/f ; f 1 CreateIoCompletionPort dup win32-error=0/f ;
@ -75,7 +78,7 @@ C: <GetOverlappedResult-args> GetOverlappedResult-args
: (save-callback) ( io-callback -- ) : (save-callback) ( io-callback -- )
dup io-callback-port port-handle win32-file-overlapped dup io-callback-port port-handle win32-file-overlapped
\ io-hash get-global set-at ; io-hash get-global set-at ;
: save-callback ( port -- ) : save-callback ( port -- )
[ [
@ -95,7 +98,7 @@ C: <GetQueuedCompletionStatusParams> GetQueuedCompletionStatusParams
: lookup-callback ( GetQueuedCompletion-args -- callback ) : lookup-callback ( GetQueuedCompletion-args -- callback )
GetQueuedCompletionStatusParams-lpOverlapped* *void* GetQueuedCompletionStatusParams-lpOverlapped* *void*
\ io-hash get-global delete-at* drop ; io-hash get-global delete-at* drop ;
: wait-for-io ( timeout -- continuation/f ) : wait-for-io ( timeout -- continuation/f )
wait-for-overlapped wait-for-overlapped
@ -125,19 +128,17 @@ C: <GetQueuedCompletionStatusParams> GetQueuedCompletionStatusParams
drop drop
] if ; ] if ;
: cancel-timedout ( -- ) : cancel-timeout ( -- )
io-hash get-global values [ maybe-expire ] each ; io-hash get-global values [ maybe-expire ] each ;
M: windows-nt-io io-multiplex ( ms -- ) M: windows-nt-io io-multiplex ( ms -- )
cancel-timedout cancel-timeout wait-for-io [ schedule-thread ] when* ;
[ wait-for-io ] [ global [ "error: " write . flush ] bind drop f ] recover
[ schedule-thread ] when* ;
M: windows-nt-io init-io ( -- ) M: windows-nt-io init-io ( -- )
#! Should only be called on startup. Calling this at any #! Should only be called on startup. Calling this at any
#! other time can have unintended consequences. #! other time can have unintended consequences.
global [ global [
master-completion-port \ master-completion-port set master-completion-port \ master-completion-port set
H{ } clone \ io-hash set H{ } clone io-hash set
init-winsock init-winsock
] bind ; ] bind ;

33
extra/io/windows/nt/files/files.factor Normal file → Executable file
View File

@ -17,26 +17,24 @@ M: windows-nt-io FileArgs-overlapped ( port -- overlapped )
2drop 2drop
] if* ; ] if* ;
DEFER: (flush-output)
: finish-flush ( port -- ) : finish-flush ( port -- )
dup pending-error dup pending-error
dup get-overlapped-result dup get-overlapped-result
[ over update-file-ptr ] keep dup pick update-file-ptr
over delegate [ buffer-consume ] keep swap buffer-consume ;
buffer-length 0 > [
(flush-output) : save-overlapped-and-callback ( fileargs port -- )
] [ swap FileArgs-lpOverlapped over set-port-overlapped
drop save-callback ;
] if ;
: (flush-output) ( port -- ) : (flush-output) ( port -- )
dup touch-port dup touch-port
dup make-FileArgs dup make-FileArgs
[ setup-write WriteFile ] keep tuck setup-write WriteFile
>r dupd overlapped-error? r> swap [ dupd overlapped-error? [
FileArgs-lpOverlapped over set-port-overlapped [ save-overlapped-and-callback ] keep
dup save-callback [ finish-flush ] keep
finish-flush dup buffer-empty? [ drop ] [ (flush-output) ] if
] [ ] [
2drop 2drop
] if ; ] if ;
@ -49,17 +47,16 @@ M: windows-nt-io flush-output ( port -- )
dup get-overlapped-result dup zero? [ dup get-overlapped-result dup zero? [
drop t swap set-port-eof? drop t swap set-port-eof?
] [ ] [
[ over n>buffer ] keep dup pick n>buffer
swap update-file-ptr swap update-file-ptr
] if ; ] if ;
: ((wait-to-read)) ( port -- ) : ((wait-to-read)) ( port -- )
dup touch-port dup touch-port
dup make-FileArgs dup make-FileArgs
[ setup-read ReadFile ] keep tuck setup-read ReadFile
>r dupd overlapped-error? r> swap [ dupd overlapped-error? [
FileArgs-lpOverlapped over set-port-overlapped [ save-overlapped-and-callback ] keep
dup save-callback
finish-read finish-read
] [ ] [
2drop 2drop

View File

@ -178,7 +178,7 @@ TUPLE: WSARecvFrom-args port
] keep ] keep
"WSABUF" malloc-object dup free-always "WSABUF" malloc-object dup free-always
2dup swap set-WSARecvFrom-args-lpBuffers* 2dup swap set-WSARecvFrom-args-lpBuffers*
default-buffer-size [ malloc dup free-always ] keep default-buffer-size get [ malloc dup free-always ] keep
pick set-WSABUF-len pick set-WSABUF-len
swap set-WSABUF-buf swap set-WSABUF-buf
1 over set-WSARecvFrom-args-dwBufferCount* 1 over set-WSARecvFrom-args-dwBufferCount*
@ -256,6 +256,8 @@ TUPLE: WSASendTo-args port
\ WSASendTo-args >tuple*< \ WSASendTo-args >tuple*<
WSASendTo socket-error* ; WSASendTo socket-error* ;
USE: io.sockets
M: windows-nt-io send ( packet addrspec datagram -- ) M: windows-nt-io send ( packet addrspec datagram -- )
[ [
3dup check-datagram-send 3dup check-datagram-send

36
extra/io/windows/windows.factor Normal file → Executable file
View File

@ -31,12 +31,6 @@ TUPLE: win32-file handle ptr overlapped ;
{ set-win32-file-handle set-win32-file-ptr } { set-win32-file-handle set-win32-file-ptr }
\ win32-file construct ; \ win32-file construct ;
: set-port-overlapped ( overlapped port -- )
port-handle set-win32-file-overlapped ;
: port-overlapped ( port -- overlapped )
port-handle win32-file-overlapped ;
HOOK: CreateFile-flags io-backend ( -- DWORD ) HOOK: CreateFile-flags io-backend ( -- DWORD )
HOOK: flush-output io-backend ( port -- ) HOOK: flush-output io-backend ( port -- )
HOOK: FileArgs-overlapped io-backend ( port -- overlapped/f ) HOOK: FileArgs-overlapped io-backend ( port -- overlapped/f )
@ -48,7 +42,14 @@ M: windows-io normalize-directory ( string -- string )
: share-mode ( -- fixnum ) : share-mode ( -- fixnum )
FILE_SHARE_READ FILE_SHARE_WRITE bitor ; inline FILE_SHARE_READ FILE_SHARE_WRITE bitor ; inline
M: win32-file init-handle ( handle -- ) drop ; M: win32-file init-handle ( handle -- )
drop ;
M: win32-file close-handle ( handle -- )
win32-file-handle CloseHandle drop ;
M: port port-flush
dup buffer-empty? [ dup flush-output ] unless drop ;
! Clean up resources (open handle) if add-completion fails ! Clean up resources (open handle) if add-completion fails
: open-file ( path access-mode create-mode -- handle ) : open-file ( path access-mode create-mode -- handle )
@ -101,27 +102,6 @@ C: <FileArgs> FileArgs
[ FileArgs-lpNumberOfBytesRet ] keep [ FileArgs-lpNumberOfBytesRet ] keep
FileArgs-lpOverlapped ; FileArgs-lpOverlapped ;
M: output-port stream-flush ( port -- )
dup buffer-empty? [
dup flush-output
] unless pending-error ;
M: port stream-close ( port -- )
dup port-type closed = [
drop
] [
! For duplex-streams, we call CloseHandle twice on the same handle
[ dup port-type output = [ stream-flush ] [ drop ] if ] keep
[ closed swap set-port-type ] keep
[ port-handle win32-file-handle CloseHandle drop ] keep
USE: namespaces
[ delegate [ buffer-free ] [
global [ "delegate was empty!!" print flush ] bind
USE: windows.winsock.private
] if* ] keep
f swap set-delegate
] if ;
M: windows-io <file-reader> ( path -- stream ) M: windows-io <file-reader> ( path -- stream )
open-read <win32-file> <reader> ; open-read <win32-file> <reader> ;

10
extra/windows/winsock/winsock.factor Normal file → Executable file
View File

@ -166,9 +166,8 @@ FUNCTION: int connect ( void* socket, sockaddr_in* sockaddr, int addrlen ) ;
FUNCTION: int select ( int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, timeval* timeout ) ; FUNCTION: int select ( int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, timeval* timeout ) ;
FUNCTION: int closesocket ( SOCKET s ) ; FUNCTION: int closesocket ( SOCKET s ) ;
FUNCTION: int shutdown ( SOCKET s, int how ) ; FUNCTION: int shutdown ( SOCKET s, int how ) ;
! FUNCTION: int send ( SOCKET s, char* buf, int len, int flags ) ; FUNCTION: int send ( SOCKET s, char* buf, int len, int flags ) ;
! FUNCTION: int recv ( SOCKET s, char* buf, int len, int flags ) ; FUNCTION: int recv ( SOCKET s, char* buf, int len, int flags ) ;
TYPEDEF: uint SERVICETYPE TYPEDEF: uint SERVICETYPE
TYPEDEF: OVERLAPPED WSAOVERLAPPED TYPEDEF: OVERLAPPED WSAOVERLAPPED
@ -405,6 +404,9 @@ FUNCTION: void GetAcceptExSockaddrs ( void* a, int b, int c, int d, void* e, voi
: winsock-error-string ( -- string/f ) : winsock-error-string ( -- string/f )
WSAGetLastError (winsock-error-string) ; WSAGetLastError (winsock-error-string) ;
: winsock-error ( -- )
winsock-error-string [ throw ] when* ;
: winsock-error=0/f ( n/f -- ) : winsock-error=0/f ( n/f -- )
{ 0 f } member? [ { 0 f } member? [
winsock-error-string throw winsock-error-string throw
@ -428,7 +430,7 @@ FUNCTION: void GetAcceptExSockaddrs ( void* a, int b, int c, int d, void* e, voi
] when ; ] when ;
: socket-error ( n -- ) : socket-error ( n -- )
SOCKET_ERROR = [ winsock-error-string throw ] when ; SOCKET_ERROR = [ winsock-error ] when ;
: init-winsock ( -- ) : init-winsock ( -- )
HEX: 0202 <wsadata> WSAStartup winsock-error!=0/f ; HEX: 0202 <wsadata> WSAStartup winsock-error!=0/f ;

View File

@ -13,7 +13,7 @@ void default_parameters(F_PARAMETERS *p)
p->gen_count = 2; p->gen_count = 2;
p->code_size = 4; p->code_size = 4;
p->young_size = 1; p->young_size = 1;
p->aging_size = 4; p->aging_size = 6;
#else #else
p->ds_size = 32 * CELLS; p->ds_size = 32 * CELLS;
p->rs_size = 32 * CELLS; p->rs_size = 32 * CELLS;