11 #include <sys/types.h>
22 namespace file_watcher {
29 int read_pipe,
int write_pipe) {
34 struct kevent watch_event;
35 EV_SET(&watch_event, read_pipe, EVFILT_READ, EV_ADD | EV_ENABLE | EV_CLEAR, 0,
37 assert(kevent(
kq_, &watch_event, 1, NULL, 0, NULL) != -1);
39 for (FileWatcher::HandlerMap::const_iterator it = handlers.begin();
51 std::vector<struct kevent> triggered_events(handlers.size() + 1);
52 int nev = kevent(
kq_, NULL, 0, &triggered_events[0],
53 triggered_events.size(), NULL);
56 "FileWatcherKqueue - Could not poll events. Errno: %d", errno);
62 for (
int i = 0; i < nev && !stop; ++i) {
63 struct kevent ¤t_ev = triggered_events[i];
64 if (current_ev.ident == static_cast<uint64_t>(read_pipe)) {
72 std::map<int, WatchRecord>::const_iterator it =
watch_records_.find(
75 int current_fd = current_ev.ident;
78 if (current_ev.fflags & NOTE_DELETE) {
80 }
else if (current_ev.fflags & NOTE_LINK) {
83 }
else if (current_ev.fflags & NOTE_WRITE) {
86 }
else if (current_ev.fflags & NOTE_RENAME) {
89 }
else if (current_ev.fflags & NOTE_ATTRIB) {
93 bool clear_handler =
true;
99 "FileWatcherKqueue - Unknown event 0x%x\n",
106 if (!clear_handler) {
112 "FileWatcherKqueue - Unknown kevent ident: %ld",
119 for (std::map<int, WatchRecord>::const_iterator it =
watch_records_.begin();
132 struct kevent remove_event;
133 EV_SET(&remove_event, fd, EVFILT_VNODE, EV_DELETE, NULL, 0, 0);
134 assert(kevent(
kq_, &remove_event, 1, NULL, 0, NULL) != -1);
140 int fd = open(file_path.c_str(), O_RDONLY);
142 struct kevent watch_event;
143 EV_SET(&watch_event, fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR,
144 NOTE_DELETE | NOTE_WRITE | NOTE_EXTEND | NOTE_ATTRIB | NOTE_LINK
145 | NOTE_RENAME | NOTE_REVOKE,
148 assert(kevent(
kq_, &watch_event, 1, NULL, 0, NULL) != -1);
void RegisterFilter(const std::string &file_path, EventHandler *handler)
virtual int TryRegisterFilter(const std::string &file_path)
virtual bool RunEventLoop(const FileWatcher::HandlerMap &handler, int read_pipe, int write_pipe)
assert((mem||(size==0))&&"Out Of Memory")
std::map< std::string, EventHandler * > HandlerMap
file_watcher::EventHandler * handler_
virtual ~FileWatcherKqueue()
virtual bool Handle(const std::string &file_path, Event event, bool *clear_handler)=0
void RemoveFilter(int fd)
std::map< int, WatchRecord > watch_records_
void WritePipe(int fd, const void *buf, size_t nbyte)
void ReadPipe(int fd, void *buf, size_t nbyte)
CVMFS_EXPORT void LogCvmfs(const LogSource source, const int mask, const char *format,...)