From 76d2b836854552d7e2b52b008b78382eb1db6cee Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 23 Aug 2010 21:08:16 -0500 Subject: [PATCH] Add unless-disposed combinator to clean up some repetition, and fix bogus error reported from timer thread if an I/O operation with a set timeout fails on Windows --- basis/io/backend/unix/unix.factor | 8 ++++---- basis/io/backend/windows/nt/nt.factor | 2 +- basis/io/backend/windows/windows.factor | 4 +--- basis/io/monitors/linux/linux.factor | 4 ++-- basis/io/monitors/recursive/recursive.factor | 4 ++-- core/destructors/destructors.factor | 12 +++++++----- 6 files changed, 17 insertions(+), 17 deletions(-) mode change 100644 => 100755 basis/io/backend/unix/unix.factor mode change 100644 => 100755 basis/io/monitors/linux/linux.factor mode change 100644 => 100755 basis/io/monitors/recursive/recursive.factor mode change 100644 => 100755 core/destructors/destructors.factor diff --git a/basis/io/backend/unix/unix.factor b/basis/io/backend/unix/unix.factor old mode 100644 new mode 100755 index 972b2a5b07..fd9fed0472 --- a/basis/io/backend/unix/unix.factor +++ b/basis/io/backend/unix/unix.factor @@ -25,25 +25,25 @@ TUPLE: fd < disposable fd ; fd new-disposable swap >>fd ; M: fd dispose - dup disposed>> [ drop ] [ + [ { [ cancel-operation ] [ t >>disposed drop ] [ unregister-disposable ] [ fd>> close-file ] } cleave - ] if ; + ] unless-disposed ; M: fd handle-fd dup check-disposed fd>> ; M: fd cancel-operation ( fd -- ) - dup disposed>> [ drop ] [ + [ fd>> mx get-global [ remove-input-callbacks [ t swap resume-with ] each ] [ remove-output-callbacks [ t swap resume-with ] each ] 2bi - ] if ; + ] unless-disposed ; M: unix tell-handle ( handle -- n ) fd>> 0 SEEK_CUR [ lseek ] unix-system-call [ io-error ] [ ] bi ; diff --git a/basis/io/backend/windows/nt/nt.factor b/basis/io/backend/windows/nt/nt.factor index 69a86c7ec3..aa8a61b87a 100755 --- a/basis/io/backend/windows/nt/nt.factor +++ b/basis/io/backend/windows/nt/nt.factor @@ -71,7 +71,7 @@ M: winnt add-completion ( win32-handle -- ) ] [ resume-callback t ] if ; M: win32-handle cancel-operation - [ check-disposed ] [ handle>> CancelIo drop ] bi ; + [ handle>> CancelIo win32-error=0/f ] unless-disposed ; M: winnt io-multiplex ( nanos -- ) handle-overlapped [ 0 io-multiplex ] when ; diff --git a/basis/io/backend/windows/windows.factor b/basis/io/backend/windows/windows.factor index 471cab0950..8864dff9ad 100755 --- a/basis/io/backend/windows/windows.factor +++ b/basis/io/backend/windows/windows.factor @@ -30,9 +30,7 @@ TUPLE: win32-file < win32-handle ptr ; win32-file new-win32-handle ; M: win32-file dispose - [ dup disposed>> [ drop ] [ cancel-operation ] if ] - [ call-next-method ] - bi ; + [ cancel-operation ] [ call-next-method ] bi ; HOOK: CreateFile-flags io-backend ( DWORD -- DWORD ) HOOK: FileArgs-overlapped io-backend ( port -- overlapped/f ) diff --git a/basis/io/monitors/linux/linux.factor b/basis/io/monitors/linux/linux.factor old mode 100644 new mode 100755 index 9b2440aec8..6dcd211055 --- a/basis/io/monitors/linux/linux.factor +++ b/basis/io/monitors/linux/linux.factor @@ -56,10 +56,10 @@ M: linux (monitor) ( path recursive? mailbox -- monitor ) M: linux-monitor dispose* ( monitor -- ) [ [ wd>> ] [ watches>> ] bi delete-at ] [ - dup inotify>> disposed>> [ drop ] [ + dup inotify>> [ [ inotify>> handle>> handle-fd ] [ wd>> ] bi inotify_rm_watch io-error - ] if + ] unless-disposed ] [ call-next-method ] tri ; diff --git a/basis/io/monitors/recursive/recursive.factor b/basis/io/monitors/recursive/recursive.factor old mode 100644 new mode 100755 index 70daed9018..c30220d0ec --- a/basis/io/monitors/recursive/recursive.factor +++ b/basis/io/monitors/recursive/recursive.factor @@ -49,10 +49,10 @@ M: recursive-monitor dispose* monitor tget children>> values dispose-each ; : pump-step ( msg -- ) - monitor tget disposed>> [ drop ] [ + monitor tget [ [ [ monitor>> path>> ] [ path>> ] bi append-path ] [ changed>> ] bi monitor tget queue-change - ] if ; + ] unless-disposed ; : child-added ( path monitor -- ) path>> prepend-path add-child-monitor ; diff --git a/core/destructors/destructors.factor b/core/destructors/destructors.factor old mode 100644 new mode 100755 index e6d78fa03e..c8b8f81f6a --- a/core/destructors/destructors.factor +++ b/core/destructors/destructors.factor @@ -1,4 +1,4 @@ -! Copyright (C) 2007, 2009 Doug Coleman, Slava Pestov. +! Copyright (C) 2007, 2010 Doug Coleman, Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: accessors continuations kernel namespaces make sequences vectors sets assocs init math ; @@ -40,15 +40,17 @@ ERROR: already-disposed disposable ; GENERIC: dispose ( disposable -- ) -M: object dispose - dup disposed>> [ drop ] [ t >>disposed dispose* ] if ; +: unless-disposed ( disposable quot -- ) + [ dup disposed>> [ drop ] ] dip if ; inline + +M: object dispose [ t >>disposed dispose* ] unless-disposed ; M: disposable dispose - dup disposed>> [ drop ] [ + [ [ unregister-disposable ] [ call-next-method ] bi - ] if ; + ] unless-disposed ; : dispose-each ( seq -- ) [