{
struct connection **conp = &con->host->connections;
assert(con);
- yaz_mutex_enter(con->host->mutex);
while (*conp)
{
if (*conp == 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)
{
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);
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;
}
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
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);
}
}
}
void connection_continue(struct connection *co)
{
- non_block_events(co);
+ int r = ZOOM_connection_exec_task(co->link);
+ if (!r)
+ yaz_log(YLOG_WARN, "No task was executed for connection");
}
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
a closed connection from the target.. Or, perhaps, an unexpected
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);
non_block_events(co);
ZOOM_connection_fire_event_socket(co->link, event);