int main(int argc, char *argv[]) { announce<check>(); announce<order>(); announce<order_for_booker>(); announce<task_for_master>(); auto _installer = spawn<installer, detached>(); auto _master = spawn<master, detached>(_installer); auto _booker = spawn<booker, detached>(6.f); auto _office_manager = spawn<office_manager, detached>(_master, _booker); auto _client = spawn<client, detached>(110.f, 5.f, _office_manager); _installer->link_to(_master); _master->link_to(_office_manager); _booker->link_to(_office_manager); _office_manager->link_to(_client); send(_client, atom("start")); await_all_others_done(); shutdown(); cout << "exit" << endl; return 0; }
inline ActorHandle eval_opts(spawn_options opts, ActorHandle res) { if (has_monitor_flag(opts)) monitor(res->address()); if (has_link_flag(opts)) link_to(res->address()); return res; }
plugin:: plugin(const string &id, lexer &lxr, const char *expr) : scanner(id,lxr.line), trigger(expr) { link_to(lxr); }
void CLink::change_link( SignalArgs & args ) { SignalOptions options( args ); SignalFrame reply = args.create_reply(); std::string path = options.value<std::string>("target_path"); Component::Ptr target = m_root.lock()->access_component_ptr(path); link_to (target); reply.map("options").set_option("target_path", path); }
void Link::change_link( SignalArgs & args ) { SignalOptions options( args ); SignalFrame reply = args.create_reply(); std::string path = options.value<std::string>("target_path"); Handle<Component> target = access_component(path); link_to (*target); reply.map("options").set_option("target_path", class_name<std::string>(), path); }
void do_filter(const char *name) { if (more_args.size() > 0) { link_to(name); ITER(i, more_args) (*ini[link])[i->first] = i->second; (*ini[link])["filter"] = name; more_args.clear(); filters.push_back(link); } else filters.push_back(name); }
/** parses and stores an option */ static error_t parse_opt (int key, char *arg, struct argp_state *state) { struct arguments *arguments = (struct arguments *) state->input; switch (key) { case 'T': arguments->stack("tunnel"); (*ini["server"])["tunnel"] = "tunnel"; arguments->want_server = true; break; case 'R': arguments->stack("router"); (*ini["server"])["router"] = "router"; arguments->want_server = true; // (*ini["router"])["driver"] = "ets-multicast"; break; case 'D': arguments->stack("server"); // to allow for -t255 -DTRS arguments->want_server = true; (*ini["server"])["discover"] = "true"; break; case OPT_SINGLE_PORT: (*ini["server"])["multi-port"] = "false"; break; case OPT_MULTI_PORT: (*ini["server"])["multi-port"] = "true"; break; case 'I': (*ini["server"])["interface"] = arg; break; case 'S': { if (arguments->filters.size()) die("Use filters in front of -R or -T, not -S"); ADD((*ini["main"])["connections"], "server"); (*ini["server"])["server"] = "ets_router"; arguments->want_server = false; // (*ini["server"])["driver"] = "ets-link"; const char *serverip; const char *name = arguments->servername.c_str(); std::string tracename; int port = 0; char *a = strdup (OPT_ARG(arg, state, "")); char *b = strchr (a, ':'); if (b) { *b++ = 0; if (atoi (b) > 0) (*ini["server"])["port"] = b; } if (*a) (*ini["server"])["multicast-address"] = a; if (!name || !*name) { name = "knxd"; tracename = "mcast"; } else { tracename = "mcast:"; tracename += name; } (*ini["debug-server"])["name"] = tracename; (*ini["server"])["debug"] = "debug-server"; arguments->stack("server"); break; } case 'n': if (*arg == '=') arg++; if(strlen(arg) >= 30) die("Server name must be shorter than 30 bytes"); (*ini["main"])["name"] = arg; break; case 'u': { if (arguments->want_server) die("You need -S after -D/-T/-R"); link_to("unix"); ADD((*ini["main"])["connections"], link); (*ini[link])["server"] = "knxd_unix"; // (*ini[link])["driver"] = "knx-link"; const char *name = OPT_ARG(arg,state,NULL); if (name) { (*ini[link])["path"] = name; (*ini[link])["systemd-ignore"] = "false"; } else (*ini[link])["systemd-ignore"] = "true"; arguments->stack(link); } break; case 'i': { if (arguments->want_server) die("You need -S after -D/-T/-R"); link_to("tcp"); ADD((*ini["main"])["connections"], link); (*ini[link])["server"] = "knxd_tcp"; // (*ini[link])["driver"] = "knx-link"; const char *port = OPT_ARG(arg,state,""); if (*port && atoi(port) > 0) { (*ini[link])["port"] = port; (*ini[link])["systemd-ignore"] = "false"; } else (*ini[link])["systemd-ignore"] = "true"; arguments->stack(link); } break; case 't': if (arg) { char *x; unsigned long level = strtoul(arg, &x, 0); if (*x) die ("Trace level: '%s' is not a number", arg); arguments->tracelevel = level; } else arguments->tracelevel = -1; break; case OPT_NO_TIMESTAMP: arguments->no_timestamps = true; break; case 'f': arguments->errorlevel = (arg ? atoi (arg) : 0); break; case 'e': if (arguments->l2opts.flags || arguments->l2opts.send_delay) die("You cannot use flags globally."); arguments->stack("main"); readaddr (arg); break; case 'E': readaddrblock (arg); break; case 'p': (*ini["main"])["pidfile"] = arg; break; case 'd': { const char *arg = OPT_ARG(arg,state,NULL); (*ini["main"])["background"] = "true"; if (arg) (*ini["main"])["logfile"] = arg; } break; case 'c': if (arguments->l2opts.flags || arguments->l2opts.send_delay) die("You cannot apply flags to the group cache."); link_to("cache"); (*ini["main"])["cache"] = link; arguments->stack(link); break; case OPT_FORCE_BROADCAST: (*ini["main"])["force-broadcast"] = "true"; break; case OPT_STOP_NOW: (*ini["main"])["stop-after-setup"] = "true"; break; case OPT_BACK_TUNNEL_NOQUEUE: // obsolete fprintf(stderr,"The option '--no-tunnel-client-queuing' is obsolete.\n"); fprintf(stderr,"Please use '--send-delay=30'."); arguments->l2opts.send_delay = 30; // msec break; case OPT_BACK_EMI_NOQUEUE: // obsolete fprintf(stderr,"The option '--no-emi-send-queuing' is obsolete.\n"); fprintf(stderr,"Please use '--send-delay=500'."); arguments->l2opts.send_delay = 500; // msec break; case OPT_BACK_SEND_DELAY: arguments->l2opts.send_delay = atoi(OPT_ARG(arg,state,"30")); break; case OPT_BACK_TPUARTS_ACKGROUP: arguments->l2opts.flags |= FLAG_B_TPUARTS_ACKGROUP; break; case OPT_BACK_TPUARTS_ACKINDIVIDUAL: arguments->l2opts.flags |= FLAG_B_TPUARTS_ACKINDIVIDUAL; break; case OPT_BACK_TPUARTS_DISCH_RESET: arguments->l2opts.flags |= FLAG_B_TPUARTS_DISCH_RESET; break; case 'N': arguments->l2opts.flags |= FLAG_B_NO_MONITOR; break; case ARGP_KEY_ARG: case 'b': { if (arguments->want_server) die("You need -S after -D/-T/-R"); link_to(arg); ADD((*ini["main"])["connections"], link); char *ap = strchr(arg,':'); if (ap) *ap++ = '\0'; driver_args(arg,ap); arguments->stack(link); break; } case 'B': arguments->do_filter(arg); break; case 'A': arguments->add_arg(arg); break; case ARGP_KEY_FINI: if (arguments->want_server) die("You need -S after -D/-T/-R"); #ifdef HAVE_SYSTEMD { (*ini["main"])["systemd"] = "systemd"; // (*ini["systemd"])["server"] = "knxd_systemd"; // (*ini["systemd"])["driver"] = "knx-link"; arguments->stack("systemd"); } #endif if (arguments->filters.size() || arguments->more_args.size()) die ("You need to use filters and arguments in front of the affected backend"); if (arguments->l2opts.flags || arguments->l2opts.send_delay) die ("You provided flags after specifying an interface."); break; default: return ARGP_ERR_UNKNOWN; } return 0; }
void link_to(const ActorHandle& whom) { link_to(whom.address()); }