X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=main.cpp;h=278c51d67d946cb540a66fa802b20d8678f96f68;hb=7c55e615d7b03fc92b93701ddc3a5d2e6b7087d0;hp=e270141e62941f6c33202d34f15786d62fca9200;hpb=ac50b1104f5f525e838f80fa6dc50be13f7d35b6;p=cubemap diff --git a/main.cpp b/main.cpp index e270141..278c51d 100644 --- a/main.cpp +++ b/main.cpp @@ -153,6 +153,49 @@ MarkPool *parse_mark_pool(map, MarkPool *> *mark_pools, const str return get_mark_pool(mark_pools, from, to); } + +// Find all streams in the configuration file, and create inputs for them. +vector create_inputs(const vector &config, + map *deserialized_inputs) +{ + vector inputs; + for (unsigned i = 0; i < config.size(); ++i) { + if (config[i].keyword != "stream") { + continue; + } + assert(config[i].arguments.size() == 1); + string stream_id = config[i].arguments[0]; + + map::const_iterator src_it = + config[i].parameters.find("src"); + if (src_it == config[i].parameters.end()) { + fprintf(stderr, "WARNING: stream '%s' has no src= attribute, clients will not get any data.\n", + stream_id.c_str()); + continue; + } + + string src = src_it->second; + Input *input = NULL; + map::iterator deserialized_input_it = + deserialized_inputs->find(stream_id); + if (deserialized_input_it != deserialized_inputs->end()) { + input = deserialized_input_it->second; + if (input->get_url() != src) { + fprintf(stderr, "INFO: Stream '%s' has changed URL from '%s' to '%s', restarting input.\n", + stream_id.c_str(), input->get_url().c_str(), src.c_str()); + delete input; + input = NULL; + } + deserialized_inputs->erase(deserialized_input_it); + } + if (input == NULL) { + input = new Input(stream_id, src); + } + input->run(); + inputs.push_back(input); + } + return inputs; +} int main(int argc, char **argv) { @@ -258,49 +301,16 @@ int main(int argc, char **argv) if (stats_interval != -1 && stats_file.empty()) { fprintf(stderr, "WARNING: 'stats_interval' given, but no 'stats_file'. No statistics will be written.\n"); } - StatsThread *stats_thread = NULL; - if (!stats_file.empty()) { - stats_thread = new StatsThread(stats_file, stats_interval); - } servers->run(); - pthread_t acceptor_thread; - pthread_create(&acceptor_thread, NULL, acceptor_thread_run, reinterpret_cast(server_sock)); + AcceptorThread acceptor_thread(server_sock); + acceptor_thread.run(); - // Find all streams in the configuration file, and create inputs for them. - vector inputs; - for (unsigned i = 0; i < config.size(); ++i) { - if (config[i].keyword != "stream") { - continue; - } - assert(config[i].arguments.size() == 1); - string stream_id = config[i].arguments[0]; - - if (config[i].parameters.count("src") == 0) { - fprintf(stderr, "WARNING: stream '%s' has no src= attribute, clients will not get any data.\n", - stream_id.c_str()); - continue; - } - - string src = config[i].parameters["src"]; - Input *input = NULL; - if (deserialized_inputs.count(stream_id) != 0) { - input = deserialized_inputs[stream_id]; - if (input->get_url() != src) { - fprintf(stderr, "INFO: Stream '%s' has changed URL from '%s' to '%s', restarting input.\n", - stream_id.c_str(), input->get_url().c_str(), src.c_str()); - delete input; - input = NULL; - } - deserialized_inputs.erase(stream_id); - } - if (input == NULL) { - input = new Input(stream_id, src); - } - input->run(); - inputs.push_back(input); - } + vector inputs = create_inputs(config, &deserialized_inputs); + + // All deserialized inputs should now have been taken care of, one way or the other. + assert(deserialized_inputs.empty()); if (is_reexec) { // Put back the existing clients. It doesn't matter which server we @@ -311,11 +321,10 @@ int main(int argc, char **argv) } } - // All deserialized inputs should now have been taken care of, one way or the other. - assert(deserialized_inputs.empty()); - // Start writing statistics. - if (stats_thread != NULL) { + StatsThread *stats_thread = NULL; + if (!stats_file.empty()) { + stats_thread = new StatsThread(stats_file, stats_interval); stats_thread->run(); } @@ -342,11 +351,7 @@ int main(int argc, char **argv) if (stats_thread != NULL) { stats_thread->stop(); } - pthread_kill(acceptor_thread, SIGHUP); - if (pthread_join(acceptor_thread, NULL) == -1) { - perror("pthread_join"); - exit(1); - } + acceptor_thread.stop(); CubemapStateProto state; state.set_serialize_start_sec(serialize_start.tv_sec);