[prev in list] [next in list] [prev in thread] [next in thread] 

List:       apache-modperl
Subject:    Re: [mp2]Perl_parse free some resources
From:       "Dinesh Premalal" <xydinesh () gmail ! com>
Date:       2008-06-05 20:53:40
Message-ID: e8ff6030806051341k1d40993dtfa4281c346e03567 () mail ! gmail ! com
[Download RAW message or body]

and my functions are.

static axiom_node_t *
wsf_xml_msg_recv_invoke_other (axis2_msg_recv_t* msg_recv,
                               const axutil_env_t* env,
                               wsf_svc_info_t* svc_info,
                               axis2_msg_ctx_t* in_msg_ctx,
                               axis2_msg_ctx_t* out_msg_ctx,
                               axis2_char_t* function_name,
                               axis2_char_t* class_name)
{
    AXIS2_PARAM_CHECK (env->error, svc_info, NULL);
    AXIS2_PARAM_CHECK (env->error, in_msg_ctx, NULL);
    AXIS2_PARAM_CHECK (env->error, out_msg_ctx, NULL);

    axiom_node_t *node = NULL;
    axiom_node_t *om_node = NULL;
    axiom_soap_envelope_t *envelope = NULL;
    axiom_soap_body_t *body = NULL;
    axis2_char_t *retstr = NULL;

    /* extracting payload from the soap message */
    envelope = axis2_msg_ctx_get_soap_envelope (in_msg_ctx, env);
    body = axiom_soap_envelope_get_body (envelope, env);
    om_node = axiom_soap_body_get_base_node (body, env);
    om_node = axiom_node_get_first_child (om_node, env);

    axis2_char_t *embedding[] = {"", NULL};
    if (!svc_info->script_filename)
    {
        AXIS2_LOG_ERROR (env->log, AXIS2_LOG_SI,
                         "perl function invocation failed, script_file name
not found for \
service %s", svc_info->svc_name);
        return NULL;
    }
    /* passing script real path into perl interpreter. */
    embedding[1] = svc_info->script_filename;

    my_perl = perl_alloc();
    perl_construct( my_perl );
    /* loading WSO2::WSF::C and WSO2::WSF::Server using dynamic loader */
    eval_pv("use WSO2::WSF::C", FALSE);
    eval_pv("use WSO2::WSF::Server", FALSE);

    if (perl_parse(my_perl, xs_init, 2, embedding, NULL))
    {
        AXIS2_LOG_ERROR (env->log, AXIS2_LOG_SI, "perl_parse method
failed");
        return NULL;
    }

    perl_run(my_perl);

    if (SvTRUE(ERRSV))
    {
        AXIS2_LOG_DEBUG (env->log, AXIS2_LOG_SI, "invoke perl function
failed");
    }

    retstr = invoke_perl_function(env, om_node, function_name, NULL);

    if (retstr)
    {
        node = wsf_util_deserialize_buffer (env, retstr);
    }

    perl_destruct(my_perl);
    perl_free(my_perl);
    return node;
}

static axis2_char_t *
invoke_perl_function(const axutil_env_t *env, axiom_node_t *om_node,
                     axis2_char_t *operation, axis2_char_t *class_name)
{
    int count = 0;
    axis2_char_t *inmsg = NULL;
    axis2_char_t *ret = NULL;

    if (!operation)
    {
        AXIS2_LOG_DEBUG (env->log, AXIS2_LOG_SI,
                         "invoking perl function failed, operation not
available");
        return;
    }

    if (om_node)
    {
        inmsg = axiom_node_to_string (om_node, env);
    }

    dSP ;

    ENTER ;
    SAVETMPS ;

    PUSHMARK(SP) ;
    XPUSHs(sv_2mortal(newSVpv(inmsg, 0)));
    PUTBACK;

    /* calling user perl function which returns a scaler value */
    count = perl_call_pv(operation, G_SCALAR);
    SPAGAIN;

    if (count != 1)
    {
        croak("perl function invocation failed") ;
        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
                        "perl function %s invocation failed", operation);

    }

    /* we pop string from the stack and doing strdup on it */
    ret = savepv(POPpx);

    PUTBACK;
    FREETMPS ;
    LEAVE ;
    return ret;
}


/* xs_init is for support dynamic loading of modules */
static void
xs_init(pTHX)
{
    char *file = __FILE__;
    dXSUB_SYS;

    /* DynaLoader is a special case */
    newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
}

thanks,
Dinesh
-- 
http://nethu.org/

[Attachment #3 (text/html)]

and my functions are.<br><br>static axiom_node_t *<br>wsf_xml_msg_recv_invoke_other \
(axis2_msg_recv_t* msg_recv,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
const axutil_env_t* env,<br> \
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n \
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
wsf_svc_info_t* svc_info,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb \
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
axis2_msg_ctx_t* in_msg_ctx,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
axis2_msg_ctx_t* out_msg_ctx,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp \
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
axis2_char_t* function_name,<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n \
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
axis2_char_t* class_name)<br>{<br>&nbsp;&nbsp;&nbsp; AXIS2_PARAM_CHECK \
(env-&gt;error, svc_info, NULL);<br>&nbsp;&nbsp;&nbsp; AXIS2_PARAM_CHECK \
(env-&gt;error, in_msg_ctx, NULL);<br>&nbsp;&nbsp;&nbsp; AXIS2_PARAM_CHECK \
(env-&gt;error, out_msg_ctx, NULL);<br>

<br>&nbsp;&nbsp;&nbsp; axiom_node_t *node = NULL;<br>&nbsp;&nbsp;&nbsp; axiom_node_t \
*om_node = NULL;<br>&nbsp;&nbsp;&nbsp; axiom_soap_envelope_t *envelope = \
NULL;<br>&nbsp;&nbsp;&nbsp; axiom_soap_body_t *body = NULL;<br>&nbsp;&nbsp;&nbsp; \
axis2_char_t *retstr = NULL;<br><br>&nbsp;&nbsp;&nbsp; /* extracting payload from the \
soap message */<br>

&nbsp;&nbsp;&nbsp; envelope = axis2_msg_ctx_get_soap_envelope (in_msg_ctx, \
env);<br>&nbsp;&nbsp;&nbsp; body = axiom_soap_envelope_get_body (envelope, \
env);<br>&nbsp;&nbsp;&nbsp; om_node = axiom_soap_body_get_base_node (body, \
env);<br>&nbsp;&nbsp;&nbsp; om_node = axiom_node_get_first_child (om_node, env);<br>

<br>&nbsp;&nbsp;&nbsp; axis2_char_t *embedding[] = {&quot;&quot;, \
NULL};<br>&nbsp;&nbsp;&nbsp; if (!svc_info-&gt;script_filename)<br>&nbsp;&nbsp;&nbsp; \
{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AXIS2_LOG_ERROR (env-&gt;log, \
AXIS2_LOG_SI, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
&quot;perl function invocation failed, script_file name not found for \<br>

service %s&quot;, svc_info-&gt;svc_name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
return NULL;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; /* passing script real \
path into perl interpreter. */<br>&nbsp;&nbsp;&nbsp; embedding[1] = \
svc_info-&gt;script_filename;<br><br>&nbsp;&nbsp;&nbsp; my_perl = perl_alloc();<br>

&nbsp;&nbsp;&nbsp; perl_construct( my_perl );<br>&nbsp;&nbsp;&nbsp; /* loading \
WSO2::WSF::C and WSO2::WSF::Server using dynamic loader */<br>&nbsp;&nbsp;&nbsp; \
eval_pv(&quot;use WSO2::WSF::C&quot;, FALSE);<br>&nbsp;&nbsp;&nbsp; eval_pv(&quot;use \
WSO2::WSF::Server&quot;, FALSE);<br>

<br>&nbsp;&nbsp;&nbsp; if (perl_parse(my_perl, xs_init, 2, embedding, \
NULL))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
AXIS2_LOG_ERROR (env-&gt;log, AXIS2_LOG_SI, &quot;perl_parse method \
failed&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return \
NULL;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; perl_run(my_perl);<br>

<br>&nbsp;&nbsp;&nbsp; if (SvTRUE(ERRSV))<br>&nbsp;&nbsp;&nbsp; \
{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AXIS2_LOG_DEBUG (env-&gt;log, \
AXIS2_LOG_SI, &quot;invoke perl function failed&quot;);<br>&nbsp;&nbsp;&nbsp; \
}<br><br>&nbsp;&nbsp;&nbsp; retstr = invoke_perl_function(env, om_node, \
function_name, NULL);<br>

<br>&nbsp;&nbsp;&nbsp; if (retstr)<br>&nbsp;&nbsp;&nbsp; \
{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = wsf_util_deserialize_buffer \
(env, retstr);<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; \
perl_destruct(my_perl);<br>&nbsp;&nbsp;&nbsp; \
perl_free(my_perl);<br>&nbsp;&nbsp;&nbsp; return node;<br>}<br><br>static \
axis2_char_t *<br>invoke_perl_function(const axutil_env_t *env, axiom_node_t \
*om_node, <br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
axis2_char_t *operation, axis2_char_t *class_name)<br>{<br>&nbsp;&nbsp;&nbsp; int \
count = 0;<br>&nbsp;&nbsp;&nbsp; axis2_char_t *inmsg = NULL;<br>&nbsp;&nbsp;&nbsp; \
axis2_char_t *ret = NULL;<br><br>&nbsp;&nbsp;&nbsp; if \
(!operation)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
AXIS2_LOG_DEBUG (env-&gt;log, AXIS2_LOG_SI, <br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
&quot;invoking perl function failed, operation not \
available&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
return;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; if \
(om_node)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inmsg \
= axiom_node_to_string (om_node, env);<br>&nbsp;&nbsp;&nbsp; }<br>

<br>&nbsp;&nbsp;&nbsp; dSP ;<br><br>&nbsp;&nbsp;&nbsp; ENTER ;<br>&nbsp;&nbsp;&nbsp; \
SAVETMPS ;<br><br>&nbsp;&nbsp;&nbsp; PUSHMARK(SP) ;<br>&nbsp;&nbsp;&nbsp; \
XPUSHs(sv_2mortal(newSVpv<div>(inmsg, 0)));<br>&nbsp;&nbsp;&nbsp; \
PUTBACK;<br><br>&nbsp;&nbsp;&nbsp; /* calling user perl function which returns a \
scaler value */<br> &nbsp;&nbsp;&nbsp; count = perl_call_pv(operation, G_SCALAR);<br>
&nbsp;&nbsp;&nbsp; SPAGAIN;<br><br>&nbsp;&nbsp;&nbsp; if (count != \
1)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
croak(&quot;perl function invocation failed&quot;) \
;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AXIS2_LOG_ERROR(env-&gt;log, \
AXIS2_LOG_SI, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \
&quot;perl function %s invocation failed&quot;, operation);<br>

<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; /* we pop string from the stack \
and doing strdup on it */<br>&nbsp;&nbsp;&nbsp; ret = \
savepv(POPpx);<br><br>&nbsp;&nbsp;&nbsp; PUTBACK;<br>&nbsp;&nbsp;&nbsp; FREETMPS \
;<br>&nbsp;&nbsp;&nbsp; LEAVE ;<br>&nbsp;&nbsp;&nbsp; return ret;<br>}<br><br><br>/* \
xs_init is for support dynamic loading of modules */<br>

static void<br>xs_init(pTHX)<br>{<br>&nbsp;&nbsp;&nbsp; char *file = \
__FILE__;<br>&nbsp;&nbsp;&nbsp; dXSUB_SYS;<br><br>&nbsp;&nbsp;&nbsp; /* DynaLoader is \
a special case */<br>&nbsp;&nbsp;&nbsp; \
newXS(&quot;DynaLoader::boot_DynaLoader&quot;, boot_DynaLoader, file);<br>}<br></div> \
<br>thanks,<br>Dinesh<br>-- <br><a href="http://nethu.org/">http://nethu.org/</a>



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic