]> gitweb.factorcode.org Git - factor.git/commitdiff
Directory change notification work in progress. Only on Windows right now, blocking
authorSlava Pestov <slava@factorcode.org>
Sat, 26 Jan 2008 07:40:09 +0000 (03:40 -0400)
committerSlava Pestov <slava@factorcode.org>
Sat, 26 Jan 2008 07:40:09 +0000 (03:40 -0400)
core/assocs/assocs.factor [changed mode: 0644->0755]
core/compiler/compiler.factor
extra/io/monitor/monitor.factor [new file with mode: 0755]
extra/io/windows/directory/directory.factor [deleted file]
extra/io/windows/nt/monitor/monitor.factor [new file with mode: 0755]
extra/windows/kernel32/kernel32.factor

old mode 100644 (file)
new mode 100755 (executable)
index 799a6eb..1983608
@@ -77,6 +77,9 @@ M: assoc assoc-clone-like ( assoc exemplar -- newassoc )
 : rename-at ( newkey key assoc -- )
     tuck delete-at* [ -rot set-at ] [ 3drop ] if ;
 
+: delete-any ( assoc -- element )
+    [ [ 2drop t ] assoc-find 2drop dup ] keep delete-at ;
+
 : assoc-empty? ( assoc -- ? )
     assoc-size zero? ;
 
index 8d9f0042702bf5a8dd0513d3b68f121ae0bf63be..9378642951b518c39ab828588daafb36654d412d 100755 (executable)
@@ -42,9 +42,6 @@ IN: compiler
     [ dupd compile-failed f save-effect ]
     recover ;
 
-: delete-any ( assoc -- element )
-    [ [ 2drop t ] assoc-find 2drop dup ] keep delete-at ;
-
 : compile-loop ( assoc -- )
     dup assoc-empty? [ drop ] [
         dup delete-any (compile)
diff --git a/extra/io/monitor/monitor.factor b/extra/io/monitor/monitor.factor
new file mode 100755 (executable)
index 0000000..c74a449
--- /dev/null
@@ -0,0 +1,11 @@
+! Copyright (C) 2008 Slava Pestov.\r
+! See http://factorcode.org/license.txt for BSD license.\r
+USING: io.backend ;\r
+IN: io.monitor\r
+\r
+HOOK: <monitor> io-backend ( path -- monitor )\r
+\r
+HOOK: next-change io-backend ( monitor -- path )\r
+\r
+: with-monitor ( directory quot -- )\r
+    >r <monitor> r> over [ close-monitor ] curry [ ] cleanup ;\r
diff --git a/extra/io/windows/directory/directory.factor b/extra/io/windows/directory/directory.factor
deleted file mode 100644 (file)
index 4728a06..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-USING: alien.c-types destructors io.windows
-io.windows.nt.backend kernel math windows
-windows.kernel32 windows.types libc ;
-IN: io.windows.directory
-
-: open-directory ( path -- handle )
-    [
-        FILE_LIST_DIRECTORY
-        share-mode
-        f
-        OPEN_EXISTING
-        FILE_FLAG_BACKUP_SEMANTICS FILE_FLAG_OVERLAPPED bitor
-        f
-        CreateFile
-        dup invalid-handle? dup close-later
-        dup add-completion
-    ] with-destructors ;
-
-: directory-notifications ( -- n )
-    FILE_NOTIFY_CHANGE_FILE_NAME FILE_NOTIFY_CHANGE_DIR_NAME bitor ;
-
-: read-directory-changes ( handle -- )
-    [
-        65536 dup malloc
-        swap
-        TRUE
-        directory-notifications
-        0 <int>
-        (make-overlapped)
-        ! f works here, blocking
-        f
-        ReadDirectoryChangesW win32-error=0/f
-    ] with-destructors ;
-
diff --git a/extra/io/windows/nt/monitor/monitor.factor b/extra/io/windows/nt/monitor/monitor.factor
new file mode 100755 (executable)
index 0000000..2b3b87b
--- /dev/null
@@ -0,0 +1,74 @@
+! Copyright (C) 2008 Doug Coleman, Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: alien.c-types destructors io.windows kernel math windows
+windows.kernel32 windows.types libc assocs alien namespaces
+continuations io.monitor ;
+IN: io.windows.nt.monitor
+
+TUPLE: monitor handle buffer queue closed? ;
+
+: open-directory ( path -- handle )
+    [
+        FILE_LIST_DIRECTORY
+        share-mode
+        f
+        OPEN_EXISTING
+        FILE_FLAG_BACKUP_SEMANTICS FILE_FLAG_OVERLAPPED bitor
+        f
+        CreateFile dup invalid-handle? dup close-later
+    ] with-destructors ;
+
+: buffer-size 65536 ; inline
+
+M: windows-nt-io <monitor> ( path -- monitor )
+    [
+        open-directory
+        buffer-size malloc dup free-later f
+    ] with-destructors
+    f monitor construct-boa ;
+
+: check-closed ( monitor -- )
+    monitor-closed? [ "Monitor closed" throw ] when ;
+
+: close-monitor ( monitor -- )
+    dup check-closed
+    dup monitor-buffer free
+    dup monitor-handle CloseHandle drop
+    t swap set-monitor-closed? ;
+
+: fill-buffer ( monitor -- bytes )
+    [
+        dup monitor-handle
+        swap monitor-buffer
+        buffer-size
+        TRUE
+        FILE_NOTIFY_CHANGE_ALL
+        0 <uint> [
+            f
+            f
+            ReadDirectoryChangesW win32-error=0/f
+        ] keep *uint
+    ] with-destructors ;
+
+: (changed-files) ( buffer -- )
+    dup {
+        FILE_NOTIFY_INFORMATION-NextEntryOffset
+        FILE_NOTIFY_INFORMATION-FileName
+        FILE_NOTIFY_INFORMATION-FileNameLength
+    } get-slots memory>string dup set
+    dup zero? [ 2drop ] [
+        swap <displaced-alien> (changed-files)
+    ] if ;
+
+: changed-files ( buffer len -- assoc )
+    [ zero? [ drop ] [ (changed-files) ] if ] H{ } make-assoc ;
+
+: fill-queue ( monitor -- )
+    dup monitor-buffer
+    over fill-buffer changed-files
+    swap set-monitor-queue ;
+
+M: windows-nt-io next-change ( monitor -- path )
+    dup check-closed
+    dup monitor-queue dup assoc-empty?
+    [ drop dup fill-queue next-change ] [ nip delete-any ] if ;
index 1c75e3369859ab00adccfdeb236801e26a3193a4..15bdcd3e371c9e5dbdd014c0f8fd7f09fb6d068f 100755 (executable)
@@ -87,7 +87,7 @@ C-STRUCT: FILE_NOTIFY_INFORMATION
     { "DWORD" "NextEntryOffset" }
     { "DWORD" "Action" }
     { "DWORD" "FileNameLength" }
-    { "WCHAR*" "FileName" } ;
+    { "WCHAR[1]" "FileName" } ;
 TYPEDEF: FILE_NOTIFY_INFORMATION* PFILE_NOTIFY_INFORMATION
 
 : STD_INPUT_HANDLE  -10 ; inline