X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fconnection.c;h=1526938f34ed153986b6eee518ce7b8fa75616fb;hb=0be537a08d164975e9584a6c89240b28343a6ec2;hp=e765435e0e55248e0ef27bceb44302caab78b88a;hpb=fc05a25c3100a114f64450604fc897c77c4f0db6;p=pazpar2-moved-to-github.git diff --git a/src/connection.c b/src/connection.c index e765435..1526938 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; } @@ -241,7 +240,9 @@ 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 @@ -249,28 +250,39 @@ static void connection_handler(IOCHAN iochan, int event) 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); + + client_lock(cl); non_block_events(co); ZOOM_connection_fire_event_socket(co->link, event); non_block_events(co); + client_unlock(cl); } }