+ int must_destroy = 1;
+
+ http_sessions_t http_sessions = s->http_sessions;
+
+ yaz_log(YLOG_LOG, "%p HTTP session destroy %u", s, s->session_id);
+ yaz_mutex_enter(http_sessions->mutex);
+
+ /* only if http_session destroy was already called, we will allow it
+ to be destroyed */
+ if (s->destroy_counter != s->activity_counter)
+ must_destroy = 0;
+
+ s->destroy_counter = s->activity_counter = 0;
+ if (must_destroy)
+ {
+ struct http_session **p = 0;
+ 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(YLOG_LOG, "%p HTTP session destroying. session id %u", s, s->session_id); iochan_destroy(s->timeout_iochan);
+ destroy_session(s->psession);
+ nmem_destroy(s->nmem);
+ }
+ else {
+ yaz_log(YLOG_DEBUG, "%p HTTP Session. Active clients on session %u. Waiting for new timeout.", s, s->session_id);
+ }