You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by mt...@apache.org on 2007/03/27 16:30:07 UTC

svn commit: r522931 - /tomcat/connectors/trunk/jni/native/src/network.c

Author: mturk
Date: Tue Mar 27 07:30:06 2007
New Revision: 522931

URL: http://svn.apache.org/viewvc?view=rev&rev=522931
Log:
On Socket.create create a local pool, because the
Socket.destroy destroys that pool, so the Pool.destroy
fails with crushing VM.

Modified:
    tomcat/connectors/trunk/jni/native/src/network.c

Modified: tomcat/connectors/trunk/jni/native/src/network.c
URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jni/native/src/network.c?view=diff&rev=522931&r1=522930&r2=522931
==============================================================================
--- tomcat/connectors/trunk/jni/native/src/network.c (original)
+++ tomcat/connectors/trunk/jni/native/src/network.c Tue Mar 27 07:30:06 2007
@@ -173,6 +173,7 @@
                                           jlong pool)
 {
     apr_pool_t *p = J2P(pool, apr_pool_t *);
+    apr_pool_t *c = NULL;
     apr_socket_t *s = NULL;
     tcn_socket_t *a = NULL;
     apr_int32_t f, t;
@@ -182,19 +183,22 @@
     GET_S_FAMILY(f, family);
     GET_S_TYPE(t, type);
 
-    a = (tcn_socket_t *)apr_pcalloc(p, sizeof(tcn_socket_t));
+    TCN_THROW_IF_ERR(apr_pool_create(&c, p), c);
+
+    a = (tcn_socket_t *)apr_pcalloc(c, sizeof(tcn_socket_t));
     TCN_CHECK_ALLOCATED(a);
-    a->pool = p;
-    if (family >= 0)
-        a->net = &apr_socket_layer;
-    apr_pool_cleanup_register(p, (const void *)a,
-                              sp_socket_cleanup,
-                              apr_pool_cleanup_null);
+    TCN_THROW_IF_ERR(apr_pool_create(&a->child, c), a->child);
+    a->pool = c;
 
     if (family >= 0) {
+        a->net = &apr_socket_layer;
         TCN_THROW_IF_ERR(apr_socket_create(&s,
-                         f, t, protocol, p), a);
+                         f, t, protocol, c), a);
     }
+    apr_pool_cleanup_register(c, (const void *)a,
+                              sp_socket_cleanup,
+                              apr_pool_cleanup_null);
+
 #ifdef TCN_DO_STATISTICS
     sp_created++;
 #endif
@@ -202,10 +206,11 @@
     if (family >= 0)
         a->net = &apr_socket_layer;
     a->opaque   = s;
-    apr_pool_create(&a->child, a->pool);
 
     return P2J(a);
 cleanup:
+    if (c)
+        apr_pool_destroy(c);
     return 0;
 
 }
@@ -375,17 +380,18 @@
     UNREFERENCED(o);
     TCN_ASSERT(sock != 0);
 
-    TCN_THROW_IF_ERR(apr_pool_create(&p, s->pool), p);
+    TCN_THROW_IF_ERR(apr_pool_create(&p, s->child), p);
     if (s->net->type == TCN_SOCKET_APR) {
         TCN_ASSERT(s->sock != NULL);
         a = (tcn_socket_t *)apr_pcalloc(p, sizeof(tcn_socket_t));
         TCN_CHECK_ALLOCATED(a);
-        a->pool   = p;
+        TCN_THROW_IF_ERR(apr_socket_accept(&n, s->sock, p), n);
+
+        a->pool = p;
         apr_pool_cleanup_register(s->child, (const void *)a,
                                   sp_socket_cleanup,
                                   apr_pool_cleanup_null);
 
-        TCN_THROW_IF_ERR(apr_socket_accept(&n, s->sock, p), n);
     }
     else {
         tcn_ThrowAPRException(e, APR_ENOTIMPL);
@@ -401,6 +407,8 @@
     }
     return P2J(a);
 cleanup:
+    if (p)
+        apr_pool_destory(p);
     return 0;
 }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org