]> git.sesse.net Git - cubemap/commitdiff
Merge branch 'master' of /srv/git.sesse.net/www/cubemap
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Wed, 10 Apr 2013 21:36:59 +0000 (23:36 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Wed, 10 Apr 2013 21:36:59 +0000 (23:36 +0200)
1  2 
main.cpp

diff --combined main.cpp
index 4853518a4b25fd5917e1384a263b38b31a8824f9,dc52bdc29a17ab85f1ad1d5c8f23ef34a54c0604..e270141e62941f6c33202d34f15786d62fca9200
+++ b/main.cpp
@@@ -25,7 -25,6 +25,7 @@@
  #include "server.h"
  #include "serverpool.h"
  #include "input.h"
 +#include "stats.h"
  #include "state.pb.h"
  
  using namespace std;
@@@ -38,6 -37,68 +38,6 @@@ void hup(int ignored
        hupped = true;
  }
  
 -struct StatsThreadParameters {
 -      string stats_file;
 -      int stats_interval;
 -};
 -              
 -void *stats_thread_run(void *arg)
 -{
 -      const StatsThreadParameters *parms = reinterpret_cast<StatsThreadParameters *>(arg);
 -      while (!hupped) {
 -              int fd;
 -              FILE *fp;
 -              time_t now;
 -              vector<ClientStats> client_stats;
 -
 -              // Open a new, temporary file.
 -              char *filename = strdup((parms->stats_file + ".new.XXXXXX").c_str());
 -              fd = mkostemp(filename, O_WRONLY);
 -              if (fd == -1) {
 -                      perror(filename);
 -                      free(filename);
 -                      goto sleep;
 -              }
 -
 -              fp = fdopen(fd, "w");
 -              if (fp == NULL) {
 -                      perror("fdopen");
 -                      close(fd);
 -                      unlink(filename);
 -                      free(filename);
 -                      goto sleep;
 -              }
 -
 -              now = time(NULL);
 -              client_stats = servers->get_client_stats();
 -              for (size_t i = 0; i < client_stats.size(); ++i) {
 -                      fprintf(fp, "%s %s %d %llu\n",
 -                              client_stats[i].remote_addr.c_str(),
 -                              client_stats[i].stream_id.c_str(),
 -                              int(now - client_stats[i].connect_time),
 -                              (long long unsigned)(client_stats[i].bytes_sent));
 -              }
 -              if (fclose(fp) == EOF) {
 -                      perror("fclose");
 -                      unlink(filename);
 -                      free(filename);
 -                      goto sleep;
 -              }
 -              
 -              if (rename(filename, parms->stats_file.c_str()) == -1) {
 -                      perror("rename");
 -                      unlink(filename);
 -              }
 -
 -sleep:
 -              int left_to_sleep = parms->stats_interval;
 -              do {
 -                      left_to_sleep = sleep(left_to_sleep);
 -              } while (left_to_sleep > 0 && !hupped);
 -      }
 -      return NULL;
 -}
 -
  // Serialize the given state to a file descriptor, and return the (still open)
  // descriptor.
  int make_tempfile(const CubemapStateProto &state)
@@@ -130,6 -191,29 +130,29 @@@ MarkPool *get_mark_pool(map<pair<int, i
        mark_pools->insert(make_pair(mark_range, mark_pool));
        return mark_pool;
  }
+                       
+ MarkPool *parse_mark_pool(map<pair<int, int>, MarkPool *> *mark_pools, const string &mark_str)
+ {
+       size_t split = mark_str.find_first_of('-');
+       if (split == string::npos) {
+               fprintf(stderr, "WARNING: Invalid mark specification '%s' (expected 'X-Y'), ignoring.\n",
+                       mark_str.c_str());
+               return NULL;
+       }
+       string from_str(mark_str.begin(), mark_str.begin() + split);
+       string to_str(mark_str.begin() + split + 1, mark_str.end());
+       int from = atoi(from_str.c_str());
+       int to = atoi(to_str.c_str());
+       if (from <= 0 || from >= 65536 || to <= 0 || to >= 65536) {
+               fprintf(stderr, "WARNING: Mark pool range %d-%d is outside legal range [1,65536>, ignoring.\n",
+                       from, to);
+               return NULL;
+       }
+       return get_mark_pool(mark_pools, from, to);
+ }
  
  int main(int argc, char **argv)
  {
  
                // Set up marks, if so desired.
                if (config[i].parameters.count("mark")) {
-                       string mark_str = config[i].parameters["mark"];
-                       size_t split = mark_str.find_first_of('-');
-                       if (split == string::npos) {
-                               fprintf(stderr, "WARNING: Invalid mark specification '%s' (expected 'X-Y'), ignoring.\n",
-                                       mark_str.c_str());
-                               continue;
-                       }
-                       string from_str(mark_str.begin(), mark_str.begin() + split);
-                       string to_str(mark_str.begin() + split + 1, mark_str.end());
-                       int from = atoi(from_str.c_str());
-                       int to = atoi(to_str.c_str());
-                       if (from <= 0 || from >= 65536 || to <= 0 || to >= 65536) {
-                               fprintf(stderr, "WARNING: Mark pool range %d-%d is outside legal range [1,65536>, ignoring.\n",
-                                       from, to);
-                               continue;
-                       }
-                       MarkPool *mark_pool = get_mark_pool(&mark_pools, from, to);
+                       MarkPool *mark_pool = parse_mark_pool(&mark_pools, config[i].parameters["mark"]);
                        servers->set_mark_pool(stream_id, mark_pool);
                }
        }
        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();
  
        assert(deserialized_inputs.empty());
  
        // Start writing statistics.
 -      pthread_t stats_thread;
 -      StatsThreadParameters stats_parameters;  // Must live for as long as the stats thread does.
 -      if (!stats_file.empty()) {
 -              stats_parameters.stats_file = stats_file;
 -              stats_parameters.stats_interval = stats_interval;
 -              pthread_create(&stats_thread, NULL, stats_thread_run, &stats_parameters);
 +      if (stats_thread != NULL) {
 +              stats_thread->run();
        }
  
        signal(SIGHUP, hup);
        // 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);
 -              }
 +      if (stats_thread != NULL) {
 +              stats_thread->stop();
        }
        pthread_kill(acceptor_thread, SIGHUP);
        if (pthread_join(acceptor_thread, NULL) == -1) {