Hey,

  The following program will crash when the second thread starts up [
_beginthread() in main() ]. A unhandled exception error is reported and
program crashes when 2nd thread starts to run ( 1st thread ends already).
This test program is just a multi-threaded version from Math sample
webservice client code of AXIS2. I just excute Math WS client twice in
different thread. But I don't have this problem if Math WS Client is run in
the same thread for two times. Any idea about this. I checked out the newest
AXIS2C code from SVN. Same problem happened.

Platform: WinXP
Compilor: Visual Studio 2005 Professional


// MathWSClient.cpp : Defines the entry point for the console application.

//

#include "axis2_math_stub.h"

#include <stdio.h>

#include <axiom.h>

#include <axis2_util.h>

#include <axiom_soap.h>

#include <axis2_client.h>

#include <iostream>

using namespace std;

axiom_node_t *

build_om_programatically(const axutil_env_t *env,

const axis2_char_t *operation,

const axis2_char_t *param1,

const axis2_char_t *param2);

void run(void* param)

{

axis2_stub_t *stub = NULL;

axiom_node_t *node = NULL;

axis2_status_t status = AXIS2_FAILURE;

const axutil_env_t *env = NULL;

const axis2_char_t *address = NULL;

const axis2_char_t *client_home = NULL;

axiom_node_t *ret_node = NULL;

const axis2_char_t *operation = "add";

const axis2_char_t *param1 = "40";

const axis2_char_t *param2 = "8";

env = axutil_env_create_all("math_blocking.log", AXIS2_LOG_LEVEL_TRACE);

client_home = AXIS2_GETENV("AXIS2C_HOME");

if (!client_home || !strcmp (client_home, ""))

client_home = "../..";

address = "http://localhost:9090/axis2/services/math";;

printf("Using endpoint : %s\n", address);

printf("\nInvoking operation %s with params %s and %s\n", operation, param1,
param2);

node = build_om_programatically(env, operation, param1, param2);

stub =

axis2_math_stub_create_with_endpoint_uri_and_client_home(env, address,
client_home);

/* create node and invoke math */

if (stub)

{

ret_node = axis2_math_stub_add(stub, env, node);

}

if (ret_node)

{

if (axiom_node_get_node_type(ret_node, env) == AXIOM_ELEMENT)

{

axis2_char_t *result = NULL;

axiom_element_t *result_ele =
(axiom_element_t*)axiom_node_get_data_element(ret_node, env);

result = axiom_element_get_text(result_ele, env, ret_node);

printf("\nResult = %s\n", result);

}

else

{

axiom_xml_writer_t *writer = NULL;

axiom_output_t *om_output = NULL;

axis2_char_t *buffer = NULL;

writer = axiom_xml_writer_create_for_memory(env, NULL, AXIS2_TRUE, 0,

AXIS2_XML_PARSER_TYPE_BUFFER);

om_output = axiom_output_create(env, writer);

axiom_node_serialize(ret_node, env, om_output);

buffer = (axis2_char_t*)axiom_xml_writer_get_xml(writer, env);

printf("\nReceived invalid OM as result : %s\n", buffer);

if (buffer)

{

AXIS2_FREE(env->allocator, buffer);

buffer = NULL;

}

if (om_output)

{

axiom_output_free(om_output, env);

om_output = NULL;

}

axiom_xml_writer_free(writer, env);

}

}

else

{

AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Stub invoke FAILED: Error code:"

" %d :: %s", env->error->error_number,

AXIS2_ERROR_GET_MESSAGE(env->error));

printf("math stub invoke FAILED!\n");

}

if (stub)

{

axis2_stub_free(stub, env);

}

if (env)

{

axutil_env_free((axutil_env_t *) env);

env = NULL;

}

_endthread();

}

int main(int argc, char* argv[])

{

_beginthread(run, 0, NULL);

Sleep(5000);

_beginthread(run, 0, NULL);

Sleep(5000);

return 0;

}

axiom_node_t *

build_om_programatically(const axutil_env_t *env,

const axis2_char_t *operation,

const axis2_char_t *param1,

const axis2_char_t *param2)

{

axiom_node_t *math_om_node = NULL;

axiom_element_t* math_om_ele = NULL;

axiom_node_t* text_om_node = NULL;

axiom_element_t * text_om_ele = NULL;

axiom_namespace_t *ns1 = NULL;



axiom_xml_writer_t *xml_writer = NULL;

axiom_output_t *om_output = NULL;

axis2_char_t *buffer = NULL;

ns1 = axiom_namespace_create(env, "http://ws.apache.org/axis2/services/math";,
"ns1");

math_om_ele = axiom_element_create(env, NULL, operation, ns1,
&math_om_node);

text_om_ele = axiom_element_create(env, math_om_node, "param1", NULL,
&text_om_node);

axiom_element_set_text(text_om_ele, env, param1, text_om_node);

text_om_ele = axiom_element_create(env, math_om_node, "param2", NULL,
&text_om_node);

axiom_element_set_text(text_om_ele, env, param2, text_om_node);

xml_writer = axiom_xml_writer_create_for_memory(env, NULL, AXIS2_FALSE,
AXIS2_FALSE,

AXIS2_XML_PARSER_TYPE_BUFFER);

om_output = axiom_output_create(env, xml_writer);

axiom_node_serialize(math_om_node, env, om_output);

buffer = (axis2_char_t*)axiom_xml_writer_get_xml(xml_writer, env);

AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "\nSending OM node in XML : %s \n",
buffer);

if (om_output)

{

axiom_output_free(om_output, env);

om_output = NULL;

}

return math_om_node;

}

Reply via email to