فهرست منبع

ncd: examples: add directory_updater

ambrop7 13 سال پیش
والد
کامیت
021b2b8ed5
1فایلهای تغییر یافته به همراه72 افزوده شده و 0 حذف شده
  1. 72 0
      ncd/examples/directory_updater.ncd

+ 72 - 0
ncd/examples/directory_updater.ncd

@@ -0,0 +1,72 @@
+#
+# Watches a directory and runs an update program whenever something
+# changes. This is race-free, and if the directory changes while the
+# update is running, it will be done again.
+#
+# NOTE: the update should not modify the directory. If it does, the
+#       the result will be endless and constant updating.
+#
+
+process watcher {
+    # Blocker object used to trigger an update.
+    blocker() blk;
+
+    # State: updating - if updater script is running
+    #        updating_dirty - if something changed while
+    #                         script was running
+    var("false") updating;
+    var("false") updating_dirty;
+
+    # Start update process.
+    spawn("updater", {});
+
+    # Wait for directory event.
+    # CHANGE THIS
+    sys.watch_directory("/home/ambro") watcher;
+
+    # Print event details (e.g. "added somefile").
+    println(watcher.filename, " ", watcher.event_type);
+
+    # If updating is in progress, mark dirty.
+    If (updating) {
+        updating_dirty->set("true");
+    };
+
+    # Request update. This makes use() proceed forward.
+    blk->up();
+
+    # Wait for next event (execution moves up).
+    watcher->nextevent();
+}
+
+template updater {
+    # Wait for update request.
+    _caller.blk->use();
+
+    # Wait some time.
+    sleep("1000", "0");
+
+    # We're about to start update script - set updating
+    # variable and mark as non dirty.
+    _caller.updating_dirty->set("false");
+    _caller.updating->set("true");
+
+    println("Update started");
+
+    # CHANGE THIS
+    sleep("3000", "0");
+    #runonce({"/bin/echo", "Updater speaking"}, {"keep_stdout", "keep_stderr"});
+
+    println("Update finished");
+
+    # No longer running update script.
+    _caller.updating->set("false");
+
+    # If something changed while script was running, restart
+    # update; else wait for next update request.
+    If (_caller.updating_dirty) {
+        _caller.blk->downup();
+    } else {
+        _caller.blk->down();
+    };
+}