commit 4b4c3458436c646c06d295cc56e990eef9897c6f from: Omar Polo date: Tue Jan 11 21:59:21 2022 UTC timer-based cache removal: delete cached pages older than 15 minutes commit - 0259f38d36d8538ee723be82e20e5ccf29fcd385 commit + 4b4c3458436c646c06d295cc56e990eef9897c6f blob - d39a1bbb0a2096692f5b9ee17498f9a45c9ebaf0 blob + 336b1f37a0f31df70ee9c3a914bfb5d384432cab --- mcache.c +++ mcache.c @@ -37,6 +37,9 @@ const char *gemtext_prefixes[] = { [LINE_PRE_END] = "```", }; +static struct timeval tv = { 60, 0 }; +static struct event timerev; + struct mcache { struct ohash h; size_t npages; @@ -44,6 +47,7 @@ struct mcache { } mcache; struct mcache_entry { + time_t ts; const char *parser_name; int trust; struct evbuffer *evb; @@ -67,6 +71,22 @@ mcache_free_entry(const char *url) free(e); } +static void +clean_old_entries(int fd, short ev, void *data) +{ + struct mcache_entry *e; + unsigned int i; + time_t treshold; + + treshold = time(NULL) - 15 * 60; + + for (e = ohash_first(&mcache.h, &i); e != NULL; e = ohash_next(&mcache.h, &i)) + if (e->ts < treshold) + mcache_free_entry(e->url); + + evtimer_add(&timerev, &tv); +} + void mcache_init(void) { @@ -78,6 +98,8 @@ mcache_init(void) }; ohash_init(&mcache.h, 5, &info); + + evtimer_set(&timerev, clean_old_entries, NULL); } int @@ -95,6 +117,7 @@ mcache_tab(struct tab *tab) if ((e = calloc(1, len)) == NULL) return -1; + e->ts = time(NULL); e->parser_name = tab->buffer.page.name; e->trust = tab->trust; memcpy(e->url, url, l); @@ -164,6 +187,9 @@ mcache_tab(struct tab *tab) mcache.npages++; mcache.tot += EVBUFFER_LENGTH(e->evb); + if (!evtimer_pending(&timerev, NULL)) + evtimer_add(&timerev, &tv); + return 0; err: