You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-dev@axis.apache.org by Damitha Kumarage <da...@gmail.com> on 2006/02/01 11:31:04 UTC

Fixing AXIS2C-40

Hi
I have given a solution to
http://issues.apache.org/jira/browse/AXIS2C-40

I changed param_free method to look like following

axis2_status_t AXIS2_CALL
axis2_param_free(axis2_param_t *param,
                        axis2_env_t **env)
{
    void *param_value = NULL;

    AXIS2_FUNC_PARAM_CHECK(param, env, AXIS2_FAILURE);

    param_value = AXIS2_PARAM_GET_VALUE(param, env);
    if(param_value)
    {
        if(param->ops && param->ops->value_free)
        {
            param->ops->value_free(param_value, env);
        }
        else /* we assume that param value is axis2_char_t* */
        {
            AXIS2_FREE((*env)->allocator, param_value);
        }
    }
    AXIS2_FREE((*env)->allocator, param->ops);
    AXIS2_FREE((*env)->allocator, AXIS2_INTF_TO_IMPL(param));
    return AXIS2_SUCCESS;
}

Now param_container.h has the following function pointer type

/**
 * each type which is passed as a param value to a parameter, must have this
 * type of function implemented. When the param value is set this function
 * should also be assigned to param free function
 */
typedef axis2_status_t (*AXIS2_PARAM_VALUE_FREE) (void *param, 
axis2_env_t **env);

Now suppose we set the axis2_dll_desc_t type struct as a param value. We 
need
to have a axis2_dll_desc_as_param_value_free function implemented in
dll_desc.c

axis2_status_t AXIS2_CALL
axis2_dll_desc_as_param_value_free (void *as_param_value,
                                    axis2_env_t **env)
{
    axis2_dll_desc_t *dll_desc = NULL;

    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    dll_desc = (axis2_dll_desc_t *) as_param_value;
    return axis2_dll_desc_free(dll_desc, env);
}

Now we need to assign this to value_free function of param as callback when
value is assigned to parameter.

 status = AXIS2_PARAM_SET_VALUE(impl_info_param, env, dll_desc);
 impl_info_param->ops->value_free = axis2_dll_desc_as_param_value_free;

What I want to say here is that we need to implement the free function as in
dll_desc.c for all the types set as param values. Otherwise param value
is assumed to be axis2_char_t * in the param free function.

thanks
damitha