in src/generic/interpool.c [699:750]
void cleanupPool(websh_server_conf * conf)
{
if (conf->webshPool != NULL) {
Tcl_HashEntry *entry;
Tcl_HashSearch search;
WebInterpClass *webInterpClass;
WebInterp *webInterp, *expiredInterp;
time_t t;
time(&t);
entry = Tcl_FirstHashEntry(conf->webshPool, &search);
while (entry != NULL) {
/* loop through entries */
webInterpClass = (WebInterpClass *) Tcl_GetHashValue(entry);
webInterp = webInterpClass->first;
while (webInterp != NULL) {
/* NOTE: check on max requests is done by poolReleaseWebInterp */
if ((webInterp->state) == WIP_FREE) {
/* check for expiry */
if (webInterpClass->maxidletime
&& (t - webInterp->lastusedtime) >
webInterpClass->maxidletime) {
logToAp(webInterp->interp, NULL,
"interpreter expired: idle time reached (id %ld, class %s)", webInterp->id, webInterp->interpClass->filename);
webInterp->state = WIP_EXPIRED;
}
else {
if (webInterpClass->maxttl
&& (t - webInterp->starttime) >
webInterpClass->maxttl) {
logToAp(webInterp->interp, NULL,
"interpreter expired: time to live reached (id %ld, class %s)", webInterp->id, webInterp->interpClass->filename);
webInterp->state = WIP_EXPIRED;
}
}
}
expiredInterp = webInterp;
webInterp = webInterp->next;
if (expiredInterp->state == WIP_EXPIRED)
destroyWebInterp(expiredInterp);
}
entry = Tcl_NextHashEntry(&search);
}
}
return;
}