예제 #1
0
파일: zookeeper.cpp 프로젝트: benh/twesos
    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;
    }
예제 #2
0
  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;
  }
예제 #3
0
파일: zookeeper.cpp 프로젝트: benh/twesos
  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;
	}
      }
    }
  }