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