+ servers = new ServerPool(config.num_servers);
+
+ // Find all the streams that are to be deleted.
+ set<string> deleted_urls;
+ find_deleted_streams(config, &deleted_urls);
+
+ CubemapStateProto loaded_state;
+ timespec serialize_start;
+ set<string> deserialized_urls;
+ map<AcceptorConfig, Acceptor *, AcceptorConfigCompare> deserialized_acceptors;
+ multimap<InputKey, InputWithRefcount> inputs; // multimap due to older versions without deduplication.
+ if (state_fd != -1) {
+ log(INFO, "Deserializing state from previous process...");
+ string serialized;
+ if (!read_tempfile_and_close(state_fd, &serialized)) {
+ exit(1);
+ }
+ if (!loaded_state.ParseFromString(serialized)) {
+ log(ERROR, "Failed deserialization of state.");
+ exit(1);
+ }
+
+ serialize_start.tv_sec = loaded_state.serialize_start_sec();
+ serialize_start.tv_nsec = loaded_state.serialize_start_usec() * 1000ull;
+
+ // Deserialize the streams.
+ map<string, string> stream_headers_for_url; // See below.
+ for (const StreamProto &stream : loaded_state.streams()) {
+ if (deleted_urls.count(stream.url()) != 0) {
+ // Delete the stream backlogs.
+ for (const int fd : stream.data_fds()) {
+ safe_close(fd);
+ }
+ } else {
+ vector<int> data_fds;
+ for (const int fd : stream.data_fds()) {
+ data_fds.push_back(fd);
+ }
+
+ servers->add_stream_from_serialized(stream, data_fds);
+ deserialized_urls.insert(stream.url());
+
+ stream_headers_for_url.insert(make_pair(stream.url(), stream.stream_header()));
+ }
+ }