示例#1
0
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;
}
示例#2
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;
 }
示例#3
0
文件: plugin.cpp 项目: ybouret/yocto4
 plugin:: plugin(const string &id,
                 lexer        &lxr,
                 const char   *expr) :
 scanner(id,lxr.line),
 trigger(expr)
 {
     link_to(lxr);
 }
示例#4
0
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);
}
示例#5
0
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);
}
示例#6
0
文件: knxd_args.cpp 项目: knxd/knxd
 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);
   }
示例#7
0
/** 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());
 }