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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]