]> gitweb.factorcode.org Git - factor.git/commitdiff
Move destructors to core
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Thu, 15 May 2008 04:23:12 +0000 (23:23 -0500)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Thu, 15 May 2008 04:23:12 +0000 (23:23 -0500)
82 files changed:
core/alien/c-types/c-types-docs.factor
core/continuations/continuations-docs.factor
core/continuations/continuations.factor
core/destructors/authors.txt [new file with mode: 0644]
core/destructors/destructors-docs.factor [new file with mode: 0755]
core/destructors/destructors-tests.factor [new file with mode: 0755]
core/destructors/destructors.factor [new file with mode: 0755]
core/destructors/summary.txt [new file with mode: 0644]
core/io/encodings/encodings.factor
core/io/files/files-docs.factor
core/io/files/files-tests.factor
core/io/files/files.factor
core/io/io-docs.factor
core/io/io.factor
core/io/streams/c/c.factor
core/io/streams/nested/nested.factor
core/io/streams/string/string.factor
core/libc/libc-docs.factor
core/libc/libc.factor
extra/benchmark/sockets/sockets.factor
extra/bunny/bunny.factor
extra/bunny/cel-shaded/cel-shaded.factor
extra/bunny/fixed-pipeline/fixed-pipeline.factor
extra/bunny/model/model.factor
extra/bunny/outlined/outlined.factor
extra/cairo/cairo.factor
extra/checksums/openssl/openssl.factor
extra/combinators/lib/lib-tests.factor
extra/combinators/lib/lib.factor
extra/concurrency/mailboxes/mailboxes.factor
extra/core-foundation/fsevents/fsevents.factor
extra/db/db.factor
extra/db/mysql/mysql.factor
extra/db/postgresql/postgresql.factor
extra/db/sqlite/sqlite.factor
extra/db/tuples/tuples.factor
extra/destructors/authors.txt [deleted file]
extra/destructors/destructors-docs.factor [deleted file]
extra/destructors/destructors-tests.factor [deleted file]
extra/destructors/destructors.factor [deleted file]
extra/destructors/summary.txt [deleted file]
extra/help/handbook/handbook.factor
extra/html/html.factor
extra/http/server/static/static.factor
extra/io/launcher/launcher.factor
extra/io/mmap/mmap-docs.factor
extra/io/mmap/mmap.factor
extra/io/monitors/monitors-docs.factor
extra/io/monitors/monitors-tests.factor
extra/io/monitors/monitors.factor
extra/io/monitors/recursive/recursive.factor
extra/io/pipes/pipes-docs.factor
extra/io/pipes/pipes-tests.factor
extra/io/pipes/pipes.factor
extra/io/ports/ports-docs.factor
extra/io/ports/ports.factor
extra/io/server/server.factor
extra/io/sockets/secure/secure.factor
extra/io/sockets/sockets-docs.factor
extra/io/sockets/sockets.factor
extra/io/streams/duplex/duplex-docs.factor
extra/io/streams/duplex/duplex-tests.factor
extra/io/streams/duplex/duplex.factor
extra/io/streams/null/null.factor
extra/io/unix/backend/backend.factor
extra/io/unix/files/files.factor
extra/io/unix/launcher/launcher-tests.factor
extra/io/unix/linux/monitors/monitors.factor
extra/io/unix/macosx/macosx.factor
extra/io/unix/mmap/mmap.factor
extra/io/unix/sockets/secure/secure.factor
extra/io/unix/sockets/sockets.factor
extra/io/unix/unix-tests.factor
extra/irc/irc.factor
extra/logging/server/server.factor
extra/openssl/openssl.factor
extra/random/windows/windows.factor
extra/semantic-db/semantic-db.factor
extra/shuffle/shuffle.factor
extra/smtp/server/server.factor
extra/tools/deploy/backend/backend.factor
extra/ui/gadgets/panes/panes.factor

index 3cd5afef3368f0dd82edcfe12cdc8e7facda4849..8da030c7d18a2fbd828a83ac7b70a304ef9a12df 100755 (executable)
@@ -1,7 +1,7 @@
 IN: alien.c-types
 USING: alien help.syntax help.markup libc kernel.private
 byte-arrays math strings hashtables alien.syntax
-bit-arrays float-arrays debugger ;
+bit-arrays float-arrays debugger destructors ;
 
 HELP: <c-type>
 { $values { "type" hashtable } }
@@ -222,6 +222,9 @@ $nl
 { $subsection realloc }
 "You must always free pointers returned by any of the above words when the block of memory is no longer in use:"
 { $subsection free }
+"Utilities for automatically freeing memory in conjunction with " { $link with-destructors } ":"
+{ $subsection &free }
+{ $subsection |free }
 "You can unsafely copy a range of bytes from one memory location to another:"
 { $subsection memcpy }
 "You can copy a range of bytes from memory into a byte array:"
index 472136da8ecff0e90bdf2a569ac4914dc527a4d1..3cb7d8a71e9ceb755cd8e550a85818a4fa205999 100755 (executable)
@@ -1,6 +1,6 @@
 USING: help.markup help.syntax kernel kernel.private
 continuations.private parser vectors arrays namespaces
-assocs words quotations io ;
+assocs words quotations ;
 IN: continuations
 
 ARTICLE: "errors-restartable" "Restartable errors"
@@ -28,13 +28,7 @@ $nl
 { $heading "Anti-pattern #3: Dropping and rethrowing" }
 "Do not use " { $link recover } " to handle an error by dropping it and throwing a new error. By losing the original error message, you signal to the user that something failed without leaving any indication of what actually went wrong. Either wrap the error in a new error containing additional information, or rethrow the original error. A more subtle form of this is using  " { $link throw } " instead of " { $link rethrow } ". The " { $link throw } " word should only be used when throwing new errors, and never when rethrowing errors that have been caught."
 { $heading "Anti-pattern #4: Logging and rethrowing" }
-"If you are going to rethrow an error, do not log a message. If you do so, the user will see two log messages for the same error, which will clutter logs without adding any useful information."
-{ $heading "Anti-pattern #5: Leaking external resources" }
-"Words which create objects corresponding to external resources should always be used with " { $link with-disposal } ". The following code is wrong:"
-{ $code
-    "<external-resource> ... do stuff ... dispose"
-}
-"The reason being that if " { $snippet "do stuff" } " throws an error, the resource will not be disposed of. The most important case where this can occur is with I/O streams, and the correct solution is to always use " { $link with-input-stream } " and " { $link with-output-stream } "; see " { $link "stdio" } " for details." ;
+"If you are going to rethrow an error, do not log a message. If you do so, the user will see two log messages for the same error, which will clutter logs without adding any useful information." ;
 
 ARTICLE: "errors" "Error handling"
 "Support for handling exceptional situations such as bad user input, implementation bugs, and input/output errors is provided by a set of words built using continuations."
@@ -88,19 +82,6 @@ $nl
 
 ABOUT: "continuations"
 
-HELP: dispose
-{ $values { "object" "a disposable object" } }
-{ $contract "Releases operating system resources associated with a disposable object. Disposable objects include streams, memory mapped files, and so on."
-$nl
-"No further operations can be performed on a disposable object after this call."
-$nl
-"Disposing an object which has already been disposed should have no effect, and in particular it should not fail with an error." }
-{ $notes "You must close disposable objects after you are finished working with them, to avoid leaking operating system resources. A convenient way to automate this is by using the " { $link with-disposal } " word." } ;
-
-HELP: with-disposal
-{ $values { "object" "a disposable object" } { "quot" "a quotation with stack effect " { $snippet "( object -- )" } } }
-{ $description "Calls the quotation, disposing the object with " { $link dispose } " after the quotation returns or if it throws an error." } ;
-
 HELP: catchstack*
 { $values { "catchstack" "a vector of continuations" } }
 { $description "Outputs the current catchstack." } ;
index 8b6cd1ce3a20d350088abb61900b4bfdeaa62e00..76f2cdef7a3e92a3ce1a27f0efdad005ff96beeb 100755 (executable)
@@ -150,16 +150,6 @@ ERROR: attempt-all-error ;
         ] { } make peek swap [ rethrow ] when
     ] if ; inline
 
-GENERIC: dispose ( object -- )
-
-: dispose-each ( seq -- )
-    [
-        [ [ dispose ] curry [ , ] recover ] each
-    ] { } make dup empty? [ drop ] [ peek rethrow ] if ;
-
-: with-disposal ( object quot -- )
-    over [ dispose ] curry [ ] cleanup ; inline
-
 TUPLE: condition error restarts continuation ;
 
 C: <condition> condition ( error restarts cc -- condition )
diff --git a/core/destructors/authors.txt b/core/destructors/authors.txt
new file mode 100644 (file)
index 0000000..7c1b2f2
--- /dev/null
@@ -0,0 +1 @@
+Doug Coleman
diff --git a/core/destructors/destructors-docs.factor b/core/destructors/destructors-docs.factor
new file mode 100755 (executable)
index 0000000..b611b8e
--- /dev/null
@@ -0,0 +1,71 @@
+USING: help.markup help.syntax libc kernel continuations io ;
+IN: destructors
+
+HELP: dispose
+{ $values { "disposable" "a disposable object" } }
+{ $contract "Releases operating system resources associated with a disposable object. Disposable objects include streams, memory mapped files, and so on."
+$nl
+"No further operations can be performed on a disposable object after this call."
+$nl
+"Disposing an object which has already been disposed should have no effect, and in particular it should not fail with an error. To help implement this pattern, add a " { $snippet "disposed" } " slot to your object and implement the " { $link dispose* } " method instead." }
+{ $notes "You must close disposable objects after you are finished working with them, to avoid leaking operating system resources. A convenient way to automate this is by using the " { $link with-disposal } " word."
+$nl
+"The default implementation assumes the object has a " { $snippet "disposable" } " slot. If the slot is set to " { $link f } ", it calls " { $link dispose* } " and sets the slot to " { $link f } "." } ;
+
+HELP: dispose*
+{ $values { "disposable" "a disposable object" } }
+{ $contract "Releases operating system resources associated with a disposable object. Disposable objects include streams, memory mapped files, and so on." }
+{ $notes
+    "This word should not be called directly. It can be implemented on objects with a " { $snippet "disposable" } " slot to ensure that the object is only disposed once."
+} ;
+
+HELP: with-disposal
+{ $values { "object" "a disposable object" } { "quot" "a quotation with stack effect " { $snippet "( object -- )" } } }
+{ $description "Calls the quotation, disposing the object with " { $link dispose } " after the quotation returns or if it throws an error." } ;
+
+HELP: with-destructors
+{ $values { "quot" "a quotation" } }
+{ $description "Calls a quotation within a new dynamic scope. This quotation may register destructors, on any object, by wrapping the object in a destructor and implementing " { $link dispose } " on that object type.  After the quotation finishes, if an error was thrown, all destructors are called and the error is then rethrown.  However, if the quotation was successful, only those destructors created with an 'always cleanup' flag will be destroyed." }
+{ $notes
+    "Destructors generalize " { $link with-disposal } ". The following two lines are equivalent, except that the second line establishes a new dynamic scope:"
+    { $code
+        "[ X ] with-disposal"
+        "[ &dispose X ] with-destructors"
+    }
+}
+{ $examples
+    { $code "[ 10 malloc &free ] with-destructors" }
+} ;
+
+HELP: &dispose
+{ $values { "disposable" "a disposable object" } }
+{ $description "Marks the object for unconditional disposal at the end of the current " { $link with-destructors } " scope." } ;
+
+HELP: |dispose
+{ $values { "disposable" "a disposable object" } }
+{ $description "Marks the object for disposal in the event of an error at the end of the current " { $link with-destructors } " scope." } ;
+
+ARTICLE: "destructors-anti-patterns" "Resource disposal anti-patterns"
+"Words which create objects corresponding to external resources should always be used with " { $link with-disposal } ". The following code is wrong:"
+{ $code
+    "<external-resource> ... do stuff ... dispose"
+}
+"The reason being that if " { $snippet "do stuff" } " throws an error, the resource will not be disposed of. The most important case where this can occur is with I/O streams, and the correct solution is to always use " { $link with-input-stream } " and " { $link with-output-stream } "; see " { $link "stdio" } " for details." ;
+
+ARTICLE: "destructors" "Deterministic resource disposal"
+"Operating system resources such as streams, memory mapped files, and so on are not managed by Factor's garbage collector and must be released when you are done with them. Failing to release a resource can lead to reduced performance and instability."
+$nl
+"Disposable object protocol:"
+{ $subsection dispose }
+{ $subsection dispose* }
+"Utility word for scoped disposal:"
+{ $subsection with-disposal }
+"Utility word for disposing multiple objects:"
+{ $subsection dispose-each }
+"Utility words for more complex disposal patterns:"
+{ $subsection with-destructors }
+{ $subsection &dispose }
+{ $subsection |dispose }
+{ $subsection "destructors-anti-patterns" } ;
+
+ABOUT: "destructors"
diff --git a/core/destructors/destructors-tests.factor b/core/destructors/destructors-tests.factor
new file mode 100755 (executable)
index 0000000..18f50bf
--- /dev/null
@@ -0,0 +1,50 @@
+USING: destructors kernel tools.test continuations ;
+IN: destructors.tests
+
+TUPLE: dummy-obj destroyed? ;
+
+: <dummy-obj> dummy-obj new ;
+
+TUPLE: dummy-destructor obj ;
+
+C: <dummy-destructor> dummy-destructor
+
+M: dummy-destructor dispose ( obj -- )
+    dummy-destructor-obj t swap set-dummy-obj-destroyed? ;
+
+: destroy-always
+    <dummy-destructor> &dispose drop ;
+
+: destroy-later
+    <dummy-destructor> |dispose drop ;
+
+[ t ] [
+    [
+        <dummy-obj> dup destroy-always
+    ] with-destructors dummy-obj-destroyed? 
+] unit-test
+
+[ f ] [
+    [
+        <dummy-obj> dup destroy-later
+    ] with-destructors dummy-obj-destroyed? 
+] unit-test
+
+[ t ] [
+    <dummy-obj> [
+        [
+            dup destroy-always
+            "foo" throw
+        ] with-destructors
+    ] ignore-errors dummy-obj-destroyed? 
+] unit-test
+
+[ t ] [
+    <dummy-obj> [
+        [
+            dup destroy-later
+            "foo" throw
+        ] with-destructors
+    ] ignore-errors dummy-obj-destroyed? 
+] unit-test
+
diff --git a/core/destructors/destructors.factor b/core/destructors/destructors.factor
new file mode 100755 (executable)
index 0000000..bed1c16
--- /dev/null
@@ -0,0 +1,56 @@
+! Copyright (C) 2007, 2008 Doug Coleman, Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors continuations kernel namespaces
+sequences vectors ;
+IN: destructors
+
+TUPLE: disposable disposed ;
+
+GENERIC: dispose* ( disposable -- )
+
+ERROR: already-disposed disposable ;
+
+: check-disposed ( disposable -- )
+    dup disposed>> [ already-disposed ] [ drop ] if ; inline
+
+GENERIC: dispose ( disposable -- )
+
+M: object dispose
+    dup disposed>> [ drop ] [ t >>disposed dispose* ] if ;
+
+: dispose-each ( seq -- )
+    [
+        [ [ dispose ] curry [ , ] recover ] each
+    ] { } make dup empty? [ drop ] [ peek rethrow ] if ;
+
+: with-disposal ( object quot -- )
+    over [ dispose ] curry [ ] cleanup ; inline
+
+<PRIVATE
+
+SYMBOL: always-destructors
+
+SYMBOL: error-destructors
+
+: do-always-destructors ( -- )
+    always-destructors get <reversed> dispose-each ;
+
+: do-error-destructors ( -- )
+    error-destructors get <reversed> dispose-each ;
+
+PRIVATE>
+
+: &dispose ( disposable -- disposable )
+    dup always-destructors get push ; inline
+
+: |dispose ( disposable -- disposable )
+    dup error-destructors get push ; inline
+
+: with-destructors ( quot -- )
+    [
+        V{ } clone always-destructors set
+        V{ } clone error-destructors set
+        [ do-always-destructors ]
+        [ do-error-destructors ]
+        cleanup
+    ] with-scope ; inline
diff --git a/core/destructors/summary.txt b/core/destructors/summary.txt
new file mode 100644 (file)
index 0000000..3ed5042
--- /dev/null
@@ -0,0 +1 @@
+Object destructors
index daaf1c129def1ba19762a7a9f9787f46956ed672..3fe6f9d6aab1bebfaddaa4c0c24f33b0df72807b 100755 (executable)
@@ -1,9 +1,9 @@
 ! Copyright (C) 2008 Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: math kernel sequences sbufs vectors namespaces growable
-strings io classes continuations combinators io.styles
-io.streams.plain splitting byte-arrays sequences.private
-accessors ;
+strings io classes continuations destructors combinators
+io.styles io.streams.plain splitting byte-arrays
+sequences.private accessors ;
 IN: io.encodings
 
 ! The encoding descriptor protocol
index ec74bb001eba84bc93be84815e168a64b39205b6..e5034d61035961250a9af5a4a868e4711f58350a 100755 (executable)
@@ -300,8 +300,8 @@ HELP: exists?
 { $description "Tests if the file named by " { $snippet "path" } " exists." } ;
 
 HELP: directory?
-{ $values { "path" "a pathname string" } { "?" "a boolean" } }
-{ $description "Tests if " { $snippet "path" } " names a directory." } ;
+{ $values { "file-info" file-info } { "?" "a boolean" } }
+{ $description "Tests if " { $snippet "file-info" } " is a directory." } ;
 
 HELP: (directory)
 { $values { "path" "a pathname string" } { "seq" "a sequence of " { $snippet "{ name dir? }" } " pairs" } }
index 20eb662fc745f3ba999cb63baf4b8a9f2960936d..14bc5fe2a21751680648b7d53d818769b625e6de 100755 (executable)
@@ -1,14 +1,14 @@
 IN: io.files.tests
 USING: tools.test io.files io.files.private io threads kernel
 continuations io.encodings.ascii io.files.unique sequences
-strings accessors io.encodings.utf8 math ;
+strings accessors io.encodings.utf8 math destructors ;
 
 \ exists? must-infer
 \ (exists?) must-infer
 
 [ ] [ "blahblah" temp-file dup exists? [ delete-directory ] [ drop ] if ] unit-test
 [ ] [ "blahblah" temp-file make-directory ] unit-test
-[ t ] [ "blahblah" temp-file directory? ] unit-test
+[ t ] [ "blahblah" temp-file file-info directory? ] unit-test
 
 [ t ] [
     [ temp-directory "loldir" append-path delete-directory ] ignore-errors
index 2b4bb170ea7b64e110eac7b80f508ebf15d3dd99..87e927304b35ed70b61d8a3c23ec73cec0bab11a 100755 (executable)
@@ -2,8 +2,8 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: io.backend io.files.private io hashtables kernel math
 memory namespaces sequences strings assocs arrays definitions
-system combinators splitting sbufs continuations io.encodings
-io.encodings.binary init accessors math.order ;
+system combinators splitting sbufs continuations destructors
+io.encodings io.encodings.binary init accessors math.order ;
 IN: io.files
 
 HOOK: (file-reader) io-backend ( path -- stream )
@@ -172,11 +172,9 @@ SYMBOL: +socket+
 SYMBOL: +unknown+
 
 ! File metadata
-: exists? ( path -- ? )
-    normalize-path (exists?) ;
+: exists? ( path -- ? ) normalize-path (exists?) ;
 
-: directory? ( path -- ? )
-    file-info file-info-type +directory+ = ;
+: directory? ( file-info -- ? ) type>> +directory+ = ;
 
 <PRIVATE
 
@@ -232,7 +230,7 @@ HOOK: make-directory io-backend ( path -- )
 : fixup-directory ( path seq -- newseq )
     [
         dup string?
-        [ tuck append-path directory? 2array ] [ nip ] if
+        [ tuck append-path file-info directory? 2array ] [ nip ] if
     ] with map
     [ first { "." ".." } member? not ] filter ;
 
index 2d74dfabd5d12c078b74198ca9b7df115f41a016..782d4044aec6afe52e8334c03e08184472b21c77 100755 (executable)
@@ -1,5 +1,5 @@
 USING: help.markup help.syntax quotations hashtables kernel
-classes strings continuations ;
+classes strings continuations destructors ;
 IN: io
 
 ARTICLE: "stream-protocol" "Stream protocol"
index 522e767f989527892b014b5007e502085ce729b9..e8521f923c050fc2b2cffb4bc653d0b700ba4224 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2003, 2007 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: hashtables generic kernel math namespaces sequences
-continuations assocs io.styles ;
+continuations destructors assocs io.styles ;
 IN: io
 
 GENERIC: stream-readln ( stream -- str/f )
index 91732f3211b9f1739a26ce30c632b3509c742570..f80d9de5b54b28dd8dae390d1320fc51758af0fc 100755 (executable)
@@ -2,37 +2,37 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel kernel.private namespaces io io.encodings
 sequences math generic threads.private classes io.backend
-io.files continuations byte-arrays ;
+io.files continuations destructors byte-arrays accessors ;
 IN: io.streams.c
 
-TUPLE: c-writer handle ;
+TUPLE: c-writer handle disposed ;
 
-C: <c-writer> c-writer
+: <c-writer> ( handle -- stream ) f c-writer boa ;
 
 M: c-writer stream-write1
-    c-writer-handle fputc ;
+    handle>> fputc ;
 
 M: c-writer stream-write
-    c-writer-handle fwrite ;
+    handle>> fwrite ;
 
 M: c-writer stream-flush
-    c-writer-handle fflush ;
+    handle>> fflush ;
 
-M: c-writer dispose
-    c-writer-handle fclose ;
+M: c-writer dispose*
+    handle>> fclose ;
 
-TUPLE: c-reader handle ;
+TUPLE: c-reader handle disposed ;
 
-C: <c-reader> c-reader
+: <c-reader> ( handle -- stream ) f c-reader boa ;
 
 M: c-reader stream-read
-    c-reader-handle fread ;
+    handle>> fread ;
 
 M: c-reader stream-read-partial
     stream-read ;
 
 M: c-reader stream-read1
-    c-reader-handle fgetc ;
+    handle>> fgetc ;
 
 : read-until-loop ( stream delim -- ch )
     over stream-read1 dup [
@@ -45,8 +45,8 @@ M: c-reader stream-read-until
     [ swap read-until-loop ] B{ } make swap
     over empty? over not and [ 2drop f f ] when ;
 
-M: c-reader dispose
-    c-reader-handle fclose ;
+M: c-reader dispose*
+    handle>> fclose ;
 
 M: object init-io ;
 
index fd67910b6fb6fcfe4f35456885ade7edf7aafe33..bb6a7a9111ac0258a2e5d2843f68917a4f2ff389 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2006, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays generic assocs kernel namespaces strings
-quotations io continuations accessors sequences ;
+quotations io continuations destructors accessors sequences ;
 IN: io.streams.nested
 
 TUPLE: filter-writer stream ;
index c0b37dbce7811c06d93f7204180cccc93773ae2e..355e913b14c912bf6a4f8edbfc02de5eca6057ae 100755 (executable)
@@ -1,8 +1,8 @@
 ! Copyright (C) 2003, 2007 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: io kernel math namespaces sequences sbufs strings
-generic splitting growable continuations io.streams.plain
-io.encodings math.order ;
+generic splitting growable continuations destructors
+io.streams.plain io.encodings math.order ;
 IN: io.streams.string
 
 M: growable dispose drop ;
index 45d6b9432607afc02bf577984f5ae1bcc4aa2f2f..5e285bf26db8bc91030ae2a46114e6564803d1ad 100644 (file)
@@ -1,4 +1,4 @@
-USING: help.markup help.syntax alien ;
+USING: help.markup help.syntax alien destructors ;
 IN: libc
 
 HELP: malloc
@@ -36,5 +36,13 @@ HELP: with-malloc
 { $values { "size" "a positive integer" } { "quot" "a quotation with stack effect " { $snippet "( c-ptr -- )" } } }
 { $description "Allocates a zeroed block of " { $snippet "n" } " bytes and passes it to the quotation. When the quotation returns, the block is freed." } ;
 
+HELP: &free
+{ $values { "alien" c-ptr } }
+{ $description "Marks the block of memory for unconditional deallocation at the end of the current " { $link with-destructors } " scope." } ;
+
+HELP: |free
+{ $values { "alien" c-ptr } }
+{ $description "Marks the object for deallocation in the event of an error at the end of the current " { $link with-destructors } " scope." } ;
+
 ! Defined in alien-docs.factor
 ABOUT: "malloc"
index 70850a2894720c4835b1b1247415b88220edbd2b..cba0b9253f61df8baa39fdce0769f4d283a53c76 100755 (executable)
@@ -1,8 +1,9 @@
 ! Copyright (C) 2004, 2005 Mackenzie Straight
-! Copyright (C) 2007 Slava Pestov
-! Copyright (C) 2007 Doug Coleman
+! Copyright (C) 2007, 2008 Slava Pestov
+! Copyright (C) 2007, 2008 Doug Coleman
 ! See http://factorcode.org/license.txt for BSD license.
-USING: alien assocs continuations init kernel namespaces ;
+USING: alien assocs continuations destructors init kernel
+namespaces accessors ;
 IN: libc
 
 <PRIVATE
@@ -76,3 +77,18 @@ PRIVATE>
 
 : strlen ( alien -- len )
     "size_t" "libc" "strlen" { "char*" } alien-invoke ;
+
+<PRIVATE
+
+! Memory allocations
+TUPLE: memory-destructor alien ;
+
+M: memory-destructor dispose* alien>> free ;
+
+PRIVATE>
+
+: &free ( alien -- alien )
+    dup memory-destructor boa &dispose drop ; inline
+
+: |free ( alien -- alien )
+    dup memory-destructor boa |dispose drop ; inline
index 6defd94290c8fb1496da9417fb3932b676c4e311..673a67d93f68b8e6ec5e62c036ecbfb0d3abe865 100755 (executable)
@@ -1,6 +1,7 @@
 USING: io.sockets io kernel math threads io.encodings.ascii
 io.streams.duplex debugger tools.time prettyprint
-concurrency.count-downs namespaces arrays continuations ;
+concurrency.count-downs namespaces arrays continuations
+destructors ;
 IN: benchmark.sockets
 
 SYMBOL: counter
index 6ebd598dc6a722b2d354a16467e36604e539e83a..b315e4ca5a26b99567c535092a9fa132a6fe4826 100755 (executable)
@@ -4,7 +4,7 @@ opengl.glu shuffle http.client vectors namespaces ui.gadgets
 ui.gadgets.canvas ui.render ui splitting combinators tools.time
 system combinators.lib float-arrays continuations
 opengl.demo-support multiline ui.gestures bunny.fixed-pipeline
-bunny.cel-shaded bunny.outlined bunny.model accessors ;
+bunny.cel-shaded bunny.outlined bunny.model accessors destructors ;
 IN: bunny
 
 TUPLE: bunny-gadget model geom draw-seq draw-n ;
index 08bea0515b2797a2764e590fe6ca60fe9e81fa3f..8285cd776f40404b7bbf6d2c74123d2a4c1b60c3 100644 (file)
@@ -1,5 +1,6 @@
-USING: arrays bunny.model continuations kernel multiline opengl opengl.shaders
-    opengl.capabilities opengl.gl sequences sequences.lib accessors ;
+USING: arrays bunny.model continuations destructors kernel
+multiline opengl opengl.shaders opengl.capabilities opengl.gl
+sequences sequences.lib accessors ;
 IN: bunny.cel-shaded
 
 STRING: vertex-shader-source
index bf0fc45f0fc652fe236aa4d4e934225ae6aa6097..0bad9cc9437131de54a3a3eff66e7fe92b80ab7b 100644 (file)
@@ -1,4 +1,4 @@
-USING: alien.c-types continuations kernel
+USING: alien.c-types continuations destructors kernel
 opengl opengl.gl bunny.model ;
 IN: bunny.fixed-pipeline
 
index 95b5fe401d4265c5164489c93e87e3e77c09e015..2dac9eb68817bbde5591b712c44d216e6f53915c 100755 (executable)
@@ -2,7 +2,8 @@ USING: alien alien.c-types arrays sequences math math.vectors
 math.matrices math.parser io io.files kernel opengl opengl.gl
 opengl.glu io.encodings.ascii opengl.capabilities shuffle
 http.client vectors splitting tools.time system combinators
-float-arrays continuations namespaces sequences.lib accessors ;
+float-arrays continuations destructors namespaces sequences.lib
+accessors ;
 IN: bunny.model
 
 : numbers ( str -- seq )
index fef57d95d2d12b02ade36316a862afb7b32e96ce..f3ee4594c7b847b620c5ebde4a9b631cab65a35e 100755 (executable)
@@ -1,7 +1,7 @@
-USING: arrays bunny.model bunny.cel-shaded continuations kernel
-math multiline opengl opengl.shaders opengl.framebuffers
-opengl.gl opengl.capabilities sequences ui.gadgets combinators
-accessors ;
+USING: arrays bunny.model bunny.cel-shaded continuations
+destructors kernel math multiline opengl opengl.shaders
+opengl.framebuffers opengl.gl opengl.capabilities sequences
+ui.gadgets combinators accessors ;
 IN: bunny.outlined
 
 STRING: outlined-pass1-fragment-shader-main-source
index 077152a3c20333ef34ccc678dbca59a609a1c8d8..46d3e42c2b7487d9bc7de0cc0b87029cbb4fd0ff 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2008 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: cairo.ffi kernel accessors sequences
-namespaces fry continuations ;
+namespaces fry continuations destructors ;
 IN: cairo
 
 TUPLE: cairo-t alien ;
index fe96a5227793576423aba91707b91280f1186f34..d42febb541e15128edb62422b007ea7236ebf9f9 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2008 Slava Pestov
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors byte-arrays alien.c-types kernel continuations
-sequences io openssl openssl.libcrypto checksums ;
+destructors sequences io openssl openssl.libcrypto checksums ;
 IN: checksums.openssl
 
 ERROR: unknown-digest name ;
index ed481f72e678bf20075e54abd20ed64eb2b8b1dd..54847dc8b3d512395c988426ffd1c4309fd73756 100755 (executable)
@@ -19,6 +19,13 @@ IN: combinators.lib.tests
 [ { 1 2 } { 2 4 } { 3 8 } { 4 16 } { 5 32 } ] [ 1 2 3 4 5 [ dup 2^ 2array ] 5 napply ] unit-test
 [ [ dup 2^ 2array ] 5 napply ] must-infer
 
+[ { "xyc" "xyd" } ] [ "x" "y" { "c" "d" } [ 3append ] 2 nwith map ] unit-test
+
+[ { "foo" "xbarx" } ]
+[
+    { "oof" "bar" } { [ reverse ] [ "x" swap "x" 3append ] } parallel-call
+] unit-test
+
 ! &&
 
 [ t ] [
index 5dfe8527c1a80d75b24f6d95535bafacee4338b4..d4a938664927628e5adab5668287aa5ccf920c4d 100755 (executable)
@@ -4,7 +4,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel combinators fry namespaces quotations hashtables
 sequences assocs arrays inference effects math math.ranges
-arrays.lib shuffle macros bake continuations ;
+arrays.lib shuffle macros continuations locals ;
 
 IN: combinators.lib
 
@@ -20,17 +20,15 @@ MACRO: nslip ( n -- ) dup saver [ call ] rot restorer 3append ;
 
 MACRO: nkeep ( n -- )
   [ ] [ 1+ ] [ ] tri
-  [ [ , ndup ] dip , -nrot , nslip ]
-  bake ;
+  '[ [ , ndup ] dip , -nrot , nslip ] ;
 
 : 4keep ( w x y z quot -- w x y z ) 4 nkeep ; inline 
 
 MACRO: ncurry ( n -- ) [ curry ] n*quot ;
 
-MACRO: nwith ( quot n -- )
-  tuck 1+ dup
-  [ , -nrot [ , nrot , call ] , ncurry ]
-  bake ;
+MACRO:: nwith ( quot n -- )
+  [let | n' [ n 1+ ] |
+    [ n' -nrot [ n' nrot quot call ] n ncurry ] ] ;
 
 MACRO: napply ( n -- )
   2 [a,b]
@@ -110,8 +108,8 @@ MACRO: switch ( quot -- )
 ! : pcall ( seq quots -- seq ) [ call ] 2map ;
 
 MACRO: parallel-call ( quots -- )
-    [ [ unclip % r> dup >r push ] bake ] map concat
-    [ V{ } clone >r % drop r> >array ] bake ;
+    [ '[ [ unclip @ ] dip [ push ] keep ] ] map concat
+    '[ V{ } clone @ nip >array ] ;
 
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 ! map-call and friends
index aa4dc2df3d1878e29f633c506e646c5e8f2431e9..25541ce7173adaca3056a50886d84bb4efffb3ae 100755 (executable)
@@ -1,17 +1,13 @@
 ! Copyright (C) 2005, 2008 Chris Double, Slava Pestov.\r
 ! See http://factorcode.org/license.txt for BSD license.\r
 IN: concurrency.mailboxes\r
-USING: dlists threads sequences continuations\r
+USING: dlists threads sequences continuations destructors\r
 namespaces random math quotations words kernel arrays assocs\r
 init system concurrency.conditions accessors debugger ;\r
 \r
-TUPLE: mailbox threads data closed ;\r
+TUPLE: mailbox threads data disposed ;\r
 \r
-: check-closed ( mailbox -- )\r
-    closed>> [ "Mailbox closed" throw ] when ; inline\r
-\r
-M: mailbox dispose\r
-    t >>closed threads>> notify-all ;\r
+M: mailbox dispose* threads>> notify-all ;\r
 \r
 : <mailbox> ( -- mailbox )\r
     <dlist> <dlist> f mailbox boa ;\r
@@ -27,7 +23,7 @@ M: mailbox dispose
     >r threads>> r> "mailbox" wait ;\r
 \r
 : block-unless-pred ( mailbox timeout pred -- )\r
-    pick check-closed\r
+    pick check-disposed\r
     pick data>> over dlist-contains? [\r
         3drop\r
     ] [\r
@@ -35,7 +31,7 @@ M: mailbox dispose
     ] if ; inline\r
 \r
 : block-if-empty ( mailbox timeout -- mailbox )\r
-    over check-closed\r
+    over check-disposed\r
     over mailbox-empty? [\r
         2dup wait-for-mailbox block-if-empty\r
     ] [\r
index 4698aa45ae007e274b745e739c030d7917cb43aa..261e1d045a801824c6d033689753b297979d4101 100644 (file)
@@ -3,7 +3,7 @@
 USING: alien alien.c-types alien.strings alien.syntax kernel
 math sequences namespaces assocs init accessors continuations
 combinators core-foundation core-foundation.run-loop
-io.encodings.utf8 ;
+io.encodings.utf8 destructors ;
 IN: core-foundation.fsevents
 
 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
@@ -187,7 +187,7 @@ SYMBOL: event-stream-callbacks
         dup [ call drop ] [ 3drop ] if
     ] alien-callback ;
 
-TUPLE: event-stream info handle closed ;
+TUPLE: event-stream info handle disposed ;
 
 : <event-stream> ( quot paths latency flags -- event-stream )
     >r >r >r
@@ -197,13 +197,10 @@ TUPLE: event-stream info handle closed ;
     dup enable-event-stream
     f event-stream boa ;
 
-M: event-stream dispose
-    dup closed>> [ drop ] [
-        t >>closed
-        {
-            [ info>> remove-event-source-callback ]
-            [ handle>> disable-event-stream ]
-            [ handle>> FSEventStreamInvalidate ]
-            [ handle>> FSEventStreamRelease ]
-        } cleave
-    ] if ;
+M: event-stream dispose*
+    {
+        [ info>> remove-event-source-callback ]
+        [ handle>> disable-event-stream ]
+        [ handle>> FSEventStreamInvalidate ]
+        [ handle>> FSEventStreamRelease ]
+    } cleave ;
index 237d8698a65ebe9d687f12635ac6ccf830ba3eae..9514f62cf0eed2e32a13358bdefb61fbd57c58cb 100755 (executable)
@@ -1,6 +1,6 @@
 ! Copyright (C) 2008 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: arrays assocs classes continuations kernel math
+USING: arrays assocs classes continuations destructors kernel math
 namespaces sequences sequences.lib classes.tuple words strings
 tools.walker accessors combinators.lib ;
 IN: db
@@ -25,7 +25,7 @@ GENERIC: make-db* ( seq class -- db )
 GENERIC: db-open ( db -- db )
 HOOK: db-close db ( handle -- )
 
-: dispose-statements ( seq -- ) [ dispose drop ] assoc-each ;
+: dispose-statements ( assoc -- ) values dispose-each ;
 
 : dispose-db ( db -- ) 
     dup db [
index f8700debaa7e24e6219e9e18ab55fab0f19a721b..1767bf3d50b01bfd7d8f1b81b5ad5d6af69f2f86 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2008 Doug Coleman.
 ! See http://factorcode.org/license.txt for license.
-USING: alien continuations io kernel prettyprint sequences
-db db.mysql.ffi ;
+USING: alien continuations destructors io kernel prettyprint
+sequences db db.mysql.ffi ;
 IN: db.mysql
 
 TUPLE: mysql-db handle host user password db port ;
index 9f747082c65b3ba2f931acb8e8fe1f3717dc23eb..3e81b264d69e93f83c3361f14208db91f5853d58 100755 (executable)
@@ -5,7 +5,7 @@ kernel math math.parser namespaces prettyprint quotations
 sequences debugger db db.postgresql.lib db.postgresql.ffi
 db.tuples db.types tools.annotations math.ranges
 combinators sequences.lib classes locals words tools.walker
-namespaces.lib accessors random db.queries ;
+namespaces.lib accessors random db.queries destructors ;
 USE: tools.walker
 IN: db.postgresql
 
index 4aaa9668f0f1b4e5367b9b71fbb9e617625c8d7d..c10775f1c94bdce036485add02697542d76a1620 100755 (executable)
@@ -6,7 +6,7 @@ prettyprint sequences strings classes.tuple alien.c-types
 continuations db.sqlite.lib db.sqlite.ffi db.tuples
 words combinators.lib db.types combinators math.intervals
 io namespaces.lib accessors vectors math.ranges random
-math.bitfields.lib db.queries ;
+math.bitfields.lib db.queries destructors ;
 USE: tools.walker
 IN: db.sqlite
 
index 5747fa7de798fbefad1c34d1aab919f0efc0b05e..c940d121bb7503ac9d0e5071b9c1e6ec355fcb01 100755 (executable)
@@ -3,7 +3,7 @@
 USING: arrays assocs classes db kernel namespaces
 classes.tuple words sequences slots math accessors
 math.parser io prettyprint db.types continuations
-mirrors sequences.lib combinators.lib ;
+destructors mirrors sequences.lib combinators.lib ;
 IN: db.tuples
 
 : define-persistent ( class table columns -- )
diff --git a/extra/destructors/authors.txt b/extra/destructors/authors.txt
deleted file mode 100644 (file)
index 7c1b2f2..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Doug Coleman
diff --git a/extra/destructors/destructors-docs.factor b/extra/destructors/destructors-docs.factor
deleted file mode 100755 (executable)
index 28f8858..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-USING: help.markup help.syntax libc kernel continuations ;
-IN: destructors
-
-HELP: with-destructors
-{ $values { "quot" "a quotation" } }
-{ $description "Calls a quotation within a new dynamic scope. This quotation may register destructors, on any object, by wrapping the object in a destructor and implementing " { $link dispose } " on that object type.  After the quotation finishes, if an error was thrown, all destructors are called and the error is then rethrown.  However, if the quotation was successful, only those destructors created with an 'always cleanup' flag will be destroyed." }
-{ $notes
-    "Destructors generalize " { $link with-disposal } ". The following two lines are equivalent:"
-    { $code
-        "[ X ] with-disposal"
-        "[ &dispose X ] with-destructors"
-    }
-}
-{ $examples
-    { $code "[ 10 malloc &free ] with-destructors" }
-} ;
diff --git a/extra/destructors/destructors-tests.factor b/extra/destructors/destructors-tests.factor
deleted file mode 100755 (executable)
index 18f50bf..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-USING: destructors kernel tools.test continuations ;
-IN: destructors.tests
-
-TUPLE: dummy-obj destroyed? ;
-
-: <dummy-obj> dummy-obj new ;
-
-TUPLE: dummy-destructor obj ;
-
-C: <dummy-destructor> dummy-destructor
-
-M: dummy-destructor dispose ( obj -- )
-    dummy-destructor-obj t swap set-dummy-obj-destroyed? ;
-
-: destroy-always
-    <dummy-destructor> &dispose drop ;
-
-: destroy-later
-    <dummy-destructor> |dispose drop ;
-
-[ t ] [
-    [
-        <dummy-obj> dup destroy-always
-    ] with-destructors dummy-obj-destroyed? 
-] unit-test
-
-[ f ] [
-    [
-        <dummy-obj> dup destroy-later
-    ] with-destructors dummy-obj-destroyed? 
-] unit-test
-
-[ t ] [
-    <dummy-obj> [
-        [
-            dup destroy-always
-            "foo" throw
-        ] with-destructors
-    ] ignore-errors dummy-obj-destroyed? 
-] unit-test
-
-[ t ] [
-    <dummy-obj> [
-        [
-            dup destroy-later
-            "foo" throw
-        ] with-destructors
-    ] ignore-errors dummy-obj-destroyed? 
-] unit-test
-
diff --git a/extra/destructors/destructors.factor b/extra/destructors/destructors.factor
deleted file mode 100755 (executable)
index 86f8fa1..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-! Copyright (C) 2007 Doug Coleman.
-! See http://factorcode.org/license.txt for BSD license.
-USING: accessors continuations io.backend libc
-kernel namespaces sequences system vectors ;
-IN: destructors
-
-<PRIVATE
-
-SYMBOL: always-destructors
-
-SYMBOL: error-destructors
-
-: do-always-destructors ( -- )
-    always-destructors get <reversed> dispose-each ;
-
-: do-error-destructors ( -- )
-    error-destructors get <reversed> dispose-each ;
-
-PRIVATE>
-
-: &dispose dup always-destructors get push ; inline
-
-: |dispose dup error-destructors get push ; inline
-
-: with-destructors ( quot -- )
-    [
-        V{ } clone always-destructors set
-        V{ } clone error-destructors set
-        [ do-always-destructors ]
-        [ do-error-destructors ] cleanup
-    ] with-scope ; inline
-
-TUPLE: only-once object destroyed ;
-
-M: only-once dispose
-    dup destroyed>> [ drop ] [
-        [ object>> dispose ] [ t >>destroyed drop ] bi
-    ] if ;
-
-: <only-once> f only-once boa ;
-
-! Memory allocations
-TUPLE: memory-destructor alien ;
-
-C: <memory-destructor> memory-destructor
-
-M: memory-destructor dispose ( obj -- )
-    alien>> free ;
-
-: &free ( alien -- alien )
-    <memory-destructor> <only-once> &dispose ; inline
-
-: |free ( alien -- alien )
-    <memory-destructor> <only-once> |dispose ; inline
diff --git a/extra/destructors/summary.txt b/extra/destructors/summary.txt
deleted file mode 100644 (file)
index 3ed5042..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Object destructors
index dd4106239dd367f01e4d38cad7580863b6ac2d80..863a538b474ac499a81d3f190b3fe5530ce7cb34 100755 (executable)
@@ -105,6 +105,7 @@ ARTICLE: "objects" "Objects"
 "An " { $emphasis "object" } " is any datum which may be identified. All values are objects in Factor. Each object carries type information, and types are checked at runtime; Factor is dynamically typed."
 { $subsection "equality" }
 { $subsection "math.order" }
+{ $subsection "destructors" }
 { $subsection "classes" }
 { $subsection "tuples" }
 { $subsection "generic" }
@@ -207,7 +208,8 @@ ARTICLE: "io" "Input and output"
 { $subsection "io.pipes" }
 { $heading "Other features" }
 { $subsection "io.timeouts" }
-{ $subsection "checksums" } ;
+{ $subsection "checksums" }
+{ $see-also "destructors" } ;
 
 ARTICLE: "tools" "Developer tools"
 { $subsection "tools.vocabs" }
index c154c35223d9b5ffa3329d955de20b12f9665e46..71862b0d01bc68a945a24a2bf8c075153d6c316e 100755 (executable)
@@ -3,7 +3,7 @@
 USING: generic assocs help http io io.styles io.files continuations
 io.streams.string kernel math math.order math.parser namespaces
 quotations assocs sequences strings words html.elements
-xml.entities sbufs continuations ;
+xml.entities sbufs continuations destructors ;
 IN: html
 
 GENERIC: browser-link-href ( presented -- href )
index b9a8e9d46ee2f493e579ccdc4fa48ae423543789..2f7a6eb221e5e319a60ee8065300a8c6365e234b 100755 (executable)
@@ -91,7 +91,7 @@ TUPLE: file-responder root hook special allow-listings ;
 \r
 : serve-object ( filename -- response )\r
     serving-path dup exists?\r
-    [ dup directory? [ serve-directory ] [ serve-file ] if ]\r
+    [ dup file-info directory? [ serve-directory ] [ serve-file ] if ]\r
     [ drop <404> ]\r
     if ;\r
 \r
index 90eea091d53b5d5b78133cd289a387caf36b0638..54715e23da0e7f40198bd96da9f1998b8b4eeaf2 100755 (executable)
@@ -151,7 +151,7 @@ M: process timed-out kill-process ;
 
 M: object run-pipeline-element
     [ >process swap >>stdout swap >>stdin run-detached ]
-    [ drop [ [ close-handle ] when* ] bi@ ]
+    [ drop [ [ dispose ] when* ] bi@ ]
     3bi
     wait-for-process ;
 
@@ -164,7 +164,7 @@ M: object run-pipeline-element
                     [ swap out>> or ] change-stdout
                 run-detached
             ]
-            [ out>> close-handle ]
+            [ out>> dispose ]
             [ in>> <input-port> ]
         } cleave r> <decoder>
     ] with-destructors ;
@@ -181,7 +181,7 @@ M: object run-pipeline-element
                     [ swap in>> or ] change-stdout
                 run-detached
             ]
-            [ in>> close-handle ]
+            [ in>> dispose ]
             [ out>> <output-port> ]
         } cleave r> <encoder>
     ] with-destructors ;
@@ -199,7 +199,7 @@ M: object run-pipeline-element
                     [ swap in>> or ] change-stdin
                 run-detached
             ]
-            [ [ out>> close-handle ] [ in>> close-handle ] bi* ]
+            [ [ out>> dispose ] [ in>> dispose ] bi* ]
             [ [ in>> <input-port> ] [ out>> <output-port> ] bi* ]
         } 2cleave r> <encoder-duplex>
     ] with-destructors ;
index cb51088e58882816a536a26bd2c0d7d7d9bf0e68..0c8148d6b0c5bb8024efde4d46b62b7ee6496c14 100755 (executable)
@@ -1,4 +1,5 @@
-USING: help.markup help.syntax alien math continuations ;
+USING: help.markup help.syntax alien math continuations
+destructors ;
 IN: io.mmap
 
 HELP: mapped-file
index 2f637a4f816eec00a14677a09a2bb5214ca4f6ba..dde5210995da1046c51a3abb7ab1c6d05fdd10a6 100755 (executable)
@@ -1,23 +1,19 @@
 ! Copyright (C) 2007, 2008 Doug Coleman, Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: continuations io.backend kernel quotations sequences
-system alien alien.accessors accessors sequences.private ;
+USING: continuations destructors io.backend kernel quotations
+sequences system alien alien.accessors accessors
+sequences.private ;
 IN: io.mmap
 
-TUPLE: mapped-file address handle length closed ;
+TUPLE: mapped-file address handle length disposed ;
 
-: check-closed ( mapped-file -- mapped-file )
-    dup closed>> [
-        "Mapped file is closed" throw
-    ] when ; inline
-
-M: mapped-file length check-closed length>> ;
+M: mapped-file length dup check-disposed length>> ;
 
 M: mapped-file nth-unsafe
-    check-closed address>> swap alien-unsigned-1 ;
+    dup check-disposed address>> swap alien-unsigned-1 ;
 
 M: mapped-file set-nth-unsafe
-    check-closed address>> swap set-alien-unsigned-1 ;
+    dup check-disposed address>> swap set-alien-unsigned-1 ;
 
 INSTANCE: mapped-file sequence
 
@@ -29,10 +25,7 @@ HOOK: (mapped-file) io-backend ( path length -- address handle )
 
 HOOK: close-mapped-file io-backend ( mmap -- )
 
-M: mapped-file dispose ( mmap -- )
-    dup closed>> [ drop ] [
-        t >>closed close-mapped-file
-    ] if ;
+M: mapped-file dispose* ( mmap -- ) close-mapped-file ;
 
 : with-mapped-file ( path length quot -- )
     >r <mapped-file> r> with-disposal ; inline
index cd6a06a8e97002adf527e2183203e50c99fc651c..b81bd1d3036083b871a98274ffabd5f1dc5476ef 100755 (executable)
@@ -1,5 +1,5 @@
 IN: io.monitors\r
-USING: help.markup help.syntax continuations\r
+USING: help.markup help.syntax continuations destructors\r
 concurrency.mailboxes quotations ;\r
 \r
 HELP: with-monitors\r
index 77d539259e7755e8de40f854dde9b3ce689179b0..3a4328a7b8d75485decc121850ef66ee9482fa21 100644 (file)
@@ -1,7 +1,7 @@
 IN: io.monitors.tests
 USING: io.monitors tools.test io.files system sequences
 continuations namespaces concurrency.count-downs kernel io
-threads calendar prettyprint ;
+threads calendar prettyprint destructors ;
 
 os { winnt linux macosx } member? [
     [
index 863c8fc95cfb5bb7634803b2b6979344c8e1d4c3..65c1eb7e82d4375cd31849f23e8776a09e16cc53 100755 (executable)
@@ -1,8 +1,8 @@
 ! Copyright (C) 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: io.backend kernel continuations namespaces sequences
-assocs hashtables sorting arrays threads boxes io.timeouts
-accessors concurrency.mailboxes ;
+USING: io.backend kernel continuations destructors namespaces
+sequences assocs hashtables sorting arrays threads boxes
+io.timeouts accessors concurrency.mailboxes ;
 IN: io.monitors
 
 HOOK: init-monitors io-backend ( -- )
index 04d491edbe076c9da541f374ae7bb76a3d86ec37..383e166214f885dd85228a5fc1c9fdaf7fee6127 100644 (file)
@@ -1,13 +1,14 @@
 ! Copyright (C) 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors sequences assocs arrays continuations combinators kernel
-threads concurrency.messaging concurrency.mailboxes concurrency.promises
-io.files io.monitors debugger ;
+USING: accessors sequences assocs arrays continuations
+destructors combinators kernel threads concurrency.messaging
+concurrency.mailboxes concurrency.promises io.files io.monitors
+debugger ;
 IN: io.monitors.recursive
 
 ! Simulate recursive monitors on platforms that don't have them
 
-TUPLE: recursive-monitor < monitor children thread ready ;
+TUPLE: recursive-monitor < monitor children thread ready disposed ;
 
 : notify? ( -- ? ) monitor tget ready>> promise-fulfilled? ;
 
@@ -35,13 +36,10 @@ DEFER: add-child-monitor
 : remove-child-monitor ( monitor -- )
     monitor tget children>> delete-at* [ dispose ] [ drop ] if ;
 
-M: recursive-monitor dispose
-    dup queue>> closed>> [
-        drop
-    ] [
-        [ "stop" swap thread>> send-synchronous drop ]
-        [ queue>> dispose ] bi
-    ] if ;
+M: recursive-monitor dispose*
+    [ "stop" swap thread>> send-synchronous drop ]
+    [ queue>> dispose ]
+    bi ;
 
 : stop-pump ( -- )
     monitor tget children>> [ nip dispose ] assoc-each ;
index d51ae94bc745f46e3f70f5fa22f51f79bcbd8d7d..221cce1dbe55c0a8fdcb5bb08604c974e8ef4f3a 100644 (file)
@@ -1,4 +1,4 @@
-USING: help.markup help.syntax continuations io ;
+USING: help.markup help.syntax continuations destructors io ;
 IN: io.pipes
 
 HELP: pipe
index 4fb9d57748f56e10a390fca395d0fe913d089165..d1c2e54bb0c4de361ef23fd11018ca59b5da4ae8 100755 (executable)
@@ -1,6 +1,6 @@
 USING: io io.pipes io.streams.string io.encodings.utf8
 io.streams.duplex io.encodings io.timeouts namespaces
-continuations tools.test kernel calendar ;
+continuations tools.test kernel calendar destructors ;
 IN: io.pipes.tests
 
 [ "Hello" ] [
index ef6b200f64d27071591a0a3bed9efd62c316e731..f98fa4b0d4574975c34541b318293f1aca4b9780 100644 (file)
@@ -9,7 +9,7 @@ IN: io.pipes
 TUPLE: pipe in out ;
 
 M: pipe dispose ( pipe -- )
-    [ in>> close-handle ] [ out>> close-handle ] bi ;
+    [ in>> dispose ] [ out>> dispose ] bi ;
 
 HOOK: (pipe) io-backend ( -- pipe )
 
index 265b74e87a739ec83e5b60b71430a10f16c005fd..0db8b01df5d8bc66f45ac03d618a1e8226f515fd 100755 (executable)
@@ -1,5 +1,6 @@
 USING: io io.buffers io.backend help.markup help.syntax kernel
-byte-arrays sbufs words continuations byte-vectors classes ;
+byte-arrays sbufs words continuations destructors
+byte-vectors classes ;
 IN: io.ports
 
 ARTICLE: "io.ports" "Non-blocking I/O implementation"
index f1f4ca9cf28631c3241f3208dd6412e6dc563f53..56455d77118b63eda0211c6c77a982ef646407e5 100755 (executable)
@@ -10,7 +10,7 @@ IN: io.ports
 SYMBOL: default-buffer-size
 64 1024 * default-buffer-size set-global
 
-TUPLE: port handle error timeout closed ;
+TUPLE: port handle error timeout disposed ;
 
 M: port timeout timeout>> ;
 
@@ -18,21 +18,6 @@ M: port set-timeout (>>timeout) ;
 
 GENERIC: init-handle ( handle -- )
 
-GENERIC: close-handle ( handle -- )
-
-TUPLE: handle-destructor handle ;
-
-C: <handle-destructor> handle-destructor
-
-M: handle-destructor dispose ( obj -- )
-    handle>> close-handle ;
-
-: &close-handle ( handle -- handle )
-    dup <handle-destructor> <only-once> &dispose drop ; inline
-
-: |close-handle ( handle -- handle )
-    dup <handle-destructor> <only-once> |dispose drop ; inline
-
 : <port> ( handle class -- port )
     new
         swap dup init-handle >>handle ; inline
@@ -40,14 +25,6 @@ M: handle-destructor dispose ( obj -- )
 : pending-error ( port -- )
     [ f ] change-error drop [ throw ] when* ;
 
-ERROR: port-closed-error port ;
-
-M: port-closed-error summary
-    drop "Port has been closed" ;
-
-: check-closed ( port -- port )
-    dup closed>> [ port-closed-error ] when ;
-
 TUPLE: buffered-port < port buffer ;
 
 : <buffered-port> ( handle class -- port )
@@ -69,7 +46,7 @@ HOOK: (wait-to-read) io-backend ( port -- )
     [ f >>eof drop f ] r> if ; inline
 
 M: input-port stream-read1
-    check-closed
+    dup check-disposed
     dup wait-to-read [ buffer>> buffer-pop ] unless-eof ;
 
 : read-step ( count port -- byte-array/f )
@@ -77,7 +54,7 @@ M: input-port stream-read1
     [ dupd buffer>> buffer-read ] unless-eof nip ;
 
 M: input-port stream-read-partial ( max stream -- byte-array/f )
-    check-closed
+    dup check-disposed
     >r 0 max >integer r> read-step ;
 
 : read-loop ( count port accum -- )
@@ -92,7 +69,7 @@ M: input-port stream-read-partial ( max stream -- byte-array/f )
     ] if ;
 
 M: input-port stream-read
-    check-closed
+    dup check-disposed
     >r 0 max >fixnum r>
     2dup read-step dup [
         pick over length > [
@@ -115,12 +92,12 @@ TUPLE: output-port < buffered-port ;
     tuck buffer>> can-write? [ drop ] [ stream-flush ] if ;
 
 M: output-port stream-write1
-    check-closed
+    dup check-disposed
     1 over wait-to-write
     buffer>> byte>buffer ;
 
 M: output-port stream-write
-    check-closed
+    dup check-disposed
     over length over buffer>> buffer-size > [
         [ buffer>> buffer-size <groups> ]
         [ [ stream-write ] curry ] bi
@@ -136,15 +113,13 @@ HOOK: (wait-to-write) io-backend ( port -- )
     dup buffer>> buffer-empty? [ drop ] [ (wait-to-write) ] if ;
 
 M: output-port stream-flush ( port -- )
-    check-closed
+    dup check-disposed
     [ flush-port ] [ pending-error ] bi ;
 
-GENERIC: close-port ( port -- )
-
-M: output-port close-port
+M: output-port dispose*
     [ flush-port ] [ call-next-method ] bi ;
 
-M: buffered-port close-port
+M: buffered-port dispose*
     [ call-next-method ]
     [ [ [ buffer-free ] when* f ] change-buffer drop ]
     bi ;
@@ -153,11 +128,7 @@ HOOK: cancel-io io-backend ( port -- )
 
 M: port timed-out cancel-io ;
 
-M: port close-port
-    [ cancel-io ] [ handle>> close-handle ] bi ;
-
-M: port dispose
-    dup closed>> [ drop ] [ t >>closed close-port ] if ;
+M: port dispose* [ cancel-io ] [ handle>> dispose ] bi ;
 
 : <ports> ( read-handle write-handle -- input-port output-port )
     [
index e15e8c0039f6657c02a65aa61a2b31a20b0cf74a..221a3301cef6414dc4fdf73b8c3622344a5e0335 100755 (executable)
@@ -1,9 +1,9 @@
 ! Copyright (C) 2003, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: io io.sockets io.files io.streams.duplex logging
-continuations kernel math math.parser namespaces parser
-sequences strings prettyprint debugger quotations calendar
-threads concurrency.combinators assocs fry ;
+continuations destructors kernel math math.parser namespaces
+parser sequences strings prettyprint debugger quotations
+calendar threads concurrency.combinators assocs fry ;
 IN: io.server
 
 SYMBOL: servers
index 6cd711da81f13e87e8aa60544cc3754be65a16d8..d9ca85ddd6880cd64e6724238b01708a197e6bd9 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors kernel symbols namespaces continuations
-io.sockets sequences ;
+destructors io.sockets sequences ;
 IN: io.sockets.secure
 
 SYMBOL: ssl-backend
index db07caa330a75e771ed2f51a57d06b49377af46c..7ef08575c0a141e3f2bcbe385168ba028befd8d3 100755 (executable)
@@ -1,5 +1,5 @@
 USING: help.markup help.syntax io io.backend threads
-strings byte-arrays continuations quotations ;
+strings byte-arrays continuations destructors quotations ;
 IN: io.sockets
 
 ARTICLE: "network-addressing" "Address specifiers"
index ba6d16a36494907463723603384ba617e873fe65..40f6c22b82bc18f6b8ebc2c5fa49d32d1b946a54 100755 (executable)
@@ -187,7 +187,7 @@ SYMBOL: local-address
 TUPLE: server-port < port addr encoding ;
 
 : check-server-port ( port -- port )
-    check-closed
+    dup check-disposed
     dup server-port? [ "Not a server port" throw ] unless ; inline
 
 GENERIC: (server) ( addrspec -- handle )
@@ -216,7 +216,7 @@ HOOK: (datagram) io-backend ( addr -- datagram )
     dup (datagram) datagram-port <port> swap >>addr ;
 
 : check-datagram-port ( port -- port )
-    check-closed
+    dup check-disposed
     dup datagram-port? [ "Not a datagram port" throw ] unless ; inline
 
 HOOK: (receive) io-backend ( datagram -- packet addrspec )
index 15d401ad6858b01b0720bccb6ad54d9d1090122c..ca4f424fb6cadf1751d081bc67b21f3d631e54c0 100755 (executable)
@@ -18,9 +18,6 @@ HELP: <duplex-stream>
 { $values { "in" "an input stream" } { "out" "an output stream" } { "stream" " a duplex stream" } }
 { $description "Creates a duplex stream. Writing to a duplex stream will write to " { $snippet "out" } ", and reading from a duplex stream will read from " { $snippet "in" } ". Closing a duplex stream closes both the input and output streams." } ;
 
-HELP: stream-closed-twice
-{ $error-description "This error is thrown when performing an I/O operation on a " { $link duplex-stream } " which has been closed with " { $link dispose } "." } ;
-
 HELP: with-stream
 { $values { "stream" duplex-stream } { "quot" quotation } }
 { $description "Calls the quotation in a new dynamic scope, with both " { $link input-stream } " and " { $link output-stream } " rebound to  " { $snippet "stream" } ". The stream is closed if the quotation returns or throws an error." } ;
index 9377256c0d01c02cd8b5414f7572889309d411a1..860702c5635b50853db0b34f7d30a7f40a4aef8a 100755 (executable)
@@ -1,18 +1,13 @@
 USING: io.streams.duplex io io.streams.string
-kernel continuations tools.test ;
+kernel continuations tools.test destructors accessors ;
 IN: io.streams.duplex.tests
 
 ! Test duplex stream close behavior
-TUPLE: closing-stream closed? ;
+TUPLE: closing-stream < disposable ;
 
 : <closing-stream> closing-stream new ;
 
-M: closing-stream dispose
-    dup closing-stream-closed? [
-        "Closing twice!" throw
-    ] [
-        t swap set-closing-stream-closed?
-    ] if ;
+M: closing-stream dispose* drop ;
 
 TUPLE: unclosable-stream ;
 
@@ -30,14 +25,14 @@ M: unclosable-stream dispose
     <unclosable-stream> <closing-stream> [
         <duplex-stream>
         [ dup dispose ] [ 2drop ] recover
-    ] keep closing-stream-closed?
+    ] keep disposed>>
 ] unit-test
 
 [ t ] [
     <closing-stream> [ <unclosable-stream>
         <duplex-stream>
         [ dup dispose ] [ 2drop ] recover
-    ] keep closing-stream-closed?
+    ] keep disposed>>
 ] unit-test
 
 [ "Hey" ] [
index 6ac663f9f2029a58b7973f0f69810340a91f60a3..86b9f90ff569d6ccdcd0d8c7b47b028f6f277b33 100755 (executable)
@@ -1,50 +1,33 @@
 ! Copyright (C) 2005, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel continuations io io.encodings io.encodings.private
-io.timeouts debugger inspector listener accessors delegate
-delegate.protocols ;
+USING: kernel continuations destructors io io.encodings
+io.encodings.private io.timeouts debugger inspector listener
+accessors delegate delegate.protocols ;
 IN: io.streams.duplex
 
 ! We ensure that the stream can only be closed once, to preserve
 ! integrity of duplex I/O ports.
 
-TUPLE: duplex-stream in out closed ;
+TUPLE: duplex-stream in out ;
 
-: <duplex-stream> ( in out -- stream )
-    f duplex-stream boa ;
+C: <duplex-stream> duplex-stream
 
-ERROR: stream-closed-twice ;
+CONSULT: input-stream-protocol duplex-stream in>> ;
 
-M: stream-closed-twice summary
-    drop "Attempt to perform I/O on closed stream" ;
-
-<PRIVATE
-
-: check-closed ( stream -- stream )
-    dup closed>> [ stream-closed-twice ] when ; inline
-
-: in ( duplex -- stream ) check-closed in>> ;
-
-: out ( duplex -- stream ) check-closed out>> ;
-
-PRIVATE>
-
-CONSULT: input-stream-protocol duplex-stream in ;
-
-CONSULT: output-stream-protocol duplex-stream out ;
+CONSULT: output-stream-protocol duplex-stream out>> ;
 
 M: duplex-stream set-timeout
-    [ in set-timeout ] [ out set-timeout ] 2bi ;
+    [ in>> set-timeout ] [ out>> set-timeout ] 2bi ;
 
 M: duplex-stream dispose
     #! The output stream is closed first, in case both streams
     #! are attached to the same file descriptor, the output
     #! buffer needs to be flushed before we close the fd.
-    dup closed>> [
-        t >>closed
-        [ dup out>> dispose ]
-        [ dup in>> dispose ] [ ] cleanup
-    ] unless drop ;
+    [
+        [ out>> &dispose drop ]
+        [ in>> &dispose drop ]
+        bi
+    ] with-destructors ;
 
 : <encoder-duplex> ( stream-in stream-out encoding -- duplex )
     tuck re-encode >r re-decode r> <duplex-stream> ;
index 384a3806b8511e249917bef338f28110a0ee251f..191c8dce9177d998e9d1b75ab6cdc565c2ddc939 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2007 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 IN: io.streams.null
-USING: kernel io io.timeouts io.streams.duplex continuations ;
+USING: kernel io io.timeouts io.streams.duplex destructors ;
 
 TUPLE: null-stream ;
 
index 207fdc3cbc0499cb43953584a7c0c6da83cf793a..df5669d9aaf3132fa3018b52e706d23d598d5ed7 100644 (file)
@@ -4,20 +4,18 @@ USING: alien generic assocs kernel kernel.private math
 io.ports sequences strings structs sbufs threads unix
 vectors io.buffers io.backend io.encodings math.parser
 continuations system libc qualified namespaces io.timeouts
-io.encodings.utf8 accessors inspector combinators ;
+io.encodings.utf8 destructors accessors inspector combinators ;
 QUALIFIED: io
 IN: io.unix.backend
 
 ! I/O tasks
 GENERIC: handle-fd ( handle -- fd )
 
-TUPLE: fd fd closed ;
+TUPLE: fd fd disposed ;
 
 : <fd> ( n -- fd ) f fd boa ;
 
-M: fd dispose
-    dup closed>>
-    [ drop ] [ t >>closed fd>> close-file ] if ;
+M: fd dispose* fd>> close-file ;
 
 M: fd handle-fd fd>> ;
 
@@ -112,8 +110,6 @@ M: fd init-handle ( fd -- )
     [ F_SETFL O_NONBLOCK fcntl drop ]
     [ F_SETFD FD_CLOEXEC fcntl drop ] bi ;
 
-M: fd close-handle ( fd -- ) dispose ;
-
 ! Readers
 : eof ( reader -- )
     dup buffer>> buffer-empty? [ t >>eof ] when drop ;
index 33cc25d60cf9461f2c83edeef6a97c1a64acf411..9f554a044ba0469517b68fbd94f9222641ff1053 100755 (executable)
@@ -33,7 +33,7 @@ M: unix (file-writer) ( path -- stream )
 
 : open-append ( path -- fd )
     [
-        append-flags file-mode open-file |close-handle
+        append-flags file-mode open-file |dispose
         dup 0 SEEK_END lseek io-error
     ] with-destructors ;
 
index 49bfc3416405a070fd1e6018409312181a887b55..6d1f7f1796073c2a720b5cb2120ab631a7b58546 100755 (executable)
@@ -1,7 +1,7 @@
 IN: io.unix.launcher.tests
 USING: io.files tools.test io.launcher arrays io namespaces
 continuations math io.encodings.binary io.encodings.ascii
-accessors kernel sequences io.encodings.utf8 ;
+accessors kernel sequences io.encodings.utf8 destructors ;
 
 [ ] [
     [ "launcher-test-1" temp-file delete-file ] ignore-errors
index 43733e848183a1fe5e945313697ce376879d6da3..17d3041aaf12058be3049b5f06ba0fc5c19d7f16 100644 (file)
@@ -12,7 +12,7 @@ SYMBOL: watches
 
 SYMBOL: inotify
 
-TUPLE: linux-monitor < monitor wd inotify watches ;
+TUPLE: linux-monitor < monitor wd inotify watches disposed ;
 
 : <linux-monitor> ( wd path mailbox -- monitor )
     linux-monitor new-monitor
@@ -54,14 +54,12 @@ M: linux (monitor) ( path recursive? mailbox -- monitor )
         IN_CHANGE_EVENTS swap add-watch
     ] if ;
 
-M: linux-monitor dispose ( monitor -- )
-    dup inotify>> closed>> [ drop ] [
-        [ [ wd>> ] [ watches>> ] bi delete-at ]
-        [
-            [ inotify>> handle>> ] [ wd>> ] bi
-            inotify_rm_watch io-error
-        ] bi
-    ] if ;
+M: linux-monitor dispose* ( monitor -- )
+    [ [ wd>> ] [ watches>> ] bi delete-at ]
+    [
+        [ inotify>> handle>> ] [ wd>> ] bi
+        inotify_rm_watch io-error
+    ] bi ;
 
 : ignore-flags? ( mask -- ? )
     {
index 8a5d0c490fca037c54b2ae954fbb17b60db11f42..3471dc856a2b0b61ed658b46b093df3144629b87 100644 (file)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: io.unix.bsd io.backend io.monitors core-foundation.fsevents
 continuations kernel sequences namespaces arrays system locals
-accessors ;
+accessors destructors ;
 IN: io.unix.macosx
 
 TUPLE: macosx-monitor < monitor handle ;
index 8a98e4795fc59b82a09164d9e988c1245dc8ee27..14ad49a89ad8a9bbd700c724f241691e7b1651dc 100755 (executable)
@@ -9,7 +9,7 @@ IN: io.unix.mmap
 :: mmap-open ( length prot flags path -- alien fd )
     [
         f length prot flags
-        path open-r/w |close-handle
+        path open-r/w |dispose
         [ 0 mmap dup MAP_FAILED = [ (io-error) ] when ] keep
     ] with-destructors ;
 
index 05164aca349de3185c4b087ed66d63969cbca5bd..bc328a146f47443437548c7427c6c385a00ad2a1 100644 (file)
@@ -117,7 +117,7 @@ M: ssl (server) addrspec>> (server) ;
 
 M: ssl (accept)
     [
-        addrspec>> (accept) |close-handle <ssl-socket> |close-handle
+        addrspec>> (accept) |dispose <ssl-socket> |dispose
         dup do-ssl-accept
     ] with-destructors ;
 
index 83aa01d79a1a6b34bff232454a31d4c9741d4556..910f87a163e7955ac8a362a94953fab4c7dc08c1 100644 (file)
@@ -13,7 +13,7 @@ EXCLUDE: io.sockets => accept ;
 IN: io.unix.sockets
 
 : socket-fd ( domain type -- fd )
-    0 socket dup io-error <fd> |close-handle dup init-handle ;
+    0 socket dup io-error <fd> |dispose dup init-handle ;
 
 : set-socket-option ( fd level opt -- )
     >r >r handle-fd r> r> 1 <int> "int" heap-size setsockopt io-error ;
index 61a667b70f4f648c91526a5ab90e92fecee57e2a..3147d7144bec4e4b7894286c11f01d7f3eee3b81 100755 (executable)
@@ -1,7 +1,7 @@
 USING: io.files io.sockets io kernel threads
 namespaces tools.test continuations strings byte-arrays
 sequences prettyprint system io.encodings.binary io.encodings.ascii
-io.streams.duplex ;
+io.streams.duplex destructors ;
 IN: io.unix.tests
 
 ! Unix domain stream sockets
index 1db17278ad0f77ef3d3c7cf26f0a7687f71780e9..9a278fb67f2f5b3179e6dd8b9b04c1be552285aa 100755 (executable)
@@ -3,7 +3,7 @@
 USING: arrays calendar combinators channels concurrency.messaging fry io
        io.encodings.8-bit io.sockets kernel math namespaces sequences
        sequences.lib splitting strings threads
-       continuations classes.tuple ascii accessors ;
+       continuations destructors classes.tuple ascii accessors ;
 IN: irc
 
 ! utils
@@ -143,7 +143,7 @@ SYMBOL: irc-client
     " hostname servername :irc.factor" irc-print ;
 
 : CONNECT ( server port -- stream )
-    <inet> latin1 <client> ;
+    <inet> latin1 <client> drop ;
 
 : JOIN ( channel password -- )
     "JOIN " irc-write
index a832b10a18a05c02be7905724e674bfbc8a8ce71..2a4e34e01599c3d03e6efc71ed528b35247322fa 100755 (executable)
@@ -1,10 +1,10 @@
 ! Copyright (C) 2008 Slava Pestov.\r
 ! See http://factorcode.org/license.txt for BSD license.\r
 USING: namespaces kernel io calendar sequences io.files\r
-io.sockets continuations prettyprint assocs math.parser\r
-words debugger math combinators concurrency.messaging\r
-threads arrays init math.ranges strings calendar.format\r
-io.encodings.utf8 ;\r
+io.sockets continuations destructors prettyprint assocs\r
+math.parser words debugger math combinators\r
+concurrency.messaging threads arrays init math.ranges strings\r
+calendar.format io.encodings.utf8 ;\r
 IN: logging.server\r
 \r
 : log-root ( -- string )\r
index 1cffd24cd58fcddab64e701fb89eef8f2d581f23..014592dbcce49bf0fab7ecad428792edd8ec48d4 100755 (executable)
@@ -137,14 +137,11 @@ M: ssl-handle init-handle file>> init-handle ;
 
 HOOK: ssl-shutdown io-backend ( handle -- )
 
-M: ssl-handle close-handle
-    dup disposed>> [ drop ] [
-        t >>disposed
-        [ ssl-shutdown ]
-        [ handle>> SSL_free ]
-        [ file>> close-handle ]
-        tri
-    ] if ;
+M: ssl-handle dispose*
+    [ ssl-shutdown ]
+    [ handle>> SSL_free ]
+    [ file>> dispose ]
+    tri ;
 
 ERROR: certificate-verify-error result ;
 
index f376903ecfb83450f70b7d02959583360356e7c9..a4cf74e1df1940b18c88d6116b72b5355e84fb3c 100644 (file)
@@ -1,7 +1,6 @@
 USING: accessors alien.c-types byte-arrays continuations
 kernel windows windows.advapi32 init namespaces random
 destructors locals ;
-USE: tools.walker
 IN: random.windows
 
 TUPLE: windows-rng provider type ;
index 3044c8872f2ceeb3b955edce151b3955c1e4a442..7d50d384e25892436cbf19ea84bc629689065a5d 100755 (executable)
@@ -3,7 +3,7 @@
 USING: accessors arrays combinators combinators.cleave combinators.lib
 continuations db db.tuples db.types db.sqlite kernel math
 math.parser namespaces parser sets sequences sequences.deep
-sequences.lib strings words ;
+sequences.lib strings words destructors ;
 IN: semantic-db
 
 TUPLE: node id content ;
index 89522d1f76b685fefe88f0c8f1baee3458a4ff80..3d8a390d1384aa02f93392ff599166f00b5b11cc 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2007 Chris Double, Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel sequences namespaces math inference.transforms
-       combinators macros quotations math.ranges bake ;
+       combinators macros quotations math.ranges fry ;
 
 IN: shuffle
 
@@ -19,7 +19,7 @@ MACRO: ndrop ( n -- ) [ drop ] n*quot ;
 
 : nnip ( n -- ) swap >r ndrop r> ; inline
 
-MACRO: ntuck ( n -- ) 2 + [ dup , -nrot ] bake ;
+MACRO: ntuck ( n -- ) 2 + '[ dup , -nrot ] ;
 
 : 2swap ( x y z t -- z t x y ) rot >r rot r> ; inline
 
index f23ee138d5be4dc5059cc8ed70063eced4784571..824651030d3d58e1b83ee831e52d54f210760b06 100755 (executable)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: combinators kernel prettyprint io io.timeouts io.server
 sequences namespaces io.sockets continuations calendar
-io.encodings.ascii io.streams.duplex ;
+io.encodings.ascii io.streams.duplex destructors ;
 IN: smtp.server
 
 ! Mock SMTP server for testing purposes.
index 59dbe9b753f3f986a6e8d4697452eccb7b5ee55d..6c5f7e7775f2a12d23bfcbd16e98b8dc20b87bbf 100755 (executable)
@@ -6,7 +6,7 @@ continuations math definitions mirrors splitting parser classes
 inspector layouts vocabs.loader prettyprint.config prettyprint
 debugger io.streams.c io.files io.backend
 quotations io.launcher words.private tools.deploy.config
-bootstrap.image io.encodings.utf8 accessors ;
+bootstrap.image io.encodings.utf8 destructors accessors ;
 IN: tools.deploy.backend
 
 : copy-vm ( executable bundle-name extension -- vm )
index 533a6c42b7a436626e1d6a5501b16ba717fe5454..960c34118a31fe8c5e61540bc60a03abcb0b46e3 100755 (executable)
@@ -8,7 +8,8 @@ hashtables io kernel namespaces sequences io.styles strings
 quotations math opengl combinators math.vectors
 sorting splitting io.streams.nested assocs
 ui.gadgets.presentations ui.gadgets.slots ui.gadgets.grids
-ui.gadgets.grid-lines classes.tuple models continuations ;
+ui.gadgets.grid-lines classes.tuple models continuations
+destructors ;
 IN: ui.gadgets.panes
 
 TUPLE: pane output current prototype scrolls?