[tor-commits] [tor/master] Avoid frequent strcmp() calls for AccountingRule

nickm at torproject.org nickm at torproject.org
Mon Sep 29 13:18:07 UTC 2014


commit 4903ab1caaf0b2631e6091b58b31eaff0c9f8424
Author: Nick Mathewson <nickm at torproject.org>
Date:   Tue Sep 23 08:46:35 2014 -0400

    Avoid frequent strcmp() calls for AccountingRule
    
    Generally, we don't like to parse the same thing over and over; it's
    best IMO to do it once at the start of the code.
---
 src/or/config.c            |   14 ++++++++++----
 src/or/hibernate.c         |    9 +++++----
 src/or/or.h                |    9 +++++----
 src/or/router.c            |    2 +-
 src/or/status.c            |    3 +--
 src/test/test_accounting.c |    4 ++--
 6 files changed, 24 insertions(+), 17 deletions(-)

diff --git a/src/or/config.c b/src/or/config.c
index c7c6154..8035afb 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -126,7 +126,7 @@ static config_abbrev_t option_abbrevs_[] = {
  */
 static config_var_t option_vars_[] = {
   V(AccountingMax,               MEMUNIT,  "0 bytes"),
-  V(AccountingRule,              STRING,  "max"),
+  VAR("AccountingRule",          STRING,   AccountingRule_option,  "max"),
   V(AccountingStart,             STRING,   NULL),
   V(Address,                     STRING,   NULL),
   V(AllowDotExit,                BOOL,     "0"),
@@ -3109,9 +3109,15 @@ options_validate(or_options_t *old_options, or_options_t *options,
                "risky: they will all turn off at the same time, which may "
                "alert observers that they are being run by the same party.");
     }
-    if (options->AccountingRule &&
-      strcmp(options->AccountingRule, "sum") != 0 &&
-      strcmp(options->AccountingRule, "max") != 0)
+  }
+
+  options->AccountingRule = ACCT_MAX;
+  if (options->AccountingRule_option) {
+    if (!strcmp(options->AccountingRule_option, "sum"))
+      options->AccountingRule = ACCT_SUM;
+    else if (!strcmp(options->AccountingRule_option, "max"))
+      options->AccountingRule = ACCT_MAX;
+    else
       REJECT("AccountingRule must be 'sum' or 'max'");
   }
 
diff --git a/src/or/hibernate.c b/src/or/hibernate.c
index 6978f47..b3761cf 100644
--- a/src/or/hibernate.c
+++ b/src/or/hibernate.c
@@ -415,9 +415,10 @@ configure_accounting(time_t now)
 static uint64_t
 get_accounting_bytes(void)
 {
-  if (strcmp(get_options()->AccountingRule, "sum") == 0)
+  if (get_options()->AccountingRule == ACCT_SUM)
     return n_bytes_read_in_interval+n_bytes_written_in_interval;
-  return MAX(n_bytes_read_in_interval, n_bytes_written_in_interval);
+  else
+    return MAX(n_bytes_read_in_interval, n_bytes_written_in_interval);
 }
 
 /** Set expected_bandwidth_usage based on how much we sent/received
@@ -434,7 +435,7 @@ update_expected_bandwidth(void)
   /* max_configured is the larger of bytes read and bytes written
    * If we are accounting based on sum, worst case is both are
    * at max, doubling the expected sum of bandwidth */
-  if (strcmp(get_options()->AccountingRule, "sum") == 0)
+  if (get_options()->AccountingRule == ACCT_SUM)
     max_configured *= 2;
 
 #define MIN_TIME_FOR_MEASUREMENT (1800)
@@ -1014,7 +1015,7 @@ getinfo_helper_accounting(control_connection_t *conn,
                  U64_PRINTF_ARG(n_bytes_written_in_interval));
   } else if (!strcmp(question, "accounting/bytes-left")) {
     uint64_t limit = get_options()->AccountingMax;
-    if (strcmp(get_options()->AccountingRule, "sum") == 0) {
+    if (get_options()->AccountingRule == ACCT_SUM) {
       uint64_t total_left = 0;
       uint64_t total_bytes = get_accounting_bytes();
       if (total_bytes < limit)
diff --git a/src/or/or.h b/src/or/or.h
index 20cfa5b..54cee46 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -3775,10 +3775,11 @@ typedef struct {
   uint64_t AccountingMax; /**< How many bytes do we allow per accounting
                            * interval before hibernation?  0 for "never
                            * hibernate." */
-  char *AccountingRule; /**< How do we determine when our AccountingMax
-                         * has been reached?
-                         * "max" for when in or out reaches AccountingMax
-                         * "sum for when in plus out reaches AccountingMax */
+  /** How do we determine when our AccountingMax has been reached?
+   * "max" for when in or out reaches AccountingMax
+   * "sum for when in plus out reaches AccountingMax */
+  char *AccountingRule_option;
+  enum { ACCT_MAX, ACCT_SUM } AccountingRule;
 
   /** Base64-encoded hash of accepted passwords for the control system. */
   config_line_t *HashedControlPassword;
diff --git a/src/or/router.c b/src/or/router.c
index 96d16bb..dbe985a 100644
--- a/src/or/router.c
+++ b/src/or/router.c
@@ -1093,7 +1093,7 @@ decide_to_advertise_dirport(const or_options_t *options, uint16_t dir_port)
                          interval_length);
 
     acc_bytes = options->AccountingMax;
-    if (strcmp(options->AccountingRule, "sum") == 0)
+    if (get_options()->AccountingRule == ACCT_SUM)
       acc_bytes /= 2;
     if (effective_bw >=
         acc_bytes / interval_length) {
diff --git a/src/or/status.c b/src/or/status.c
index 4158df5..daae1d7 100644
--- a/src/or/status.c
+++ b/src/or/status.c
@@ -145,13 +145,12 @@ log_accounting(const time_t now, const or_options_t *options)
   or_state_t *state = get_or_state();
   char *acc_rcvd = bytes_to_usage(state->AccountingBytesReadInInterval);
   char *acc_sent = bytes_to_usage(state->AccountingBytesWrittenInInterval);
-  const char *acc_rule = options->AccountingRule;
   uint64_t acc_bytes = options->AccountingMax;
   char *acc_max;
   time_t interval_end = accounting_get_end_time();
   char end_buf[ISO_TIME_LEN + 1];
   char *remaining = NULL;
-  if (strcmp(acc_rule, "sum") == 0)
+  if (options->AccountingRule == ACCT_SUM)
     acc_bytes *= 2;
   acc_max = bytes_to_usage(acc_bytes);
   format_local_iso_time(end_buf, interval_end);
diff --git a/src/test/test_accounting.c b/src/test/test_accounting.c
index a1a2ec6..25908e9 100644
--- a/src/test/test_accounting.c
+++ b/src/test/test_accounting.c
@@ -34,7 +34,7 @@ test_accounting_limits(void *arg)
   or_state = or_state_new();
 
   options->AccountingMax = 100;
-  options->AccountingRule = tor_strdup("max");
+  options->AccountingRule = ACCT_MAX;
 
   tor_assert(accounting_is_enabled(options));
   configure_accounting(fake_time);
@@ -50,7 +50,7 @@ test_accounting_limits(void *arg)
   tor_assert(we_are_hibernating() == 1);
 
   options->AccountingMax = 200;
-  options->AccountingRule = tor_strdup("sum");
+  options->AccountingRule = ACCT_SUM;
 
   accounting_add_bytes(0, 10, 1);
   fake_time += 1;





More information about the tor-commits mailing list