}
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);
}
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
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);
+ }
}
}
{
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)
{
struct connection *con;
+start:
yaz_mutex_enter(host->mutex);
con = host->connections;
while (con)
{
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
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);