示例#1
0
scoped_actor::scoped_actor(actor_system& sys, bool hide) : context_(&sys) {
  actor_config cfg{&context_};
  self_ = make_actor<impl, strong_actor_ptr>(sys.next_actor_id(), sys.node(),
                                             &sys, cfg);
  if (!hide)
    prev_ = CAF_SET_AID(self_->id());
  CAF_LOG_TRACE(CAF_ARG(hide));
  if (!hide)
    ptr()->register_at_system();
}
示例#2
0
void caf_main(actor_system& system) {
  // create one cell for each implementation
  auto cell1 = system.spawn(type_checked_cell);
  auto cell2 = system.spawn(unchecked_cell);
  auto f = make_function_view(cell1);
  cout << "cell value: " << f(get_atom::value) << endl;
  f(put_atom::value, 20);
  cout << "cell value (after setting to 20): " << f(get_atom::value) << endl;
  // get an unchecked cell and send it some garbage
  anon_send(cell2, "hello there!");
}
示例#3
0
void actor_ostream::redirect_all(actor_system& sys, std::string fn, int flags) {
  auto pr = sys.scheduler().printer();
  pr->enqueue(make_mailbox_element(nullptr, message_id::make(), {},
                                    redirect_atom::value,
                                    std::move(fn), flags),
              nullptr);
}
示例#4
0
expected<ActorHandle> remote_actor(actor_system& sys, std::string host,
                                   uint16_t port) {
  detail::type_list<ActorHandle> tk;
  auto res = remote_actor(sys, sys.message_types(tk), std::move(host), port);
  if (res)
    return actor_cast<ActorHandle>(std::move(*res));
  return std::move(res.error());
}
示例#5
0
/// Establish a new connection to the actor at `host` on given `port`.
/// @param host Valid hostname or IP address.
/// @param port TCP port.
/// @returns An `actor` to the proxy instance representing
///          a remote actor or an `error`.
expected<strong_actor_ptr> remote_actor(actor_system& sys,
                                        const std::set<std::string>& mpi,
                                        std::string host, uint16_t port) {
  CAF_LOG_TRACE(CAF_ARG(mpi) << CAF_ARG(host) << CAF_ARG(port));
  expected<strong_actor_ptr> res{strong_actor_ptr{nullptr}};
  auto f = make_function_view(sys.openssl_manager().actor_handle());
  auto x = f(connect_atom::value, std::move(host), port);
  if (!x)
    return std::move(x.error());
  auto& tup = *x;
  auto& ptr = get<1>(tup);
  if (!ptr)
    return sec::no_actor_published_at_port;
  auto& found_mpi = get<2>(tup);
  if (sys.assignable(found_mpi, mpi))
    return std::move(ptr);
  return sec::unexpected_actor_messaging_interface;
}
示例#6
0
void caf_main(actor_system& sys, const config& cfg) {
  auto& mm = sys.middleman();
  auto self =sys.spawn(math);
  if (cfg.server) {
    auto p = mm.publish(self, cfg.port);
    if (!p)
      cerr << "unable to publish actor: " << sys.render(p.error()) << "\n";
    else
      cout << "math actor published at port " << *p << "\n";
  } else {
    auto x = mm.remote_actor(cfg.host, cfg.port);
    if (!x)
      cerr << "unable to connect to server: " << sys.render(x.error()) << "\n";
    else {
	//self->send(*x,1);
      auto f = make_function_view(*x);
      cout << "f('add', 4, 2) = " << f(add_atom::value, 4, 2) << "\n"
           << "f('sub', 4, 2) = " << f(sub_atom::value, 4, 2) << "\n"
           << "f('mul', 4, 2) = " << f(mul_atom::value, 4, 2) << "\n"
           << "f('div', 4, 2) = " << f(div_atom::value, 4, 2) << "\n"
           << "f('div', 1, 0) = " << f(div_atom::value, 1, 0) << "\n";
    }
  }
}
middleman_actor make_middleman_actor(actor_system& sys, actor db) {
  return sys.config().middleman_detach_utility_actors
             ? sys.spawn<middleman_actor_impl, detached + hidden>(std::move(db))
             : sys.spawn<middleman_actor_impl, hidden>(std::move(db));
}
示例#8
0
deserializer::deserializer(actor_system& x) : super(x.dummy_execution_unit()) {
  // nop
}
示例#9
0
/// Tries to connect to given node.
/// @experimental
inline expected<node_id> connect(actor_system& sys, std::string host,
                                 uint16_t port) {
  return sys.middleman().connect(std::move(host), port);
}