From 81c5b413f489337abf9ea4255d21d4a0ccf23328 Mon Sep 17 00:00:00 2001 From: Slava Date: Wed, 23 Jan 2008 01:49:01 -0500 Subject: [PATCH] Working on epoll --- extra/io/unix/epoll/epoll.factor | 23 +++++++++++++---------- extra/io/unix/linux/linux.factor | 11 ++++++----- extra/io/unix/unix.factor | 4 ++-- extra/unix/linux/epoll/epoll.factor | 2 +- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/extra/io/unix/epoll/epoll.factor b/extra/io/unix/epoll/epoll.factor index f2230f6e81..f0280aac78 100644 --- a/extra/io/unix/epoll/epoll.factor +++ b/extra/io/unix/epoll/epoll.factor @@ -1,7 +1,8 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: alien.c-types kernel io.nonblocking io.unix.backend -bit-arrays sequences assocs unix math namespaces structs ; +bit-arrays sequences assocs unix unix.linux.epoll math +namespaces structs ; IN: io.unix.epoll TUPLE: epoll-mx events ; @@ -18,17 +19,17 @@ TUPLE: epoll-mx events ; GENERIC: io-task-events ( task -- n ) -M: input-task drop EPOLLIN ; +M: input-task io-task-events drop EPOLLIN ; -M: output-task drop EPOLLOUT ; +M: output-task io-task-events drop EPOLLOUT ; : make-event ( task -- event ) "epoll-event" over io-task-events over set-epoll-event-events - over io-task-fd over set-epoll-fd ; + swap io-task-fd over set-epoll-event-fd ; : do-epoll-ctl ( task mx what -- ) - >r >r make-event r> mx-fd r> pick event-data *int roll + >r >r make-event r> mx-fd r> pick epoll-event-fd roll epoll_ctl io-error ; M: epoll-mx register-io-task ( task mx -- ) @@ -37,9 +38,9 @@ M: epoll-mx register-io-task ( task mx -- ) M: epoll-mx unregister-io-task ( task mx -- ) EPOLL_CTL_DEL do-epoll-ctl ; -: wait-kevent ( mx timeout -- n ) - >r mx-fd epoll-mx-events max-events r> epoll_wait - dup multiplexer-error ; +: wait-event ( mx timeout -- n ) + >r { mx-fd epoll-mx-events } get-slots max-events + r> epoll_wait dup multiplexer-error ; : epoll-read-task ( mx fd -- ) over mx-reads at* [ handle-io-task ] [ 2drop ] if ; @@ -51,7 +52,9 @@ M: epoll-mx unregister-io-task ( task mx -- ) epoll-event-fd 2dup epoll-read-task epoll-write-task ; : handle-events ( mx n -- ) - [ over epoll-mx-events kevent-nth handle-kevent ] with each ; + [ + over epoll-mx-events epoll-event-nth handle-event + ] with each ; M: epoll-mx wait-for-events ( ms mx -- ) - dup rot wait-kevent handle-kevents ; + dup rot wait-event handle-events ; diff --git a/extra/io/unix/linux/linux.factor b/extra/io/unix/linux/linux.factor index 180e81e30a..919fba8d5d 100644 --- a/extra/io/unix/linux/linux.factor +++ b/extra/io/unix/linux/linux.factor @@ -1,17 +1,18 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. IN: io.unix.linux -USING: io.unix.backend io.unix.select namespaces kernel assocs ; +USING: io.backend io.unix.backend io.unix.launcher io.unix.epoll +namespaces kernel assocs unix.process ; TUPLE: linux-io ; INSTANCE: linux-io unix-io M: linux-io init-io ( -- ) - start-wait-loop - mx set-global ; + mx set-global + start-wait-loop ; -M: linux-io wait-for-pid ( pid -- status ) - [ kqueue-mx get-global add-pid-task stop ] curry callcc1 ; +M: linux-io wait-for-process ( pid -- status ) + wait-for-pid ; T{ linux-io } io-backend set-global diff --git a/extra/io/unix/unix.factor b/extra/io/unix/unix.factor index d6d0a9cc22..7dc66a05ad 100755 --- a/extra/io/unix/unix.factor +++ b/extra/io/unix/unix.factor @@ -5,6 +5,6 @@ system vocabs.loader ; { { [ bsd? ] [ "io.unix.bsd" ] } { [ macosx? ] [ "io.unix.bsd" ] } - { [ linux? ] [ "io.unix.backend.linux" ] } - { [ solaris? ] [ "io.unix.backend.solaris" ] } + { [ linux? ] [ "io.unix.linux" ] } + { [ solaris? ] [ "io.unix.solaris" ] } } cond require diff --git a/extra/unix/linux/epoll/epoll.factor b/extra/unix/linux/epoll/epoll.factor index 946c387acc..6606c11568 100644 --- a/extra/unix/linux/epoll/epoll.factor +++ b/extra/unix/linux/epoll/epoll.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. IN: unix.linux.epoll -USING: alien.syntax ; +USING: alien.syntax math ; FUNCTION: int epoll_create ( int size ) ;