From 9c745c44d32284c4daf9d517429b96b4823f3d0b Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Fri, 21 Mar 2008 14:53:11 -0500 Subject: [PATCH] add set-priority and get-priority add clear_err_no and check-errno for dealing with get-priority --- extra/io/priority/priority.factor | 5 +++++ extra/io/unix/backend/backend.factor | 3 +++ extra/io/unix/priority/priority.factor | 21 +++++++++++++++++++++ extra/io/unix/unix.factor | 2 +- extra/unix/unix.factor | 1 + vm/io.c | 5 +++++ vm/io.h | 1 + 7 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 extra/io/priority/priority.factor create mode 100644 extra/io/unix/priority/priority.factor diff --git a/extra/io/priority/priority.factor b/extra/io/priority/priority.factor new file mode 100644 index 0000000000..0790563072 --- /dev/null +++ b/extra/io/priority/priority.factor @@ -0,0 +1,5 @@ +USING: io.backend kernel ; +IN: io.priority + +HOOK: get-priority io-backend ( -- n ) +HOOK: set-priority io-backend ( n -- ) diff --git a/extra/io/unix/backend/backend.factor b/extra/io/unix/backend/backend.factor index 93691c63e2..c9bd331bcd 100755 --- a/extra/io/unix/backend/backend.factor +++ b/extra/io/unix/backend/backend.factor @@ -72,6 +72,9 @@ M: mx unregister-io-task ( task mx -- ) : (io-error) ( -- * ) err_no strerror throw ; +: check-errno ( -- ) + err_no dup zero? [ drop ] [ strerror throw ] if ; + : check-null ( n -- ) zero? [ (io-error) ] when ; : io-error ( n -- ) 0 < [ (io-error) ] when ; diff --git a/extra/io/unix/priority/priority.factor b/extra/io/unix/priority/priority.factor new file mode 100644 index 0000000000..deb801e3cf --- /dev/null +++ b/extra/io/unix/priority/priority.factor @@ -0,0 +1,21 @@ +USING: alien.syntax kernel io.priority io.unix.backend +unix ; +IN: io.unix.priority + +: PRIO_PROCESS 0 ; inline +: PRIO_PGRP 1 ; inline +: PRIO_USER 2 ; inline + +: PRIO_MIN -20 ; inline +: PRIO_MAX 20 ; inline + +! which/who = 0 for current process +FUNCTION: int getpriority ( int which, int who ) ; +FUNCTION: int setpriority ( int which, int who, int prio ) ; + +M: unix-io get-priority ( -- n ) + clear_err_no + 0 0 getpriority dup -1 = [ check-errno ] when ; + +M: unix-io set-priority ( n -- ) + 0 0 rot setpriority io-error ; diff --git a/extra/io/unix/unix.factor b/extra/io/unix/unix.factor index 1f0492a060..83a455c29a 100755 --- a/extra/io/unix/unix.factor +++ b/extra/io/unix/unix.factor @@ -1,5 +1,5 @@ USING: io.unix.backend io.unix.files io.unix.sockets io.timeouts -io.unix.launcher io.unix.mmap io.backend +io.unix.launcher io.unix.mmap io.backend io.priority combinators namespaces system vocabs.loader sequences ; "io.unix." os append require diff --git a/extra/unix/unix.factor b/extra/unix/unix.factor index e1d49b8c6c..09d77fee11 100755 --- a/extra/unix/unix.factor +++ b/extra/unix/unix.factor @@ -27,6 +27,7 @@ TYPEDEF: ulong size_t ! ! ! Unix functions LIBRARY: factor FUNCTION: int err_no ( ) ; +FUNCTION: void clear_err_no ( ) ; LIBRARY: libc diff --git a/vm/io.c b/vm/io.c index faf681bbef..bc561f5e5b 100755 --- a/vm/io.c +++ b/vm/io.c @@ -194,3 +194,8 @@ int err_no(void) { return errno; } + +void clear_err_no(void) +{ + errno = 0; +} diff --git a/vm/io.h b/vm/io.h index 6291db50ee..f4af9b8bec 100755 --- a/vm/io.h +++ b/vm/io.h @@ -1,6 +1,7 @@ void init_c_io(void); void io_error(void); int err_no(void); +void clear_err_no(void); DECLARE_PRIMITIVE(fopen); DECLARE_PRIMITIVE(fgetc);