Browse Source

initial pass at an autoreloader (broken! non-recursive inotify)

master
gradient 8 years ago
parent
commit
a72365fad2
1 changed files with 58 additions and 0 deletions
  1. +58
    -0
      src/notify.h

+ 58
- 0
src/notify.h View File

@ -0,0 +1,58 @@
#include <sys/inotify.h>
#include <inotifytools/inotifytools.h>
#include <cerrno>
#include <poll.h>
#include "project.h"
#define MAX_WDS 16
typedef void (Project::*ProjectReloadFn)();
class NotifyService {
public:
NotifyService() {
this->inotify_fd = inotify_init1(IN_NONBLOCK);
if (inotify_fd == -1) {
perror("inotify_init1");
exit(EXIT_FAILURE);
}
std::cout << "inotify fd: " << inotify_fd << '\n';
this->poll_fd = {.fd = inotify_fd, .events = POLLIN, 0};
}
void watch(Project &project) {
int wd = inotify_add_watch(this->inotify_fd, project.basepath.str().c_str(),
IN_MODIFY);
if (wd == -1) {
std::cerr << "Failed to watch project base directory: " << project.basepath.str().c_str() << '\n';
perror("inotify_add_watch");
exit(EXIT_FAILURE);
}
std::cerr << "Watching " << project.basepath << " with wd: " << wd << '\n';
this->watch_ids.push_back(wd);
}
void _poll() {
int rc = poll(&this->poll_fd, 1, 0);
std::cout << "poll() -> " << rc << '\n';
if (rc == -1) {
if (errno == EINTR)
return;
perror("poll");
exit(EXIT_FAILURE);
}
if (rc > 0) {
std::cout << "poll data available!\n";
}
}
private:
int inotify_fd;
struct pollfd poll_fd;
std::vector<int> watch_ids;
};

Loading…
Cancel
Save