diff --git a/basis/alarms/alarms-tests.factor b/basis/alarms/alarms-tests.factor index 8f7868324d..17dd08cfcf 100644 --- a/basis/alarms/alarms-tests.factor +++ b/basis/alarms/alarms-tests.factor @@ -1,5 +1,6 @@ USING: alarms alarms.private kernel calendar sequences -tools.test threads concurrency.count-downs ; +tools.test threads concurrency.count-downs concurrency.promises +fry tools.time math ; IN: alarms.tests [ ] [ @@ -14,3 +15,17 @@ IN: alarms.tests self [ resume ] curry instant later drop "test" suspend drop ] unit-test + +[ t ] [ + [ + + '[ t _ fulfill ] 5 seconds later drop + ] benchmark 4,000,000,000 > +] unit-test + +[ { 3 } ] [ + { 3 } dup + '[ 4 _ set-first ] 2 seconds later + 1/2 seconds sleep + cancel-alarm +] unit-test diff --git a/basis/io/backend/unix/unix.factor b/basis/io/backend/unix/unix.factor index 0e84f1b65e..972b2a5b07 100644 --- a/basis/io/backend/unix/unix.factor +++ b/basis/io/backend/unix/unix.factor @@ -144,7 +144,7 @@ M: stdin dispose* tri ] with-destructors ; -: wait-for-stdin ( stdin -- n ) +: wait-for-stdin ( stdin -- size ) [ control>> CHAR: X over io:stream-write1 io:stream-flush ] [ size>> ssize_t heap-size swap io:stream-read *int ] bi ; @@ -160,7 +160,12 @@ M: stdin dispose* ] if ; M: stdin refill - [ buffer>> ] [ dup wait-for-stdin ] bi* refill-stdin f ; + '[ + buffer>> _ dup wait-for-stdin refill-stdin f + ] with-timeout ; + +M: stdin cancel-operation + [ size>> ] [ control>> ] bi [ cancel-operation ] bi@ ; : control-write-fd ( -- fd ) &: control_write *uint ;