X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Fconnection.c;h=1525dfb73d32705fd54073a232f874795e504fe2;hb=4193aa864cbf4f36d264179f9be1999ce74e77e6;hp=c1f3ff35a9dda77a22a57fdff6ad08c712cbad2a;hpb=03b971ecc3f02f7ac261f31db434176c6237abfb;p=pazpar2-moved-to-github.git diff --git a/src/connection.c b/src/connection.c index c1f3ff3..1525dfb 100644 --- a/src/connection.c +++ b/src/connection.c @@ -42,7 +42,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include #include "connection.h" -#include "pazpar2.h" +#include "session.h" #include "host.h" #include "client.h" #include "settings.h" @@ -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) @@ -264,7 +281,6 @@ void connection_release(struct connection *co) { struct client *cl = co->client; - yaz_log(YLOG_DEBUG, "Connection release %s", co->host->hostport); if (!cl) return; client_set_connection(cl, 0); @@ -275,6 +291,7 @@ void connect_resolver_host(struct host *host, iochan_man_t iochan_man) { struct connection *con; +start: yaz_mutex_enter(host->mutex); con = host->connections; while (con) @@ -285,22 +302,22 @@ void connect_resolver_host(struct host *host, iochan_man_t iochan_man) { yaz_mutex_leave(host->mutex); connection_destroy(con); + goto start; /* start all over .. at some point it will be NULL */ - con = host->connections; } else if (!con->client) { yaz_mutex_leave(host->mutex); connection_destroy(con); /* start all over .. at some point it will be NULL */ - con = host->connections; + goto start; } else { yaz_mutex_leave(host->mutex); connection_connect(con, iochan_man); client_start_search(con->client); - con = host->connections; + goto start; } } else @@ -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); @@ -444,7 +460,7 @@ int client_prep_connection(struct client *cl, yaz_mutex_enter(host->mutex); for (co = host->connections; co; co = co->next) if (connection_is_idle(co) && - (!co->client || client_get_session(co->client) != se) && + (!co->client || client_get_state(co->client) == Client_Idle) && !strcmp(ZOOM_connection_option_get(co->link, "user"), session_setting_oneval(client_get_database(cl), PZ_AUTHENTICATION)))