X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fconnection.c;h=ac181309206ef63766c5767b03bbb9a2e731264f;hb=9ec24f94f5b741ec7928b411dbf21eabdc99d73c;hp=8d0d480c19f16c8a9486ee311e20a01e467df939;hpb=d95f1578e8a8ef260a95dde9bece743ad6b49a00;p=pazpar2-moved-to-github.git diff --git a/src/connection.c b/src/connection.c index 8d0d480..ac18130 100644 --- a/src/connection.c +++ b/src/connection.c @@ -94,7 +94,6 @@ static void remove_connection_from_host(struct connection *con) { struct connection **conp = &con->host->connections; assert(con); - yaz_mutex_enter(con->host->mutex); while (*conp) { if (*conp == con) @@ -104,11 +103,10 @@ static void remove_connection_from_host(struct connection *con) } conp = &(*conp)->next; } - yaz_mutex_leave(con->host->mutex); } // Close connection and recycle structure -void connection_destroy(struct connection *co) +static void connection_destroy(struct connection *co) { if (co->link) { @@ -140,11 +138,6 @@ static struct connection *connection_create(struct client *cl, new = xmalloc(sizeof(*new)); new->host = host; - yaz_mutex_enter(host->mutex); - new->next = new->host->connections; - new->host->connections = new; - yaz_mutex_leave(host->mutex); - new->client = cl; new->zproxy = 0; client_set_connection(cl, new); @@ -154,6 +147,12 @@ static struct connection *connection_create(struct client *cl, new->session_timeout = session_timeout; if (host->ipport) connection_connect(new, iochan_man); + + yaz_mutex_enter(host->mutex); + new->next = new->host->connections; + new->host->connections = new; + yaz_mutex_leave(host->mutex); + return new; } @@ -173,7 +172,6 @@ static void non_block_events(struct connection *co) continue; ev = ZOOM_connection_last_event(link); - client_incref(cl); #if 0 yaz_log(YLOG_LOG, "ZOOM_EVENT_%s", ZOOM_get_event_str(ev)); #endif @@ -220,16 +218,13 @@ static void non_block_events(struct connection *co) yaz_log(YLOG_LOG, "Unhandled event (%d) from %s", ev, client_get_url(cl)); } - client_destroy(cl); } if (got_records) { struct client *cl = co->client; if (cl) { - client_incref(cl); client_got_records(cl); - client_destroy(cl); } } } @@ -245,30 +240,41 @@ static void connection_handler(IOCHAN iochan, int event) { struct connection *co = iochan_getdata(iochan); struct client *cl = co->client; + struct host *host = co->host; + yaz_mutex_enter(host->mutex); if (!cl) { /* no client associated with it.. We are probably getting a closed connection from the target.. Or, perhaps, an unexpected package.. We will just close the connection */ + yaz_log(YLOG_LOG, "timeout connection %p event=%d", co, event); connection_destroy(co); - return; + yaz_mutex_leave(host->mutex); } - if (event & EVENT_TIMEOUT) + else if (event & EVENT_TIMEOUT) { if (co->state == Conn_Connecting) { yaz_log(YLOG_WARN, "connect timeout %s", client_get_url(cl)); - client_fatal(cl); + + connection_destroy(co); + client_set_state(cl, Client_Error); } - else + else if (client_get_state(co->client) == Client_Idle) { yaz_log(YLOG_LOG, "idle timeout %s", client_get_url(cl)); connection_destroy(co); } + else + { + yaz_log(YLOG_LOG, "ignore timeout %s", client_get_url(cl)); + } + yaz_mutex_leave(host->mutex); } else { + yaz_mutex_leave(host->mutex); non_block_events(co); ZOOM_connection_fire_event_socket(co->link, event);