X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Fconnection.c;h=1525dfb73d32705fd54073a232f874795e504fe2;hb=4193aa864cbf4f36d264179f9be1999ce74e77e6;hp=f9b0e0b8fcd8ecb80bccf8fab3c3513a149a244b;hpb=de185af5ab36376968640dea3b64ff1c8aee8cec;p=pazpar2-moved-to-github.git diff --git a/src/connection.c b/src/connection.c index f9b0e0b..1525dfb 100644 --- a/src/connection.c +++ b/src/connection.c @@ -117,11 +117,12 @@ void connection_destroy(struct connection *co) } yaz_log(YLOG_DEBUG, "Connection destroy %s", co->host->hostport); - remove_connection_from_host(co); if (co->client) { client_disconnect(co->client); } + + remove_connection_from_host(co); xfree(co->zproxy); xfree(co); } @@ -158,16 +159,21 @@ static struct connection *connection_create(struct client *cl, static void non_block_events(struct connection *co) { - struct client *cl = co->client; + int got_records = 0; IOCHAN iochan = co->iochan; ZOOM_connection link = co->link; while (1) { + struct client *cl = co->client; int ev; int r = ZOOM_event_nonblock(1, &link); if (!r) break; + if (!cl) + 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 @@ -208,11 +214,23 @@ static void non_block_events(struct connection *co) break; case ZOOM_EVENT_RECV_RECORD: client_record_response(cl); + got_records = 1; break; default: 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); + } } } @@ -225,16 +243,15 @@ static void connection_handler(IOCHAN iochan, int event) { struct connection *co = iochan_getdata(iochan); struct client *cl = co->client; - struct session *se = 0; - if (cl) - se = client_get_session(cl); - else + 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 */ connection_destroy(co); return; } - if (event & EVENT_TIMEOUT) { if (co->state == Conn_Connecting) @@ -422,7 +439,6 @@ int client_prep_connection(struct client *cl, iochan_man_t iochan_man) { struct connection *co; - struct session *se = client_get_session(cl); struct host *host = client_get_host(cl); struct session_database *sdb = client_get_database(cl); const char *zproxy = session_setting_oneval(sdb, PZ_ZPROXY);