Sorry for the broken patch. Besides the not so nice multiple registation
of the cleanup, the real problem for the crash after the patch is, that
clear() on a pool already calls the cleanup. So I had to register the
cleanup for the parent pool (pconf) and not for the pool itself.
I'll think about the thread-safety next, but as I said that is not the
cause for your crashes.
Regards,
Rainer
On 13.05.2009 14:56, Henri Gomez wrote:
> Some comments on your latest provided patch :
>
> if (!jk_resolv_pool) {
> if (apr_pool_create(&jk_resolv_pool, (apr_pool_t *)pool)
> != APR_SUCCESS) {
> JK_TRACE_EXIT(l);
> return JK_FALSE;
> }
> }
> /* We need to clear the pool reference, if the pool gets destroyed
> * via its parent pool. */
> apr_pool_cleanup_register(jk_resolv_pool, &jk_resolv_pool,
> jk_resolv_cleanup, jk_resolv_cleanup);
> apr_pool_clear(jk_resolv_pool);
> if (apr_sockaddr_info_get
> (&remote_sa, host, APR_UNSPEC, (apr_port_t) port, 0,
> jk_resolv_pool)
> != APR_SUCCESS) {
> JK_TRACE_EXIT(l);
> return JK_FALSE;
> }
>
> Why not just add the cleanup register in pool create side ?
>
> if (!jk_resolv_pool) {
> if (apr_pool_create(&jk_resolv_pool, (apr_pool_t *)pool)
> != APR_SUCCESS) {
> JK_TRACE_EXIT(l);
> return JK_FALSE;
> }
>
> /* We need to clear the pool reference, if the pool gets destroyed
> * via its parent pool. */
> apr_pool_cleanup_register(jk_resolv_pool, &jk_resolv_pool,
> jk_resolv_cleanup, jk_resolv_cleanup);
> }
>
> apr_pool_clear(jk_resolv_pool);
> if (apr_sockaddr_info_get
> (&remote_sa, host, APR_UNSPEC, (apr_port_t) port, 0,
> jk_resolv_pool)
> != APR_SUCCESS) {
> JK_TRACE_EXIT(l);
> return JK_FALSE;
> }
>
>
> Also what could happen if we get many threads calling jk_resolv at the
> same time ?
Index: common/jk_connect.c
===================================================================
--- common/jk_connect.c (revision 763986)
+++ common/jk_connect.c (working copy)
@@ -35,7 +35,7 @@
#include "apr_errno.h"
#include "apr_general.h"
#include "apr_pools.h"
-static apr_pool_t *jk_apr_pool = NULL;
+static apr_pool_t *jk_resolv_pool = NULL;
#endif
#ifdef HAVE_SYS_FILIO_H
@@ -58,6 +58,13 @@
typedef const char* SET_TYPE;
#endif
+static apr_status_t jk_resolv_cleanup(void *d)
+{
+ /* Clean up pointer content */
+ *(apr_pool_t **)d = NULL;
+ return APR_SUCCESS;
+}
+
/** Set socket to blocking
* @param sd socket to manipulate
* @return errno: fcntl returns -1 (!WIN32)
@@ -343,15 +350,19 @@
apr_sockaddr_t *remote_sa, *temp_sa;
char *remote_ipaddr;
- if (!jk_apr_pool) {
- if (apr_pool_create(&jk_apr_pool, (apr_pool_t *)pool) !=
APR_SUCCESS) {
+ if (!jk_resolv_pool) {
+ if (apr_pool_create(&jk_resolv_pool, (apr_pool_t *)pool) !=
APR_SUCCESS) {
JK_TRACE_EXIT(l);
return JK_FALSE;
}
+ apr_pool_cleanup_register((apr_pool_t *)pool, &jk_resolv_pool,
+ jk_resolv_cleanup, jk_resolv_cleanup);
}
- apr_pool_clear(jk_apr_pool);
+ /* We need to clear the pool reference, if the pool gets destroyed
+ * via its parent pool. */
+ apr_pool_clear(jk_resolv_pool);
if (apr_sockaddr_info_get
- (&remote_sa, host, APR_UNSPEC, (apr_port_t) port, 0, jk_apr_pool)
+ (&remote_sa, host, APR_UNSPEC, (apr_port_t) port, 0,
jk_resolv_pool)
!= APR_SUCCESS) {
JK_TRACE_EXIT(l);
return JK_FALSE;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]