int main(int argc, char **argv) { std::string usage("Encode packets with Random Linear Network Coding\n"); FLAGS_alsologtostderr = true; FLAGS_colorlogtostderr = true; google::HandleCommandLineCompletions(); google::SetUsageMessage(usage); google::ParseCommandLineFlags(&argc, &argv, true); google::InitGoogleLogging(argv[0]); google::InstallFailureSignalHandler(); signal(SIGINT, sigint); signal(SIGTERM, sigint); counters_base::pointer c(new counters_base); ctrl_tracker::pointer ack_tracker(new ctrl_tracker(FLAGS_ack_timeout*1000)); ctrl_tracker::pointer req_tracker(new ctrl_tracker(FLAGS_req_timeout*1000)); io::pointer i(new io); encoder_map::pointer enc_map(new encoder_map); decoder_map::pointer dec_map(new decoder_map); enc_map->set_io(i); enc_map->counters(c); enc_map->init(FLAGS_encoders); dec_map->set_io(i); dec_map->counters(c); dec_map->ctrl_trackers(ctrl_tracker_api::ACK, ack_tracker); dec_map->ctrl_trackers(ctrl_tracker_api::REQ, req_tracker); i->counters(c); i->set_encoder_map(enc_map); i->set_decoder_map(dec_map); i->netlink_open(); i->netlink_register(); i->start(); std::chrono::milliseconds interval(100); while (running) std::this_thread::sleep_for(interval); std::cout << "ack avg: " << ack_tracker->get_rtt() << std::endl; std::cout << "req avg: " << req_tracker->get_rtt() << std::endl; c->print(); i->stop(); enc_map.reset(); dec_map.reset(); i.reset(); c.reset(); return 0; }
int enc_json(Encoder* enc, ERL_NIF_TERM term) { int ival; unsigned int uival; long lval; unsigned long ulval; double dval; ERL_NIF_TERM head; ERL_NIF_TERM tail; int arity; const ERL_NIF_TERM* tuple; if(enif_is_atom(enc->env, term)) { return enc_atom(enc, term); } if(enif_is_binary(enc->env, term)) { return enc_binary(enc, term); } if(enif_get_int(enc->env, term, &ival)) { if(yajl_gen_integer(enc->handle, ival) != yajl_gen_status_ok) { enc->error = enif_make_atom(enc->env, "bad_integer"); return ERROR; } return OK; } if(enif_get_uint(enc->env, term, &uival)) { if(yajl_gen_integer(enc->handle, uival) != yajl_gen_status_ok) { enc->error = enif_make_atom(enc->env, "bad_unsigned_integer"); return ERROR; } return OK; } if(enif_get_long(enc->env, term, &lval)) { if(yajl_gen_integer(enc->handle, lval) != yajl_gen_status_ok) { enc->error = enif_make_atom(enc->env, "bad_long"); return ERROR; } return OK; } if(enif_get_ulong(enc->env, term, &ulval)) { if(yajl_gen_integer(enc->handle, ulval) != yajl_gen_status_ok) { enc->error = enif_make_atom(enc->env, "bad_unsigned_long"); return ERROR; } return OK; } if(enif_get_double(enc->env, term, &dval)) { if(yajl_gen_double(enc->handle, dval) != yajl_gen_status_ok) { enc->error = enif_make_atom(enc->env, "bad_double"); return ERROR; } return OK; } if(enif_is_empty_list(enc->env, term)) { if(yajl_gen_array_open(enc->handle) != yajl_gen_status_ok) { enc->error = enif_make_atom(enc->env, "failed_to_open_empty_list"); return ERROR; } if(yajl_gen_array_close(enc->handle) != yajl_gen_status_ok) { enc->error = enif_make_atom(enc->env, "failed_to_close_empty_list"); return ERROR; } return OK; } if(enif_get_list_cell(enc->env, term, &head, &tail)) { return enc_array(enc, head, tail); } if(enif_get_tuple(enc->env, term, &arity, &tuple)) { if(arity == 1) { if(enif_is_empty_list(enc->env, tuple[0])) { if(yajl_gen_map_open(enc->handle) != yajl_gen_status_ok) { enc->error = enif_make_atom(enc->env, "failed_to_open_empty_map"); return ERROR; } if(yajl_gen_map_close(enc->handle) != yajl_gen_status_ok) { enc->error = enif_make_atom(enc->env, "failed_to_close_empty_map"); return ERROR; } return OK; } else if(enif_get_list_cell(enc->env, tuple[0], &head, &tail)) { return enc_map(enc, head, tail); } } } enc->error = enif_make_tuple(enc->env, 2, enif_make_atom(enc->env, "badarg"), term ); return ERROR; }