From 36a4eb7ee187f4f9b84e1241cef1680facc25f8e Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Tue, 16 Jul 2013 14:30:38 -0700 Subject: [PATCH] io.monitors.recursive: Bug - could fail and leak a file monitor. Fix - Monitors tests were "leaking" dummy-monitors objects. --- .../monitors/recursive/recursive-tests.factor | 26 +++++++++++-------- basis/io/monitors/recursive/recursive.factor | 14 +++++----- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/basis/io/monitors/recursive/recursive-tests.factor b/basis/io/monitors/recursive/recursive-tests.factor index 947c9ce01d..42c1a30d0d 100644 --- a/basis/io/monitors/recursive/recursive-tests.factor +++ b/basis/io/monitors/recursive/recursive-tests.factor @@ -1,19 +1,19 @@ USING: accessors math kernel namespaces continuations io.files io.monitors io.monitors.recursive io.backend concurrency.mailboxes tools.test destructors io.files.info -io.pathnames io.files.temp io.directories.hierarchy ; +io.pathnames io.files.temp io.directories.hierarchy fry ; IN: io.monitors.recursive.tests SINGLETON: mock-io-backend -TUPLE: counter i ; +TUPLE: mock-counter i ; SYMBOL: dummy-monitor-created SYMBOL: dummy-monitor-disposed TUPLE: dummy-monitor < monitor ; -M: dummy-monitor dispose +M: dummy-monitor dispose* drop dummy-monitor-disposed get [ 1 + ] change-i drop ; M: mock-io-backend (monitor) @@ -28,8 +28,8 @@ M: mock-io-backend (monitor) M: mock-io-backend link-info global [ link-info ] with-variables ; -[ ] [ 0 counter boa dummy-monitor-created set ] unit-test -[ ] [ 0 counter boa dummy-monitor-disposed set ] unit-test +[ ] [ 0 mock-counter boa dummy-monitor-created set ] unit-test +[ ] [ 0 mock-counter boa dummy-monitor-disposed set ] unit-test [ ] [ mock-io-backend io-backend [ @@ -44,14 +44,18 @@ M: mock-io-backend link-info [ "doesnotexist" temp-file delete-tree ] ignore-errors [ - mock-io-backend io-backend [ - "doesnotexist" temp-file dispose + 0 mock-counter boa dummy-monitor-created [ + mock-io-backend io-backend [ + "doesnotexist" temp-file dispose + ] with-variable ] with-variable ] must-fail +[ ] [ 0 mock-counter boa dummy-monitor-created set ] unit-test +[ ] [ 0 mock-counter boa dummy-monitor-disposed set ] unit-test + +! Test that disposing twice is allowed [ ] [ - mock-io-backend io-backend [ - "" resource-path - [ dispose ] [ dispose ] bi - ] with-variable + "" resource-path + [ dispose ] [ dispose ] bi ] unit-test diff --git a/basis/io/monitors/recursive/recursive.factor b/basis/io/monitors/recursive/recursive.factor index 70daed9018..2681f5520b 100755 --- a/basis/io/monitors/recursive/recursive.factor +++ b/basis/io/monitors/recursive/recursive.factor @@ -100,9 +100,11 @@ M: recursive-monitor dispose* ready>> ?promise ?linked drop ; : ( path mailbox -- monitor ) - [ absolute-path ] dip - recursive-monitor new-monitor - H{ } clone >>children - >>ready - dup start-pump-thread - dup wait-for-ready ; + '[ _ _ + [ absolute-path ] dip + recursive-monitor new-monitor |dispose + H{ } clone >>children + >>ready + dup start-pump-thread + dup wait-for-ready + ] with-destructors ;