# # 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(); }; }