X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fconnection.c;h=4ca648edf1fc101132c446b7343045b01ff39c54;hb=2f94ec623064345cdf381a265b43bd754c0a18b8;hp=5b4a1272fbe952fe2d935978413159a0d3b24c1f;hpb=9b00badf722d1e32f90ac4679c184f0870bf0b62;p=pazpar2-moved-to-github.git diff --git a/src/connection.c b/src/connection.c index 5b4a127..4ca648e 100644 --- a/src/connection.c +++ b/src/connection.c @@ -132,28 +132,28 @@ static struct connection *connection_create(struct client *cl, int session_timeout, iochan_man_t iochan_man) { - struct connection *new; + struct connection *co; struct host *host = client_get_host(cl); - new = xmalloc(sizeof(*new)); - new->host = host; + co = xmalloc(sizeof(*co)); + co->host = host; - new->client = cl; - new->zproxy = 0; - client_set_connection(cl, new); - new->link = 0; - new->state = Conn_Resolving; - new->operation_timeout = operation_timeout; - new->session_timeout = session_timeout; + co->client = cl; + co->zproxy = 0; + client_set_connection(cl, co); + co->link = 0; + co->state = Conn_Resolving; + co->operation_timeout = operation_timeout; + co->session_timeout = session_timeout; if (host->ipport) - connection_connect(new, iochan_man); + connection_connect(co, iochan_man); yaz_mutex_enter(host->mutex); - new->next = new->host->connections; - new->host->connections = new; + co->next = co->host->connections; + co->host->connections = co; yaz_mutex_leave(host->mutex); - return new; + return co; } static void non_block_events(struct connection *co) @@ -239,10 +239,11 @@ void connection_continue(struct connection *co) static void connection_handler(IOCHAN iochan, int event) { struct connection *co = iochan_getdata(iochan); - struct client *cl = co->client; + struct client *cl; struct host *host = co->host; yaz_mutex_enter(host->mutex); + cl = co->client; if (!cl) { /* no client associated with it.. We are probably getting @@ -250,6 +251,7 @@ 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); + yaz_mutex_leave(host->mutex); } else if (event & EVENT_TIMEOUT) { @@ -257,8 +259,8 @@ static void connection_handler(IOCHAN iochan, int event) { yaz_log(YLOG_WARN, "connect timeout %s", client_get_url(cl)); - connection_destroy(co); client_set_state(cl, Client_Error); + connection_destroy(co); } else if (client_get_state(co->client) == Client_Idle) { @@ -269,21 +271,25 @@ static void connection_handler(IOCHAN iochan, int event) { 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); } - yaz_mutex_leave(host->mutex); } // Disassociate connection from client -void connection_release(struct connection *co) +static void connection_release(struct connection *co) { struct client *cl = co->client; @@ -434,11 +440,6 @@ static int connection_connect(struct connection *con, iochan_man_t iochan_man) return 0; } -const char *connection_get_url(struct connection *co) -{ - return client_get_url(co->client); -} - // Ensure that client has a connection associated int client_prep_connection(struct client *cl, int operation_timeout, int session_timeout,