more Unix I/O work
parent
d5618709dd
commit
3e9381d867
|
@ -8,9 +8,9 @@
|
||||||
- powerpc has weird callstack residue
|
- powerpc has weird callstack residue
|
||||||
- make-vector and make-string should not need a reverse step
|
- make-vector and make-string should not need a reverse step
|
||||||
- console with presentations
|
- console with presentations
|
||||||
|
|
||||||
+ plugin:
|
+ plugin:
|
||||||
|
|
||||||
|
- extract word: if selection empty, move caret to new word after
|
||||||
- introduce quotation command
|
- introduce quotation command
|
||||||
- set 'end' of artifacts/assets accurately
|
- set 'end' of artifacts/assets accurately
|
||||||
|
|
||||||
|
@ -96,7 +96,6 @@
|
||||||
|
|
||||||
- regexps
|
- regexps
|
||||||
- XML
|
- XML
|
||||||
- matrices, vector math
|
|
||||||
- HTTP client
|
- HTTP client
|
||||||
- real Unicode support (strings are already 16 bits and can be extended
|
- real Unicode support (strings are already 16 bits and can be extended
|
||||||
to 21 if the need arises, but we need full character classification
|
to 21 if the need arises, but we need full character classification
|
||||||
|
@ -108,3 +107,10 @@
|
||||||
|
|
||||||
- virtual hosts
|
- virtual hosts
|
||||||
- keep alive
|
- keep alive
|
||||||
|
|
||||||
|
+ matrix lib:
|
||||||
|
|
||||||
|
- scalar * matrix, vector * matrix, matrix * vector need to work
|
||||||
|
- turning vectors into row and column matrices
|
||||||
|
- make-matrix is slow and ugly
|
||||||
|
- move 2repeat somewhere else
|
||||||
|
|
|
@ -91,7 +91,7 @@ M: sequence (tree-each) [ swap call ] seq-each-with ;
|
||||||
: length= ( seq seq -- ? ) length swap length number= ;
|
: length= ( seq seq -- ? ) length swap length number= ;
|
||||||
|
|
||||||
: (sequence=) ( seq seq i -- ? )
|
: (sequence=) ( seq seq i -- ? )
|
||||||
over length over = [
|
over length over number= [
|
||||||
3drop t
|
3drop t
|
||||||
] [
|
] [
|
||||||
3dup 2nth = [
|
3dup 2nth = [
|
||||||
|
|
|
@ -1,16 +1,24 @@
|
||||||
! Copyright (C) 2005 Slava Pestov.
|
! Copyright (C) 2005 Slava Pestov.
|
||||||
! See http://factor.sf.net/license.txt for BSD license.
|
! See http://factor.sf.net/license.txt for BSD license.
|
||||||
IN: io-internals
|
IN: io-internals
|
||||||
USING: errors generic kernel lists math namespaces sequences
|
USING: errors generic hashtables kernel lists math namespaces
|
||||||
strings vectors ;
|
sequences strings threads vectors ;
|
||||||
|
|
||||||
|
! These let us load the code into a CFactor instance using the
|
||||||
|
! old C-based I/O. They will be removed soon.
|
||||||
FORGET: can-read-line?
|
FORGET: can-read-line?
|
||||||
FORGET: can-read-count?
|
FORGET: can-read-count?
|
||||||
FORGET: can-write?
|
FORGET: can-write?
|
||||||
|
FORGET: add-write-io-task
|
||||||
|
|
||||||
TUPLE: io-task port callback ;
|
TUPLE: io-task port callbacks ;
|
||||||
GENERIC: do-io-task ( task -- ? )
|
GENERIC: do-io-task ( task -- ? )
|
||||||
|
GENERIC: io-task-events ( task -- events )
|
||||||
|
|
||||||
|
! A hashtable in the global namespace mapping fd numbers to
|
||||||
|
! io-tasks. This is not a vector, since we need a quick way
|
||||||
|
! to find the number of elements, and a hashtable gives us
|
||||||
|
! this with the hash-size call.
|
||||||
SYMBOL: io-tasks
|
SYMBOL: io-tasks
|
||||||
|
|
||||||
: file-mode OCT: 0600 ;
|
: file-mode OCT: 0600 ;
|
||||||
|
@ -88,7 +96,7 @@ C: reader ( handle -- reader )
|
||||||
|
|
||||||
TUPLE: read-line-task ;
|
TUPLE: read-line-task ;
|
||||||
|
|
||||||
C: read-line-task ( port callback -- task )
|
C: read-line-task ( port callbacks -- task )
|
||||||
[ >r <io-task> r> set-delegate ] keep ;
|
[ >r <io-task> r> set-delegate ] keep ;
|
||||||
|
|
||||||
M: read-line-task do-io-task
|
M: read-line-task do-io-task
|
||||||
|
@ -98,6 +106,9 @@ M: read-line-task do-io-task
|
||||||
read-line-step
|
read-line-step
|
||||||
] ifte ;
|
] ifte ;
|
||||||
|
|
||||||
|
M: read-line-task io-task-events ( task -- events )
|
||||||
|
drop read-events ;
|
||||||
|
|
||||||
: read-count-step ( count reader -- ? )
|
: read-count-step ( count reader -- ? )
|
||||||
dup reader-line -rot >r over length - r>
|
dup reader-line -rot >r over length - r>
|
||||||
2dup buffer-fill <= [
|
2dup buffer-fill <= [
|
||||||
|
@ -116,16 +127,19 @@ M: read-line-task do-io-task
|
||||||
|
|
||||||
TUPLE: read-task count ;
|
TUPLE: read-task count ;
|
||||||
|
|
||||||
C: read-task ( port callback -- task )
|
C: read-task ( port callbacks -- task )
|
||||||
[ >r <io-task> r> set-delegate ] keep ;
|
[ >r <io-task> r> set-delegate ] keep ;
|
||||||
|
|
||||||
M: read-task do-io-task
|
M: read-task do-io-task
|
||||||
dup refill dup eof? [
|
io-task-port dup refill dup eof? [
|
||||||
nip reader-eof t
|
nip reader-eof t
|
||||||
] [
|
] [
|
||||||
read-count-step
|
read-count-step
|
||||||
] ifte ;
|
] ifte ;
|
||||||
|
|
||||||
|
M: read-task io-task-events ( task -- events )
|
||||||
|
drop read-events ;
|
||||||
|
|
||||||
: pop-line ( reader -- str )
|
: pop-line ( reader -- str )
|
||||||
dup reader-line dup [ sbuf>string ] when >r
|
dup reader-line dup [ sbuf>string ] when >r
|
||||||
f over set-reader-line
|
f over set-reader-line
|
||||||
|
@ -159,16 +173,19 @@ C: writer ( fd -- writer )
|
||||||
|
|
||||||
TUPLE: write-task ;
|
TUPLE: write-task ;
|
||||||
|
|
||||||
C: write-task ( port callback -- task )
|
C: write-task ( port callbacks -- task )
|
||||||
[ >r <io-task> r> set-delegate ] keep ;
|
[ >r <io-task> r> set-delegate ] keep ;
|
||||||
|
|
||||||
M: write-task do-io-task
|
M: write-task do-io-task
|
||||||
dup buffer-length 0 = over port-error or [
|
io-task-port dup buffer-length 0 = over port-error or [
|
||||||
0 swap buffer-reset t
|
0 swap buffer-reset t
|
||||||
] [
|
] [
|
||||||
>port< write-step
|
>port< write-step
|
||||||
] ifte ;
|
] ifte ;
|
||||||
|
|
||||||
|
M: write-task io-task-events ( task -- events )
|
||||||
|
drop write-events ;
|
||||||
|
|
||||||
: write-fin ( str writer -- )
|
: write-fin ( str writer -- )
|
||||||
dup pending-error
|
dup pending-error
|
||||||
>r dup string? [ ch>string ] unless r> >buffer ;
|
>r dup string? [ ch>string ] unless r> >buffer ;
|
||||||
|
@ -191,11 +208,68 @@ M: write-task do-io-task
|
||||||
2drop f
|
2drop f
|
||||||
] ifte ;
|
] ifte ;
|
||||||
|
|
||||||
: cons-nth ( elt n seq -- )
|
: io-task-fd io-task-port port-handle ;
|
||||||
[ nth cons ] 2keep set-nth ;
|
|
||||||
|
|
||||||
: add-io-task ( task -- )
|
: add-io-task ( task -- )
|
||||||
dup io-task-port port-handle io-tasks get cons-nth ;
|
dup io-task-fd io-tasks get 2dup hash [
|
||||||
|
"Cannot perform multiple I/O ops on the same port" throw
|
||||||
|
] when set-hash ;
|
||||||
|
|
||||||
|
: add-write-io-task ( task -- )
|
||||||
|
dup io-task-fd io-tasks get hash [
|
||||||
|
dup write-task? [
|
||||||
|
[
|
||||||
|
>r io-task-callbacks r> io-task-callbacks append
|
||||||
|
] keep set-io-task-callbacks
|
||||||
|
] [
|
||||||
|
add-io-task
|
||||||
|
] ifte
|
||||||
|
] [
|
||||||
|
add-io-task
|
||||||
|
] ifte* ;
|
||||||
|
|
||||||
|
: remove-io-task ( task -- )
|
||||||
|
io-task-fd io-tasks get remove-hash ;
|
||||||
|
|
||||||
|
: pop-callback ( task -- callback )
|
||||||
|
dup io-task-callbacks uncons dup [
|
||||||
|
rot set-io-task-callbacks
|
||||||
|
] [
|
||||||
|
drop swap remove-io-task
|
||||||
|
] ifte ;
|
||||||
|
|
||||||
|
: handle-fd ( fd -- )
|
||||||
|
io-tasks get hash dup do-io-task [
|
||||||
|
pop-callback call
|
||||||
|
] [
|
||||||
|
drop
|
||||||
|
] ifte ;
|
||||||
|
|
||||||
|
: do-io-tasks ( pollfds n -- )
|
||||||
|
[
|
||||||
|
dup pick pollfd-nth dup pollfd-revents 0 = [
|
||||||
|
drop
|
||||||
|
] [
|
||||||
|
pollfd-fd handle-fd
|
||||||
|
] ifte
|
||||||
|
] repeat drop ;
|
||||||
|
|
||||||
|
: init-pollfd ( task pollfd -- )
|
||||||
|
over io-task-fd over set-pollfd-fd
|
||||||
|
swap io-task-events swap set-pollfd-events ;
|
||||||
|
|
||||||
|
: make-pollfds ( -- pollfds n )
|
||||||
|
io-tasks get dup hash-size [
|
||||||
|
<pollfd-array> swap hash-values [
|
||||||
|
dup io-task-fd pick pollfd-nth init-pollfd
|
||||||
|
] each
|
||||||
|
] keep ;
|
||||||
|
|
||||||
|
: io-multiplexer ( -- )
|
||||||
|
make-pollfds dupd 0 sys-poll do-io-tasks ;
|
||||||
|
|
||||||
|
: io-loop ( -- ) io-multiplexer yield io-loop ;
|
||||||
|
|
||||||
: init-io ( -- )
|
: init-io ( -- )
|
||||||
global [ 100 <vector> io-tasks set ] bind ;
|
global [ <namespace> io-tasks set ] bind
|
||||||
|
[ io-loop ] in-thread ;
|
||||||
|
|
|
@ -105,5 +105,8 @@ END-STRUCT
|
||||||
: POLLRDBAND HEX: 0080 ; ! OOB/Urgent readable data
|
: POLLRDBAND HEX: 0080 ; ! OOB/Urgent readable data
|
||||||
: POLLWRBAND HEX: 0100 ; ! OOB/Urgent data can be written
|
: POLLWRBAND HEX: 0100 ; ! OOB/Urgent data can be written
|
||||||
|
|
||||||
|
: read-events POLLIN POLLRDNORM bitor POLLRDBAND bitor ;
|
||||||
|
: write-events POLLOUT POLLWRNORM bitor POLLWRBAND bitor ;
|
||||||
|
|
||||||
: sys-poll ( pollfds nfds timeout -- n )
|
: sys-poll ( pollfds nfds timeout -- n )
|
||||||
"int" "libc" "poll" [ "pollfd*" "uint" "int" ] alien-invoke ;
|
"int" "libc" "poll" [ "pollfd*" "uint" "int" ] alien-invoke ;
|
||||||
|
|
Loading…
Reference in New Issue