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
							parent
							
								
									2ba279d689
								
							
						
					
					
						commit
						76d2b83685
					
				| 
						 | 
				
			
			@ -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 ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 -- )
 | 
			
		||||
    [
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue