+ int must_destroy = 0;
+
+ http_sessions_t http_sessions = s->http_sessions;
+
+ yaz_log(http_sessions->log_level, "%p Session %u destroyed", s, s->session_id);
+ yaz_mutex_enter(http_sessions->mutex);
+ /* only if http_session has no active http sessions on it can be destroyed */
+ if (s->destroy_counter == s->activity_counter) {
+ struct http_session **p = 0;
+ must_destroy = 1;
+ for (p = &http_sessions->session_list; *p; p = &(*p)->next)
+ if (*p == s)
+ {
+ *p = (*p)->next;
+ break;
+ }
+ }
+ yaz_mutex_leave(http_sessions->mutex);
+ if (must_destroy)
+ { /* destroying for real */
+ yaz_log(http_sessions->log_level, "%p Session %u destroyed", s, s->session_id);
+ iochan_destroy(s->timeout_iochan);
+ destroy_session(s->psession);
+ nmem_destroy(s->nmem);
+ }
+ else {
+ yaz_log(http_sessions->log_level, "%p Session %u destroyed delayed. Active clients (%d-%d). Waiting for new timeout.",
+ s, s->session_id, s->activity_counter, s->destroy_counter);
+ }