You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by da...@apache.org on 2009/12/18 09:44:14 UTC
svn commit: r892182 -
/webservices/axis2/trunk/c/src/core/transport/http/sender/http_sender.c
Author: damitha
Date: Fri Dec 18 08:44:14 2009
New Revision: 892182
URL: http://svn.apache.org/viewvc?rev=892182&view=rev
Log:
Fixing memory leak
Modified:
webservices/axis2/trunk/c/src/core/transport/http/sender/http_sender.c
Modified: webservices/axis2/trunk/c/src/core/transport/http/sender/http_sender.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/src/core/transport/http/sender/http_sender.c?rev=892182&r1=892181&r2=892182&view=diff
==============================================================================
--- webservices/axis2/trunk/c/src/core/transport/http/sender/http_sender.c (original)
+++ webservices/axis2/trunk/c/src/core/transport/http/sender/http_sender.c Fri Dec 18 08:44:14 2009
@@ -54,12 +54,6 @@
axis2_bool_t keep_alive;
};
-typedef struct axis2_http_connection_struct
-{
- axutil_array_list_t *closed_list;
- axis2_http_client_t *http_client;
-} axis2_http_connection_struct_t;
-
#ifndef AXIS2_LIBCURL_ENABLED
static void
axis2_http_sender_add_header_list(
@@ -149,7 +143,7 @@
axis2_msg_ctx_t *msg_ctx);
static void
-axis2_http_sender_connection_map_add_to_closed_list(
+axis2_http_sender_connection_map_remove(
axutil_hash_t *connection_map,
const axutil_env_t *env,
axis2_msg_ctx_t *msg_ctx,
@@ -406,12 +400,6 @@
AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return AXIS2_FAILURE;
}
-
- connection_map_property = axutil_property_create_with_args(env, AXIS2_SCOPE_SESSION,
- AXIS2_TRUE, axis2_http_sender_connection_map_free, connection_map);
- axis2_conf_ctx_set_property(conf_ctx, env, AXIS2_HTTP_CONNECTION_MAP,
- connection_map_property);
-
}
else
{
@@ -1463,12 +1451,6 @@
connection_header_present = AXIS2_TRUE;
connection_header_value = axis2_http_header_get_value(header, env);
conf_ctx = axis2_msg_ctx_get_conf_ctx(msg_ctx, env);
- /**
- * Put the http client into message context. Is this neccessary?
- */
- property = axutil_property_create_with_args(env, AXIS2_SCOPE_REQUEST,
- AXIS2_FALSE, axis2_http_client_free_void_arg, sender->client);
- axis2_msg_ctx_set_property(msg_ctx, env, AXIS2_HTTP_CLIENT, property);
connection_map_property = axis2_conf_ctx_get_property(conf_ctx, env,
AXIS2_HTTP_CONNECTION_MAP);
@@ -1483,7 +1465,7 @@
{
if(connection_map)
{
- axis2_http_sender_connection_map_add_to_closed_list(connection_map, env,
+ axis2_http_sender_connection_map_remove(connection_map, env,
msg_ctx, sender->client);
}
}
@@ -1513,12 +1495,6 @@
axis2_conf_ctx_t *conf_ctx = NULL;
conf_ctx = axis2_msg_ctx_get_conf_ctx(msg_ctx, env);
- /**
- * Put the http client into message context. Is this neccessary?
- */
- property = axutil_property_create_with_args(env, AXIS2_SCOPE_REQUEST, AXIS2_FALSE,
- axis2_http_client_free_void_arg, sender->client);
- axis2_msg_ctx_set_property(msg_ctx, env, AXIS2_HTTP_CLIENT, property);
connection_map_property = axis2_conf_ctx_get_property(conf_ctx, env,
AXIS2_HTTP_CONNECTION_MAP);
if(connection_map_property)
@@ -1529,7 +1505,7 @@
{
if(connection_map)
{
- axis2_http_sender_connection_map_add_to_closed_list(connection_map, env, msg_ctx,
+ axis2_http_sender_connection_map_remove(connection_map, env, msg_ctx,
sender->client);
}
} /* End if http version 1.0 */
@@ -3202,74 +3178,35 @@
{
AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
}
- if(connection_map)
+ else
{
- axis2_http_connection_struct_t *connections = NULL;
- axis2_endpoint_ref_t *endpoint = NULL;
- connections = AXIS2_MALLOC(env->allocator, sizeof(axis2_http_connection_struct_t));
- if(connections)
- {
- connections->closed_list = axutil_array_list_create(env, 0);
- if(!connections->closed_list)
- {
- if(connections->closed_list)
- {
- axutil_array_list_free(connections->closed_list, env);
- }
- axutil_hash_free(connection_map, env);
- connection_map = NULL;
- AXIS2_FREE(env->allocator, connections);
- connections = NULL;
- AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
- return NULL;
- }
- }
- else
- {
- axutil_hash_free(connection_map, env);
- connection_map = NULL;
- AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
- return NULL;
- }
- endpoint = axis2_msg_ctx_get_to(msg_ctx, env);
- if(endpoint)
- {
- const axis2_char_t *address = NULL;
- address = axis2_endpoint_ref_get_address(endpoint, env);
- if(address)
- {
- axutil_url_t *url = NULL;
- url = axutil_url_parse_string(env, address);
- if(url)
- {
- axis2_char_t *server = axutil_url_get_server(url, env);
- if(server)
- {
- AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "damserver:%s", server);
- axutil_hash_set(connection_map, axutil_strdup(env, server),
- AXIS2_HASH_KEY_STRING, connections);
- }
- axutil_url_free(url, env);
- }
- }
- }
- else
- {
- axutil_hash_free(connection_map, env);
- connection_map = NULL;
- }
- } /* end if connection_map */
+ axis2_conf_ctx_t *conf_ctx = NULL;
+ axutil_property_t *connection_map_property = NULL;
+ conf_ctx = axis2_msg_ctx_get_conf_ctx(msg_ctx, env);
+ connection_map_property = axutil_property_create_with_args(env, AXIS2_SCOPE_SESSION,
+ AXIS2_TRUE, axis2_http_sender_connection_map_free, connection_map);
+ axis2_conf_ctx_set_property(conf_ctx, env, AXIS2_HTTP_CONNECTION_MAP,
+ connection_map_property);
+ }
return connection_map;
}
static void
-axis2_http_sender_connection_map_add_to_closed_list(
+axis2_http_sender_connection_map_remove(
axutil_hash_t *connection_map,
const axutil_env_t *env,
axis2_msg_ctx_t *msg_ctx,
axis2_http_client_t *http_client)
{
+ axutil_property_t *property = NULL;
axis2_endpoint_ref_t *endpoint = NULL;
+ /**
+ * Put the http client into message context with own value true so that it will be freed
+ * after response processed
+ */
+ property = axutil_property_create_with_args(env, AXIS2_SCOPE_REQUEST, AXIS2_TRUE,
+ axis2_http_client_free_void_arg, http_client);
+ axis2_msg_ctx_set_property(msg_ctx, env, AXIS2_HTTP_CLIENT, property);
endpoint = axis2_msg_ctx_get_to(msg_ctx, env);
if(endpoint)
{
@@ -3284,14 +3221,7 @@
axis2_char_t *server = axutil_url_get_server(url, env);
if(server)
{
- axis2_http_connection_struct_t *connections = NULL;
- connections = axutil_hash_get(connection_map, server,
- AXIS2_HASH_KEY_STRING);
- if(connections)
- {
- connections->http_client = NULL;
- axutil_array_list_add(connections->closed_list, env, http_client);
- }
+ axutil_hash_set(connection_map, server, AXIS2_HASH_KEY_STRING, NULL);
}
axutil_url_free(url, env);
}
@@ -3306,7 +3236,14 @@
axis2_msg_ctx_t *msg_ctx,
axis2_http_client_t *http_client)
{
+ axutil_property_t *property = NULL;
axis2_endpoint_ref_t *endpoint = NULL;
+ /**
+ * Put the http client into message context. Is this neccessary?
+ */
+ property = axutil_property_create_with_args(env, AXIS2_SCOPE_REQUEST, AXIS2_FALSE,
+ axis2_http_client_free_void_arg, http_client);
+ axis2_msg_ctx_set_property(msg_ctx, env, AXIS2_HTTP_CLIENT, property);
endpoint = axis2_msg_ctx_get_to(msg_ctx, env);
if(endpoint)
{
@@ -3321,13 +3258,8 @@
axis2_char_t *server = axutil_url_get_server(url, env);
if(server)
{
- axis2_http_connection_struct_t *connections = NULL;
- connections = axutil_hash_get(connection_map, server,
- AXIS2_HASH_KEY_STRING);
- if(connections)
- {
- connections->http_client = http_client;
- }
+ axutil_hash_set(connection_map, axutil_strdup(env, server),
+ AXIS2_HASH_KEY_STRING, http_client);
}
axutil_url_free(url, env);
}
@@ -3357,13 +3289,7 @@
axis2_char_t *server = axutil_url_get_server(url, env);
if(server)
{
- axis2_http_connection_struct_t *connections = NULL;
- connections = axutil_hash_get(connection_map, server,
- AXIS2_HASH_KEY_STRING);
- if(connections)
- {
- http_client = connections->http_client;
- }
+ http_client = axutil_hash_get(connection_map, server, AXIS2_HASH_KEY_STRING);
}
axutil_url_free(url, env);
}
@@ -3385,7 +3311,7 @@
for(hi = axutil_hash_first(ht, env); hi; hi = axutil_hash_next(env, hi))
{
axis2_char_t *name = NULL;
- axis2_http_connection_struct_t *value = NULL;
+ axis2_http_client_t *value = NULL;
axutil_hash_this(hi, &key, NULL, &val);
name = (axis2_char_t *) key;
@@ -3393,27 +3319,10 @@
{
AXIS2_FREE(env->allocator, name);
}
- value = (axis2_http_connection_struct_t *) val;
+ value = (axis2_http_client_t *) val;
if(value)
{
- int i = 0, size = 0;
- size = axutil_array_list_size(value->closed_list, env);
- for(i = 0; i < size; i++)
- {
- axis2_http_client_t *http_client = NULL;
- http_client = (axis2_http_client_t *) axutil_array_list_get(value->closed_list, env,
- i);
- if(http_client)
- {
- axis2_http_client_free(http_client, env);
- }
- }
- axutil_array_list_free(value->closed_list, env);
- if(value->http_client)
- {
- axis2_http_client_free(value->http_client, env);
- }
- AXIS2_FREE(env->allocator, value);
+ axis2_http_client_free(value, env);
}
}
axutil_hash_free(ht, env);