Hi,
Damitha Kumarage wrote:
Samisa Abeysinghe wrote:
I would alway prefer a reference rather than a copy - specially
something like an array list. It is too costly yo copy.
Rather it is far better to keep track of stuff and release based on
life time. Inside the engine, for most of the cases, just a reference
serves the purpose.
I agree. But think about this. In the scenario I pointed out I'm
creating a completely new operation called create_seq_op.
app_msg_op_desc has flows and when it is freed those flows are freed.
I am not clear how to share these flows between the two operations and
avoid double free with the existing system. Could you please help me
with this case?
OK I'll give more details. Currently how flows are added to operation is
like this,
in svc client
info = AXIS2_CONF_GET_PHASES_INFO(svc_client_impl->conf, env);
AXIS2_PHASES_INFO_SET_OP_PHASES(info, env, op_out_in);
Then what happen in phases info is that it will create a new in_phases
array list and fill that with newly created
phases. Currently these phases are freed when msg related to that op is
freed. What I can do is, instead of keeping
those phases in msg I can keep them in phases info itself and do like this,
phase = axis2_hash_get(phases_info_impl->op_in_phases,
phase_name,
AXIS2_HASH_KEY_STRING);
if(!phase)
{
phase = axis2_phase_create(env, phase_name);
axis2_hash_set(phases_info_impl->op_in_phases, phase_name,
AXIS2_HASH_KEY_STRING, phase);
}
AXIS2_ARRAY_LIST_ADD(op_in_phases, env, phase);
where op_in_phases is the array_list set as flow in the msg. So now when
msg is freed, only op_in_phases array list is
freed and phases are freed by the phases_info. Also if we don't want a
generic array copying function I can have
a flow copy function in phases_info.c. It just do a shallow copy of the
passed flow. Since the operation specific
flow naturally should belong to the operation(msg) it is natural to give
a shallow copy of the flow to the new operation.
So my problematic scenario is solved like this
outflow = AXIS2_OP_GET_OUT_FLOW(app_msg_op_desc, env);
new_outflow = axis2_phases_info_flow_copy(env, outflow); /* do a shalloy
copy */
AXIS2_OP_SET_OUT_FLOW(create_seq_op, env, new_outflow);
So now each operation free(shallow) it's own flow, but the phases are
freed by the phases_info.
Please see the attached diffs for more details of the changes
Damitha
Damitha
Samisa...
Damitha Kumarage wrote:
Hi,
In a situation like this
outflow = AXIS2_OP_GET_OUT_FLOW(app_msg_op_desc, env);
AXIS2_OP_SET_OUT_FLOW(create_seq_op, env, outflow);
Simply getting and setting the arraylist like this would leave to
seg faults
when both operations try to free the flow. Therefore I would like to
have
a new function in utilities
axis2_status_t AXIS2_CALL
axis2_utils_array_copy(
const axis2_env_t *env,
const axis2_array_list_t *array_to_copy)
{
int size = 0, i = 0;
axis2_array_list_t *new_array = NULL;
if(array_to_copy)
size = AXIS2_ARRAY_LIST_SIZE(array_to_copy, env);
if(size > 0)
{
new_array = axis2_array_list_create(env, 0);
if(!new_array)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY,
AXIS2_FAILURE);
return AXIS2_FAILURE;
}
}
for(i = 0; i < size; i++)
{
void *item = AXIS2_ARRAY_LIST_GET(array_to_copy, env);
AXIS2_ARRAY_LIST_ADD(new_array, env, item);
}
return new_array;
}
Or may be we can have this function in array_list it self
Damitha
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
25a26
>
26a28
>
27a30
>
28a32
>
30,33d33
< axis2_hash_t *op_in_phases;
< axis2_hash_t *op_out_phases;
< axis2_hash_t *op_in_faultphases;
< axis2_hash_t *op_out_faultphases;
140,143d139
< phases_info_impl->op_in_phases = NULL;
< phases_info_impl->op_out_phases = NULL;
< phases_info_impl->op_in_faultphases = NULL;
< phases_info_impl->op_out_faultphases = NULL;
234,273d229
< if (phases_info_impl->op_in_phases)
< {
< axis2_hash_index_t *i = NULL;
< for (i = axis2_hash_first (phases_info_impl->op_in_phases, env); i; i
=
< axis2_hash_next (env, i))
< {
< void *v = NULL;
< axis2_phase_t *phase = NULL;
<
< axis2_hash_this (i, NULL, NULL, &v);
< phase = (axis2_phase_t *) v;
< if(phase)
< {
< AXIS2_PHASE_FREE(phase, env);
< phase = NULL;
< }
< }
< axis2_hash_free(phases_info_impl->op_in_phases, env);
< phases_info_impl->op_in_phases = NULL;
< }
< if (phases_info_impl->op_out_phases)
< {
< axis2_hash_index_t *i = NULL;
< for (i = axis2_hash_first (phases_info_impl->op_out_phases, env); i;
i =
< axis2_hash_next (env, i))
< {
< void *v = NULL;
< axis2_phase_t *phase = NULL;
<
< axis2_hash_this (i, NULL, NULL, &v);
< phase = (axis2_phase_t *) v;
< if(phase)
< {
< AXIS2_PHASE_FREE(phase, env);
< phase = NULL;
< }
< }
< axis2_hash_free(phases_info_impl->op_out_phases, env);
< phases_info_impl->op_out_phases = NULL;
< }
437,444c393
< phase = axis2_hash_get(phases_info_impl->op_in_phases,
< AXIS2_PHASE_POLICY_DETERMINATION, AXIS2_HASH_KEY_STRING);
< if(!phase)
< {
< phase = axis2_phase_create(env, AXIS2_PHASE_POLICY_DETERMINATION);
< axis2_hash_set(phases_info_impl->op_in_phases,
< AXIS2_PHASE_POLICY_DETERMINATION, AXIS2_HASH_KEY_STRING, phase);
< }
---
> phase = axis2_phase_create(env, AXIS2_PHASE_POLICY_DETERMINATION);
465,467c414,416
< 0 == AXIS2_STRCMP(AXIS2_PHASE_PRE_DISPATCH, phase_name) ||
< 0 == AXIS2_STRCMP(AXIS2_PHASE_DISPATCH, phase_name) ||
< 0 == AXIS2_STRCMP(AXIS2_PHASE_POST_DISPATCH, phase_name))
---
> 0 == AXIS2_STRCMP(AXIS2_PHASE_PRE_DISPATCH, phase_name) ||
> 0 == AXIS2_STRCMP(AXIS2_PHASE_DISPATCH, phase_name) ||
> 0 == AXIS2_STRCMP(AXIS2_PHASE_POST_DISPATCH, phase_name))
473,475c422,423
< phase = axis2_hash_get(phases_info_impl->op_in_phases,
phase_name,
< AXIS2_HASH_KEY_STRING);
< if(!phase)
---
> phase = axis2_phase_create(env, phase_name);
> if (phase)
477,479c425
< phase = axis2_phase_create(env, phase_name);
< axis2_hash_set(phases_info_impl->op_in_phases, phase_name,
< AXIS2_HASH_KEY_STRING, phase);
---
> status = AXIS2_ARRAY_LIST_ADD(op_in_phases, env, phase);
481d426
< status = AXIS2_ARRAY_LIST_ADD(op_in_phases, env, phase);
540,548c485,487
< phase = axis2_hash_get(phases_info_impl->op_out_phases,
phase_name,
< AXIS2_HASH_KEY_STRING);
< if(!phase)
< {
< phase = axis2_phase_create(env, phase_name);
< axis2_hash_set(phases_info_impl->op_out_phases, phase_name,
< AXIS2_HASH_KEY_STRING, phase);
< }
< status = AXIS2_ARRAY_LIST_ADD(op_out_phases, env, phase);
---
> phase = axis2_phase_create(env, phase_name);
> if (phase)
> status = AXIS2_ARRAY_LIST_ADD(op_out_phases, env, phase);
569,577c508,510
< phase = axis2_hash_get(phases_info_impl->op_out_phases,
< AXIS2_PHASE_POLICY_DETERMINATION, AXIS2_HASH_KEY_STRING);
< if(!phase)
< {
< phase = axis2_phase_create(env, AXIS2_PHASE_POLICY_DETERMINATION);
< axis2_hash_set(phases_info_impl->op_out_phases,
< AXIS2_PHASE_POLICY_DETERMINATION, AXIS2_HASH_KEY_STRING, phase);
< }
< status = AXIS2_ARRAY_LIST_ADD(op_out_phases, env, phase);
---
> phase = axis2_phase_create(env, AXIS2_PHASE_POLICY_DETERMINATION);
> if (phase)
> status = AXIS2_ARRAY_LIST_ADD(op_out_phases, env, phase);
596,604c529,531
< phase = axis2_hash_get(phases_info_impl->op_out_phases,
< AXIS2_PHASE_MESSAGE_OUT, AXIS2_HASH_KEY_STRING);
< if(!phase)
< {
< phase = axis2_phase_create(env, AXIS2_PHASE_MESSAGE_OUT);
< axis2_hash_set(phases_info_impl->op_out_phases,
< AXIS2_PHASE_MESSAGE_OUT, AXIS2_HASH_KEY_STRING, phase);
< }
< status = AXIS2_ARRAY_LIST_ADD(op_out_phases, env, phase);
---
> phase = axis2_phase_create(env, AXIS2_PHASE_MESSAGE_OUT);
> if (phase)
> status = AXIS2_ARRAY_LIST_ADD(op_out_phases, env, phase);
662,670c589,591
< phase = axis2_hash_get(phases_info_impl->op_in_faultphases,
phase_name,
< AXIS2_HASH_KEY_STRING);
< if(!phase)
< {
< phase = axis2_phase_create(env, phase_name);
< axis2_hash_set(phases_info_impl->op_in_faultphases,
< phase_name, AXIS2_HASH_KEY_STRING, phase);
< }
< status = AXIS2_ARRAY_LIST_ADD(op_in_faultphases, env, phase);
---
> phase = axis2_phase_create(env, phase_name);
> if (phase)
> status = AXIS2_ARRAY_LIST_ADD(op_in_faultphases, env, phase);
728,736c649,651
< phase = axis2_hash_get(phases_info_impl->op_out_faultphases,
phase_name,
< AXIS2_HASH_KEY_STRING);
< if(!phase)
< {
< phase = axis2_phase_create(env, phase_name);
< axis2_hash_set(phases_info_impl->op_out_faultphases,
< phase_name, AXIS2_HASH_KEY_STRING, phase);
< }
< status = AXIS2_ARRAY_LIST_ADD(op_out_faultphases, env, phase);
---
> phase = axis2_phase_create(env, phase_name);
> if (phase)
> status = AXIS2_ARRAY_LIST_ADD(op_out_faultphases, env, phase);
835,861d749
< axis2_array_list_t *AXIS2_CALL
< axis2_flow_copy(
< const axis2_env_t *env,
< const axis2_array_list_t *flow_to_copy)
< {
< int size = 0, i = 0;
< axis2_array_list_t *new_flow = NULL;
< if(flow_to_copy)
< size = AXIS2_ARRAY_LIST_SIZE((axis2_array_list_t *) flow_to_copy,
env);
< if(size > 0)
< {
< new_flow = axis2_array_list_create(env, 0);
< if(!new_flow)
< {
< AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
< return AXIS2_FAILURE;
< }
< }
< for(i = 0; i < size; i++)
< {
< void *item = AXIS2_ARRAY_LIST_GET((axis2_array_list_t *) flow_to_copy,
< env, i);
< AXIS2_ARRAY_LIST_ADD(new_flow, env, item);
< }
< return new_flow;
< }
<
215c215
< if (msg_impl->flow)
---
> /*if (msg_impl->flow)
216a217,231
> int i = 0;
> int size = 0;
> size = AXIS2_ARRAY_LIST_SIZE(msg_impl->flow, env);
> for (i = 0; i < size; i++)
> {
> axis2_phase_t *phase = NULL;
> phase = (axis2_phase_t *)(AXIS2_ARRAY_LIST_GET(msg_impl->flow,
> env,
> i));
> if (phase)
> {
> AXIS2_PHASE_FREE(phase, env);
> phase = NULL;
> }
>
> }
219c234
< }
---
> }*/
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]