From f54186aa916326ad097c32fa02c4e85d6697fc39 Mon Sep 17 00:00:00 2001 From: Roger Dingledine Date: Sun, 20 Apr 2003 19:47:33 +0000 Subject: [PATCH] bugfix: refactor to always use circuit_remove this way we can always check if a new circ needs to be launched svn:r254 --- src/or/circuit.c | 19 ++++++++++--------- src/or/command.c | 18 +++++------------- 2 files changed, 15 insertions(+), 22 deletions(-) diff --git a/src/or/circuit.c b/src/or/circuit.c index 6b68df275a..fcfdedd587 100644 --- a/src/or/circuit.c +++ b/src/or/circuit.c @@ -522,8 +522,10 @@ void circuit_close(circuit_t *circ) { circuit_t *youngest=NULL; assert(circ); - if(options.APPort) + if(options.APPort) { youngest = circuit_get_newest_by_edge_type(EDGE_AP); + log(LOG_DEBUG,"circuit_close(): youngest %d, circ %d.",youngest,circ); + } circuit_remove(circ); for(conn=circ->n_conn; conn; conn=conn->next_topic) { connection_send_destroy(circ->n_aci, circ->n_conn); @@ -585,17 +587,13 @@ send_end: return; } + /* this connection speaks cells. We must close all the circuits on it. */ while((circ = circuit_get_by_conn(conn))) { - circuit_remove(circ); if(circ->n_conn == conn) /* it's closing in front of us */ - for(tmpconn=circ->p_conn; tmpconn; tmpconn=tmpconn->next_topic) { - connection_send_destroy(circ->p_aci, tmpconn); - } + circ->n_conn = NULL; if(circ->p_conn == conn) /* it's closing behind us */ - for(tmpconn=circ->n_conn; tmpconn; tmpconn=tmpconn->next_topic) { - connection_send_destroy(circ->n_aci, tmpconn); - } - circuit_free(circ); + circ->p_conn = NULL; + circuit_close(circ); } } @@ -644,6 +642,9 @@ void circuit_expire_unused_circuits(void) { void circuit_launch_new(int failure_status) { static int failures=0; + if(!options.APPort) /* we're not an application proxy. no need for circuits. */ + return; + if(failure_status == -1) { /* I was called because a circuit succeeded */ failures = 0; return; diff --git a/src/or/command.c b/src/or/command.c index 230a117c63..00a079e00d 100644 --- a/src/or/command.c +++ b/src/or/command.c @@ -272,19 +272,11 @@ void command_process_destroy_cell(cell_t *cell, connection_t *conn) { onion_pending_remove(circ); } - circuit_remove(circ); - - if(cell->aci == circ->p_aci) { /* the destroy came from behind */ - for(tmpconn = circ->n_conn; tmpconn; tmpconn=tmpconn->next_topic) { - connection_send_destroy(circ->n_aci, tmpconn); - } - } - if(cell->aci == circ->n_aci) { /* the destroy came from ahead */ - for(tmpconn = circ->p_conn; tmpconn; tmpconn=tmpconn->next_topic) { - connection_send_destroy(circ->p_aci, tmpconn); - } - } - circuit_free(circ); + if(cell->aci == circ->p_aci) /* the destroy came from behind */ + circ->p_conn = NULL; + if(cell->aci == circ->n_aci) /* the destroy came from ahead */ + circ->n_conn = NULL; + circuit_close(circ); } /*