X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=main.cpp;h=1773af3bff7e9341ef89e7ae39dd9e41813f1f88;hb=9f49ea1bf5d45f57c351601a80d543056185924c;hp=3bf660a9a1c06d44d6cf785f9d18cfbb9e2f6e18;hpb=019b96a9cc6fa2902690e98a2aa033517efef3ed;p=cubemap diff --git a/main.cpp b/main.cpp index 3bf660a..1773af3 100644 --- a/main.cpp +++ b/main.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -24,9 +25,6 @@ #include "input.h" #include "state.pb.h" -#define STREAM_ID "stream" -#define STREAM_URL "http://gruessi.zrh.sesse.net:4013/" - using namespace std; ServerPool *servers = NULL; @@ -93,7 +91,7 @@ void *acceptor_thread_run(void *arg) pfd.events = POLLIN; int nfds = poll(&pfd, 1, 50); - if (nfds == 0 || (nfds == -1 && errno == EAGAIN)) { + if (nfds == 0 || (nfds == -1 && errno == EINTR)) { continue; } if (nfds == -1) { @@ -186,7 +184,7 @@ sleep: int left_to_sleep = parms->stats_interval; do { left_to_sleep = sleep(left_to_sleep); - } while (left_to_sleep > 0); + } while (left_to_sleep > 0 && !hupped); } return NULL; } @@ -261,6 +259,9 @@ int main(int argc, char **argv) { fprintf(stderr, "\nCubemap starting.\n"); + struct timeval serialize_start; + bool is_reexec = false; + string config_filename = (argc == 1) ? "cubemap.config" : argv[1]; vector config = parse_config(config_filename); @@ -273,10 +274,15 @@ int main(int argc, char **argv) set deserialized_stream_ids; map deserialized_inputs; if (argc == 4 && strcmp(argv[2], "-state") == 0) { + is_reexec = true; + fprintf(stderr, "Deserializing state from previous process... "); int state_fd = atoi(argv[3]); CubemapStateProto loaded_state = read_tempfile(state_fd); + serialize_start.tv_sec = loaded_state.serialize_start_sec(); + serialize_start.tv_usec = loaded_state.serialize_start_usec(); + // Deserialize the streams. for (int i = 0; i < loaded_state.streams_size(); ++i) { servers->add_stream_from_serialized(loaded_state.streams(i)); @@ -404,24 +410,41 @@ int main(int argc, char **argv) } signal(SIGHUP, hup); + + struct timeval server_start; + gettimeofday(&server_start, NULL); + if (is_reexec) { + // Measure time from we started deserializing (below) to now, when basically everything + // is up and running. This is, in other words, a conservative estimate of how long our + // “glitch” period was, not counting of course reconnects if the configuration changed. + double glitch_time = server_start.tv_sec - serialize_start.tv_sec + + 1e-6 * (server_start.tv_usec - serialize_start.tv_usec); + fprintf(stderr, "Re-exec happened in approx. %.0f ms.\n", glitch_time * 1000.0); + } while (!hupped) { usleep(100000); } // OK, we've been HUPed. Time to shut down everything, serialize, and re-exec. + gettimeofday(&serialize_start, NULL); + if (!stats_file.empty()) { + pthread_kill(stats_thread, SIGHUP); if (pthread_join(stats_thread, NULL) == -1) { perror("pthread_join"); exit(1); } } + pthread_kill(acceptor_thread, SIGHUP); if (pthread_join(acceptor_thread, NULL) == -1) { perror("pthread_join"); exit(1); } CubemapStateProto state; + state.set_serialize_start_sec(serialize_start.tv_sec); + state.set_serialize_start_usec(serialize_start.tv_usec); state.set_server_sock(server_sock); state.set_port(port);