]> granicus.if.org Git - apache/commitdiff
Convert events to have an associated pool.
authorPaul Querna <pquerna@apache.org>
Sat, 1 Nov 2008 07:13:29 +0000 (07:13 +0000)
committerPaul Querna <pquerna@apache.org>
Sat, 1 Nov 2008 07:13:29 +0000 (07:13 +0000)
* server/mpm/simple/simple_types.h
    (simple_timer_t): Add Pool and a pointer to the associated simple core.
    (simple_core_t): Remove dead timer ring, no recycling of timer events for now.

* server/mpm/simple/simple_event.h: Update register_timer signature with pool.

* server/mpm/simple/simple_event.c
    (simple_register_timer): Allocate the event structure out of the pool,
        and when this pool is destroyed, unregister the timer.
    (simple_timer_run): New util function for running a timer and cleaning up
        the pool callbacks.

* server/mpm/simple/simple_core.c
    (simple_core_init): Remvoe dead timer ring

* server/mpm/simple/simple_run.c
    (simple_main_setup_timers): Pass in pool to register call.
    (simple_timer_invoke): Use new simple_timer_run function.
    (simple_child_loop): Remove dead timer ring.

* server/mpm/simple/simple_io.c
    (simple_io_process): Pass in pool when registering timers.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@709657 13f79535-47bb-0310-9956-ffa450edef68

server/mpm/simple/simple_children.c
server/mpm/simple/simple_core.c
server/mpm/simple/simple_event.c
server/mpm/simple/simple_event.h
server/mpm/simple/simple_io.c
server/mpm/simple/simple_run.c
server/mpm/simple/simple_types.h

index bfa1a7657ecdb5351333582a98c1727c41bd3d19..e326784f7d49a98dc0a4e701f65f55ccd0caba75 100644 (file)
@@ -118,7 +118,8 @@ void simple_check_children_size(simple_core_t * sc, void *baton)
 
     simple_register_timer(sc,
                           simple_check_children_size,
-                          NULL, SPAWN_CHILDREN_INTERVAL);
+                          NULL, SPAWN_CHILDREN_INTERVAL,
+                          sc->pool);
 
     if (sc->run_single_process && sc->restart_num == 2) {
         static int run = 0;
index eeedabbb1d7a1f89a4b8962c21b86b174487d4a0..cde9a85fa863a3c98c001e0e8ce37265096ce919 100644 (file)
@@ -53,7 +53,6 @@ apr_status_t simple_core_init(simple_core_t * sc, apr_pool_t * pool)
     sc->spawn_via = SIMPLE_SPAWN_FORK;
 
     APR_RING_INIT(&sc->timer_ring, simple_timer_t, link);
-    APR_RING_INIT(&sc->dead_timer_ring, simple_timer_t, link);
 
     rv = apr_thread_mutex_create(&sc->mtx, 0, sc->pool);
 
index 410680a553184e8a1b9f2a200a3feca85db2a5f9..6157c034413fd040e8484cbdd4e2357eb42e9674 100644 (file)
 #include "simple_types.h"
 #include "simple_event.h"
 
+static apr_status_t
+simple_timer_pool_cleanup(void *baton)
+{
+    simple_timer_t *elem = (simple_timer_t *)baton;
+    simple_core_t *sc = elem->sc;
+
+    apr_thread_mutex_lock(sc->mtx);
+    APR_RING_REMOVE(elem, link);
+    apr_thread_mutex_unlock(sc->mtx);
+
+    return APR_SUCCESS;
+}
+
+
 void
 simple_register_timer(simple_core_t * sc,
                       simple_timer_cb cb,
-                      void *baton, apr_time_t relative_time)
+                      void *baton, apr_time_t relative_time,
+                      apr_pool_t *shutdown_pool)
 {
     simple_timer_t *elem = NULL;
     simple_timer_t *ep = NULL;
@@ -32,23 +47,16 @@ simple_register_timer(simple_core_t * sc,
     apr_thread_mutex_lock(sc->mtx);
 
     APR_RING_CHECK_CONSISTENCY(&sc->timer_ring, simple_timer_t, link);
-    APR_RING_CHECK_CONSISTENCY(&sc->dead_timer_ring, simple_timer_t, link);
 
-    if (!APR_RING_EMPTY(&sc->dead_timer_ring, simple_timer_t, link)) {
-        elem = APR_RING_FIRST(&sc->dead_timer_ring);
-        APR_RING_REMOVE(elem, link);
-        APR_RING_CHECK_CONSISTENCY(&sc->dead_timer_ring, simple_timer_t,
-                                   link);
-    }
-    else {
-        elem =
-            (simple_timer_t *) apr_pcalloc(sc->pool, sizeof(simple_timer_t));
-    }
+    elem = (simple_timer_t *) apr_pcalloc(shutdown_pool, sizeof(simple_timer_t));
 
     APR_RING_ELEM_INIT(elem, link);
     elem->expires = t;
     elem->cb = cb;
     elem->baton = baton;
+    elem->pool = shutdown_pool;
+    elem->sc = sc;
+    apr_pool_cleanup_register(elem->pool, elem, simple_timer_pool_cleanup, apr_pool_cleanup_null);
 
     APR_RING_CHECK_CONSISTENCY(&sc->timer_ring, simple_timer_t, link);
 
@@ -80,3 +88,14 @@ simple_register_timer(simple_core_t * sc,
 
     apr_thread_mutex_unlock(sc->mtx);
 }
+
+
+void
+simple_timer_run(simple_timer_t *ep)
+{
+    apr_pool_cleanup_kill(ep->pool, ep, simple_timer_pool_cleanup);
+
+    ep->cb(ep->sc, ep->baton);
+}
+
+
index 319f42d383f6ce543b24917e99732c4010d7260f..77ea0a8d87d5629b5efee2ce335bea56bf04b439 100644 (file)
 void
 simple_register_timer(simple_core_t * sc,
                       simple_timer_cb cb,
-                      void *baton, apr_time_t relative_time);
+                      void *baton,
+                      apr_time_t relative_time, 
+                      apr_pool_t *shutdown_pool);
 
+void
+simple_timer_run(simple_timer_t *ep);
+
+#if THESE_ARE_JUST_IDEAS_PATCHES_WELCOME
 /**
  * @see apr_poll.h for watch_for values
  */
@@ -49,5 +55,6 @@ simple_register_file_io(simple_core_t * sc,
                         apr_file_t * file,
                         int watch_for, apr_time_t relative_timeout);
 
+#endif
 
 #endif /* APACHE_MPM_SIMPLE_EVENT_H */
index 8921d79704cdbfc58f9146498394024b008b3f50..0759c9161231545ed795d817790b5e0c49399330 100644 (file)
@@ -102,7 +102,8 @@ static apr_status_t simple_io_process(simple_conn_t * scon)
                                       scon,
                                       scon->c->base_server !=
                                       NULL ? scon->c->base_server->
-                                      timeout : ap_server_conf->timeout);
+                                      timeout : ap_server_conf->timeout,
+                                      scon->pool);
 
                 cs->pfd.reqevents = APR_POLLOUT | APR_POLLHUP | APR_POLLERR;
 
@@ -139,7 +140,8 @@ static apr_status_t simple_io_process(simple_conn_t * scon)
                                   scon,
                                   scon->c->base_server !=
                                   NULL ? scon->c->base_server->
-                                  timeout : ap_server_conf->timeout);
+                                  timeout : ap_server_conf->timeout,
+                                  scon->pool);
 
             cs->pfd.reqevents = APR_POLLIN;
 
index 80bb9186f912549a8854a65359c995d138b72002..b6982af5231b3c026857c3f82bb5831cfff3619a 100644 (file)
@@ -35,7 +35,7 @@
  */
 static apr_status_t simple_main_setup_timers(simple_core_t * sc)
 {
-    simple_register_timer(sc, simple_check_children_size, NULL, 0);
+    simple_register_timer(sc, simple_check_children_size, NULL, 0, sc->pool);
 
     return APR_SUCCESS;
 }
@@ -129,14 +129,8 @@ static apr_status_t simple_io_callback(void *baton, apr_pollfd_t * pfd)
 static void *simple_timer_invoke(apr_thread_t * thread, void *baton)
 {
     simple_timer_t *ep = (simple_timer_t *) baton;
-    simple_core_t *sc = simple_core_get();
 
-    ep->cb(sc, ep->baton);
-
-    apr_thread_mutex_lock(sc->mtx);
-    APR_RING_ELEM_INIT(ep, link);
-    APR_RING_INSERT_TAIL(&sc->dead_timer_ring, ep, simple_timer_t, link);
-    apr_thread_mutex_unlock(sc->mtx);
+    simple_timer_run(ep);
 
     return NULL;
 }
@@ -285,7 +279,6 @@ int simple_child_loop(simple_core_t * sc)
      * thought out than this. 
      */
     APR_RING_INIT(&sc->timer_ring, simple_timer_t, link);
-    APR_RING_INIT(&sc->dead_timer_ring, simple_timer_t, link);
 
     rv = simple_setup_workers(sc);
     if (rv) {
index 979a844222ea5170ddffc3071dfd1b0c382d60d2..db4205d1e027e1986a20a69264c893db40ba4cbc 100644 (file)
@@ -70,6 +70,8 @@ struct simple_timer_t
     apr_time_t expires;
     simple_timer_cb cb;
     void *baton;
+    apr_pool_t *pool;
+    simple_core_t *sc;
 };
 
 typedef struct simple_child_t simple_child_t;
@@ -100,18 +102,7 @@ struct simple_core_t
 
     /* List of upcoming timers, sorted by nearest first.
      */
-         
-               APR_RING_HEAD(simple_timer_ring_t, simple_timer_t) timer_ring;
-
-    /* used to recycle simple_timer_t structs, since we allocate them out of 
-     * the global pool.
-     */
-         
-         
-         
-         
-         APR_RING_HEAD(simple_dead_timer_ring_t,
-                       simple_timer_t) dead_timer_ring;
+    APR_RING_HEAD(simple_timer_ring_t, simple_timer_t) timer_ring;
 
     apr_thread_pool_t *workers;
 };