X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ffs%2Funix%2Ffilemonitor.cpp;h=11b2a8d74b1705ba4b16c38d447e7c8e9516fdb7;hb=1787d4928ac1285f5434a2c8d0676deea9ce9176;hp=70cfc4ec4b524e432a529aba08d6cacd366b5499;hpb=ffab0509a65f6f32851e64d66a5f7eeb453ab29f;p=libs%2Fcore.git diff --git a/source/fs/unix/filemonitor.cpp b/source/fs/unix/filemonitor.cpp index 70cfc4e..11b2a8d 100644 --- a/source/fs/unix/filemonitor.cpp +++ b/source/fs/unix/filemonitor.cpp @@ -1,4 +1,6 @@ #include +#include +#include #include #include #include "filemonitor.h" @@ -36,13 +38,13 @@ void INotify::remove_watch(int wd) throw system_error("inotify_rm_watch"); } -unsigned INotify::do_write(const char *, unsigned) +size_t INotify::do_write(const char *, size_t) { check_access(IO::M_WRITE); return 0; } -unsigned INotify::do_read(char *buf, unsigned size) +size_t INotify::do_read(char *buf, size_t size) { return IO::sys_read(fd, buf, size); } @@ -98,27 +100,26 @@ void FileMonitor::Private::events_available() for(unsigned i=0; i(event_buf+i); - for(vector::iterator j=monitor.files.begin(); j!=monitor.files.end(); ++j) - if(j->tag==event->wd) + auto j = find_member(monitor.files, event->wd, &MonitoredFile::tag); + if(j!=monitor.files.end()) + { + if(event->mask&IN_MODIFY) + j->modified = true; + if(((event->mask&IN_CLOSE_WRITE) && j->modified) || (event->mask&IN_DELETE_SELF)) { - if(event->mask&IN_MODIFY) - j->modified = true; - if(((event->mask&IN_CLOSE_WRITE) && j->modified) || (event->mask&IN_DELETE_SELF)) - { - j->modified = false; - changed_files.push_back(j->path); - } - if(event->mask&IN_IGNORED) - j->tag = -1; - break; + j->modified = false; + changed_files.push_back(j->path); } + if(event->mask&IN_IGNORED) + j->tag = -1; + } i += sizeof(struct inotify_event)+event->len; } - for(vector::const_iterator i=changed_files.begin(); i!=changed_files.end(); ++i) - monitor.signal_file_modified.emit(*i); + for(const FS::Path &p: changed_files) + monitor.signal_file_modified.emit(p); - for(vector::iterator j=monitor.files.begin(); j!=monitor.files.end(); ) + for(auto j=monitor.files.begin(); j!=monitor.files.end(); ) { if(j->tag==-1) monitor.files.erase(j++);