about summary refs log tree commit homepage
path: root/lib/dtas/watchable.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dtas/watchable.rb')
-rw-r--r--lib/dtas/watchable.rb21
1 files changed, 16 insertions, 5 deletions
diff --git a/lib/dtas/watchable.rb b/lib/dtas/watchable.rb
index cc6c018..36e8644 100644
--- a/lib/dtas/watchable.rb
+++ b/lib/dtas/watchable.rb
@@ -18,7 +18,8 @@ module DTAS::Watchable
     def readable_iter
       or_call = false
       while event = take(true) # drain the buffer
-        if (event.mask & FLAGS) != 0 && @watching[1] == event.name
+        w = @watches[event.wd] or next
+        if (event.mask & FLAGS) != 0 && w[event.name]
           or_call = true
         end
       end
@@ -31,19 +32,29 @@ module DTAS::Watchable
     end
 
     # we must watch the directory, since
-    def watch_file(path, blk)
+    def watch_files(paths, blk)
+      @watches = {} # wd -> { basename -> true }
       @on_readable = blk
-      @watching = File.split(File.expand_path(path))
-      add_watch(@watching[0], FLAGS)
+      @dir2wd = {}
+      Array(paths).each do |path|
+        watchdir, watchbase = File.split(File.expand_path(path))
+        wd = @dir2wd[watchdir] ||= add_watch(watchdir, FLAGS)
+        m = @watches[wd] ||= {}
+        m[watchbase] = true
+      end
     end
   end
 
   def watch_begin(blk)
     @ino = InotifyReadableIter.new
-    @ino.watch_file(@infile, blk)
+    @ino.watch_files(@watch_extra << @infile, blk)
     @ino
   end
 
+  def watch_extra(paths)
+    @ino.watch_extra(paths)
+  end
+
   # Closing the inotify descriptor (instead of using inotify_rm_watch)
   # is cleaner because it avoids EINVAL on race conditions in case
   # a directory is deleted: https://lkml.org/lkml/2007/7/9/3