#endif
free(ptr);
}
+
+void
+check_stored_pages(void)
+{
+#ifdef ENOMEM
+ if (atomic_load_explicit(&global_page_list_not_empty, memory_order_relaxed) == 0)
+ return;
+
+ for (uint limit = 0; limit < 256; limit++)
+ {
+ GLOBAL_PAGE_SPIN_LOCK;
+ void *ptr = HEAD(global_page_list);
+ if (!NODE_VALID(ptr))
+ {
+ atomic_store_explicit(&global_page_list_not_empty, 0, memory_order_relaxed);
+ GLOBAL_PAGE_SPIN_UNLOCK;
+ return;
+ }
+
+ rem_node(ptr);
+ if (munmap(ptr, page_size) < 0)
+ if (errno == ENOMEM)
+ add_tail(&global_page_list, ptr);
+ else
+ bug("munmap(%p) failed: %m", ptr);
+ GLOBAL_PAGE_SPIN_UNLOCK;
+ }
+#endif
+}
#define WORK_EVENTS_MAX 10
void pipe_drain(int fd);
+void check_stored_pages(void);
void
io_loop(void)
timers_fire(&main_birdloop.time, 1);
io_close_event();
+ /* Try to release some memory if possible */
+ check_stored_pages();
+
// FIXME
poll_tout = (events ? 0 : 3000); /* Time in milliseconds */
if (t = timers_first(&main_birdloop.time))