-*- coding: utf-8 -*-
Changes with Apache 2.5.0
+ *) core: Fix leak of duplicated listeners (socket descriptors) on restart
+ when ListenCoresBucketsRatio is configured (positive). [Yann Ylavic]
+
*) mod_http2: input buffering and dynamic flow windows for increased
throughput. [Stefan Eissing]
#define IS_IN6ADDR_ANY(addr) ((addr)->family == APR_INET6 \
&& IN6_IS_ADDR_UNSPECIFIED(&(addr)->sa.sin6.sin6_addr))
+static apr_status_t ap_close_duplicated_listeners(void *nil)
+{
+ int i;
+
+ /* Start from index 1 since either ap_duplicate_listeners()
+ * was called and ap_listen_buckets[0] == ap_listeners, or
+ * it wasn't and ap_num_listen_buckets == 0.
+ */
+ for (i = 1; i < ap_num_listen_buckets; i++) {
+ ap_close_listeners_ex(ap_listen_buckets[i]);
+ }
+ ap_num_listen_buckets = 0;
+ ap_listen_buckets = NULL;
+
+ return APR_SUCCESS;
+}
+
/**
* Create, open, listen, and bind all sockets.
* @param process The process record for the currently running server
ap_listen_buckets = *buckets;
ap_num_listen_buckets = *num_buckets;
+ apr_pool_cleanup_register(p, NULL, ap_close_duplicated_listeners,
+ apr_pool_cleanup_null);
return APR_SUCCESS;
}
AP_DECLARE_NONSTD(void) ap_close_listeners(void)
{
- int i;
-
ap_close_listeners_ex(ap_listeners);
-
- /* Start from index 1 since either ap_duplicate_listeners()
- * was called and ap_listen_buckets[0] == ap_listeners, or
- * it wasn't and ap_num_listen_buckets == 0.
- */
- for (i = 1; i < ap_num_listen_buckets; i++) {
- ap_close_listeners_ex(ap_listen_buckets[i]);
- }
+ ap_close_duplicated_listeners(NULL);
}
AP_DECLARE_NONSTD(void) ap_close_listeners_ex(ap_listen_rec *listeners)
{
old_listeners = ap_listeners;
ap_listeners = NULL;
- ap_listen_buckets = NULL;
- ap_num_listen_buckets = 0;
ap_listenbacklog = DEFAULT_LISTENBACKLOG;
ap_listencbratio = 0;