aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/or/hibernate.c44
1 files changed, 29 insertions, 15 deletions
diff --git a/src/or/hibernate.c b/src/or/hibernate.c
index 22f6e6f0fc..7dcdaeb0aa 100644
--- a/src/or/hibernate.c
+++ b/src/or/hibernate.c
@@ -25,22 +25,31 @@ hibernating, phase 2:
#include "or.h"
-/** DOCDOC */
-#define HIBERNATE_STATE_LIVE 1
-/** DOCDOC */
-#define HIBERNATE_STATE_EXITING 2
-/** DOCDOC */
-#define HIBERNATE_STATE_LOWBANDWIDTH 3
-/** DOCDOC */
-#define HIBERNATE_STATE_DORMANT 4
+/** Possible values of hibernate_state */
+typedef enum {
+ /** We are running normally. */
+ HIBERNATE_STATE_LIVE=1,
+ /** We're trying to shut down cleanly, and we'll kill all active connections
+ * at shutdown_time. */
+ HIBERNATE_STATE_EXITING=2,
+ /** We're running low on allocated bandwidth for this period, so we won't
+ * accept any new connections. */
+ HIBERNATE_STATE_LOWBANDWIDTH=3,
+ /** We are hibernating, and we won't wake up till there's more bandwidth to
+ * use. */
+ HIBERNATE_STATE_DORMANT=4
+} hibernate_state_t;
extern long stats_n_seconds_working; /* published uptime */
/** DOCDOC */
-static int hibernate_state = HIBERNATE_STATE_LIVE;
+static hibernate_state_t hibernate_state = HIBERNATE_STATE_LIVE;
/** If are hibernating, when do we plan to wake up? Set to 0 if we
* aren't hibernating. */
static time_t hibernate_end_time = 0;
+/** If we are shutting down, when do we plan finally exit? Set to 0 if
+ * we aren't shutting down. */
+static time_t shutdown_time = 0;
/** DOCDOC */
typedef enum {
@@ -49,9 +58,9 @@ typedef enum {
/* Fields for accounting logic. Accounting overview:
*
- * Accounting is designed to ensure that no more than N bytes are sent
- * in either direction over a given interval (currently, one month,
- * starting at 0:00 GMT an arbitrary day within the month). We could
+ * Accounting is designed to ensure that no more than N bytes are sent in
+ * either direction over a given interval (currently, one month, one week, or
+ * one day) We could
* try to do this by choking our bandwidth to a trickle, but that
* would make our streams useless. Instead, we estimate what our
* bandwidth usage will be, and guess how long we'll be able to
@@ -773,7 +782,7 @@ hibernate_begin(int new_state, time_t now)
if (new_state == HIBERNATE_STATE_EXITING) {
log_notice(LD_GENERAL,"Interrupt: will shut down in %d seconds. Interrupt "
"again to exit now.", options->ShutdownWaitLength);
- hibernate_end_time = time(NULL) + options->ShutdownWaitLength;
+ shutdown_time = time(NULL) + options->ShutdownWaitLength;
} else { /* soft limit reached */
hibernate_end_time = interval_end_time;
}
@@ -849,6 +858,11 @@ hibernate_go_dormant(time_t now)
connection_mark_for_close(conn);
}
+ if (now < interval_wakeup_time)
+ hibernate_end_time = interval_wakeup_time;
+ else
+ hibernate_end_time = interval_end_time;
+
accounting_record_bandwidth_usage(now, get_or_state());
or_state_mark_dirty(get_or_state(),
@@ -898,8 +912,8 @@ consider_hibernation(time_t now)
/* If we're in 'exiting' mode, then we just shut down after the interval
* elapses. */
if (hibernate_state == HIBERNATE_STATE_EXITING) {
- tor_assert(hibernate_end_time);
- if (hibernate_end_time <= now) {
+ tor_assert(shutdown_time);
+ if (shutdown_time <= now) {
log_notice(LD_GENERAL, "Clean shutdown finished. Exiting.");
tor_cleanup();
exit(0);