bool destroy(Watcher* watcher) { if (processes.count(watcher) > 0) { WatcherProcess* process = processes[watcher]; processes.erase(watcher); process::terminate(process->self()); process::wait(process->self()); delete process; return true; } return false; }
void operator () () { if (call(manager, LOOKUP_PROCESS, reinterpret_cast<char *>(&watcher), sizeof(watcher)) != OK) fatal("failed to deallocate resources associated with Watcher"); WatcherProcess *process = *reinterpret_cast<WatcherProcess **>(const_cast<char *>(body(NULL))); send(process->self(), TERMINATE); wait(process->self()); delete process; }
void operator () () { while (true) { switch (receive()) { case REGISTER: { WatcherProcess *process = *reinterpret_cast<WatcherProcess **>(const_cast<char *>(body(NULL))); Watcher *watcher = process->watcher; assert(watchers.find(watcher) == watchers.end()); watchers[watcher] = process; send(from(), OK); break; } case UNREGISTER: { WatcherProcess *process = *reinterpret_cast<WatcherProcess **>(const_cast<char *>(body(NULL))); Watcher *watcher = process->watcher; assert(watchers.find(watcher) != watchers.end()); watchers.erase(watcher); send(from(), OK); break; } case LOOKUP_PROCESS: { Watcher *watcher = *reinterpret_cast<Watcher **>(const_cast<char *>(body(NULL))); if (watchers.find(watcher) != watchers.end()) { WatcherProcess *process = watchers[watcher]; send(from(), OK, reinterpret_cast<char *>(&process), sizeof(process)); } else { send(from(), ERROR); } break; } case LOOKUP_PID: { Watcher *watcher = *reinterpret_cast<Watcher **>(const_cast<char *>(body(NULL))); if (watchers.find(watcher) != watchers.end()) { WatcherProcess *process = watchers[watcher]; const PID &pid = process->self(); send(from(), OK, reinterpret_cast<const char *>(&pid), sizeof(pid)); } else { send(from(), ERROR); } break; } } } }