diff options
Diffstat (limited to 'lib/dtas/watchable.rb')
-rw-r--r-- | lib/dtas/watchable.rb | 21 |
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 |