formatting of modified code is shown as *modified code* in the previous listing. so, please use the code listing given here.

Uthaiyashankar wrote:
Hehe Zhou wrote:
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
Hi Zhou,

The crashing is due to libxml in multi threaded environment. when using libxml in multithreaded environment, (1) you have to call xmlInitParser() in the "main" thread before using any of the libxml2 API. (Refer http://xmlsoft.org/threads.html) (2) should not call xmlCleanupParser() from individual threads. It can be called from "main" thread at the end.

By default, when destroying axis2_stub, it will call xmlCleanupParser(). To disable it, after creating axis2_stub, the option xml_parser_reset should be set to false.

so, the modified code should be as given below.

Regards,
Shankar.

/*
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";
  axis2_options_t* options = NULL;

  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)
  {
      options = axis2_stub_get_options(stub, env);
      if (options)
      {
          axis2_options_set_xml_parser_reset(options, env, AXIS2_FALSE);
      }
      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[])
{
  axiom_xml_reader_init();
  _beginthread(run, 0, NULL);
  Sleep(5000);
  _beginthread(run, 0, NULL);
  Sleep(5000);
  axiom_xml_reader_cleanup();
  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;
}


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to