You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by na...@apache.org on 2009/02/13 10:05:29 UTC

svn commit: r744043 - in /webservices/axis2/trunk/c: include/axis2_msg_recv.h src/core/receivers/msg_recv.c src/core/transport/http/server/apache2/apache2_worker.c

Author: nandika
Date: Fri Feb 13 09:05:29 2009
New Revision: 744043

URL: http://svn.apache.org/viewvc?rev=744043&view=rev
Log:
axis2_msg_recv updated with addition of a service loading function

Modified:
    webservices/axis2/trunk/c/include/axis2_msg_recv.h
    webservices/axis2/trunk/c/src/core/receivers/msg_recv.c
    webservices/axis2/trunk/c/src/core/transport/http/server/apache2/apache2_worker.c

Modified: webservices/axis2/trunk/c/include/axis2_msg_recv.h
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/include/axis2_msg_recv.h?rev=744043&r1=744042&r2=744043&view=diff
==============================================================================
--- webservices/axis2/trunk/c/include/axis2_msg_recv.h (original)
+++ webservices/axis2/trunk/c/include/axis2_msg_recv.h Fri Feb 13 09:05:29 2009
@@ -49,6 +49,7 @@
 #include <axis2_msg_ctx.h>
 #include <axis2_op_ctx.h>
 #include <axis2_svr_callback.h>
+#include <axis2_svc.h>
 
     struct axis2_msg_ctx;
 
@@ -71,6 +72,12 @@
             struct axis2_msg_ctx * in_msg_ctx,
             void *callback_recv_param);
 
+	typedef axis2_status_t(
+		AXIS2_CALL * AXIS2_MSG_RECV_LOAD_AND_INIT_SVC)(
+			axis2_msg_recv_t *msg_recv,
+			const axutil_env_t *env,
+			struct axis2_svc *svc);
+
     /**
      * Deallocate memory
      * @param msg_recv pinter to message receiver
@@ -86,7 +93,7 @@
      * This method is called from axis2_engine_receive method. This method's
      * actual implementation is decided from the create method of the 
      * extended message receiver object. There depending on the synchronous or
-     * asynchronous type, receive metho is assigned with the synchronous or
+     * asynchronous type, receive method is assigned with the synchronous or
      * asynchronous implementation of receive.
      * @see raw_xml_in_out_msg_recv_create method where receive is assigned
      * to receive_sync
@@ -121,7 +128,7 @@
     /**
      * this will create a new service skeleton object
      * @param msg_recv pointer to message receiver
-     * @param env pointer to enviornment struct
+     * @param env pointer to environment struct
      * @param msg_ctx pointer to message context
      * @return service skeleton object
      */
@@ -150,7 +157,7 @@
      * Set the application scope
      * @param msg_recv pointer to message receiver
      * @param env pointer to environment struct
-     * @param scope ointer to scope
+     * @param scope pointer to scope
      * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
      */
     AXIS2_EXTERN axis2_status_t AXIS2_CALL
@@ -162,7 +169,7 @@
     /**
      * Get the application scope
      * @param msg_recv pointer to message receiver
-     * @env pointer to enviornment struct
+     * @env pointer to environment struct
      * @return scope
      */
     AXIS2_EXTERN axis2_char_t *AXIS2_CALL
@@ -207,6 +214,18 @@
         const axutil_env_t * env,
         AXIS2_MSG_RECV_RECEIVE func);
 
+	AXIS2_EXPORT axis2_status_t AXIS2_CALL
+	axis2_msg_recv_set_load_and_init_svc(
+		axis2_msg_recv_t *msg_recv,
+		const axutil_env_t *env,
+		AXIS2_MSG_RECV_LOAD_AND_INIT_SVC func);
+
+	AXIS2_EXPORT axis2_status_t AXIS2_CALL
+	axis2_msg_recv_load_and_init_svc(
+		axis2_msg_recv_t *msg_recv,
+		const axutil_env_t *env,
+		struct axis2_svc *svc);
+
     /**
      * Create new message receiver object. usually this will be called from the
      * extended message receiver object.

Modified: webservices/axis2/trunk/c/src/core/receivers/msg_recv.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/src/core/receivers/msg_recv.c?rev=744043&r1=744042&r2=744043&view=diff
==============================================================================
--- webservices/axis2/trunk/c/src/core/receivers/msg_recv.c (original)
+++ webservices/axis2/trunk/c/src/core/receivers/msg_recv.c Fri Feb 13 09:05:29 2009
@@ -52,7 +52,7 @@
      * This method is called from axis2_engine_receive method. This method's
      * actual implementation is decided from the create method of the 
      * extended message receiver object. There depending on the synchronous or
-     * asynchronous type, receive metho is assigned with the synchronous or
+     * asynchronous type, receive method is assigned with the synchronous or
      * asynchronous implementation of receive.
      * @see raw_xml_in_out_msg_recv_create method where receive is assigned
      * to receive_sync
@@ -67,14 +67,81 @@
     const axutil_env_t * env,
     struct axis2_msg_ctx * in_msg_ctx,
     void *callback_recv_param);
+
+	axis2_status_t(
+	AXIS2_CALL *load_and_init_svc)(
+	axis2_msg_recv_t *msg_recv,
+	const axutil_env_t *env,
+	struct axis2_svc *svc);
+
 };
 
-static axis2_status_t AXIS2_CALL axis2_msg_recv_receive_impl(
+static axis2_status_t AXIS2_CALL 
+axis2_msg_recv_receive_impl(
     axis2_msg_recv_t * msg_recv,
     const axutil_env_t * env,
     axis2_msg_ctx_t * msg_ctx,
     void *callback_recv_param);
 
+static axis2_status_t AXIS2_CALL
+axis2_msg_recv_load_and_init_svc_impl(
+	axis2_msg_recv_t *msg_recv,
+	const axutil_env_t *env,
+	struct axis2_svc *svc)
+{
+	axutil_param_t *impl_info_param = NULL;
+	void *impl_class = NULL;
+
+	AXIS2_ENV_CHECK(env, NULL);
+
+	if (!svc)
+	{
+		return AXIS2_FAILURE;
+	}
+
+	impl_class = axis2_svc_get_impl_class(svc, env);
+	if (impl_class)
+	{
+		return AXIS2_SUCCESS;
+	}
+	/* When we load the DLL we have to make sure that only one thread will load it */
+	axutil_thread_mutex_lock(axis2_svc_get_mutex(svc, env));
+	/* If more than one thread tries to acquires the lock, first thread loads the DLL. 
+	Others should not load the DLL */
+	impl_class = axis2_svc_get_impl_class(svc, env);
+	if (impl_class)
+	{
+		axutil_thread_mutex_unlock(axis2_svc_get_mutex(svc, env));
+		return AXIS2_SUCCESS;
+	}
+	impl_info_param = axis2_svc_get_param(svc, env, AXIS2_SERVICE_CLASS);
+	if (!impl_info_param)
+	{
+		AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_STATE_SVC,
+			AXIS2_FAILURE);
+		axutil_thread_mutex_unlock(axis2_svc_get_mutex(svc, env));
+		return AXIS2_FAILURE;
+	}
+
+	axutil_allocator_switch_to_global_pool(env->allocator);
+
+	axutil_class_loader_init(env);
+
+	impl_class = axutil_class_loader_create_dll(env, impl_info_param);
+	AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "loading the services from msg_recv_load_and_init_svc");
+
+	if (impl_class)
+	{
+		AXIS2_SVC_SKELETON_INIT((axis2_svc_skeleton_t *) impl_class, env);
+	}
+
+	axis2_svc_set_impl_class(svc, env, impl_class);
+
+	axutil_allocator_switch_to_local_pool(env->allocator);
+	axutil_thread_mutex_unlock(axis2_svc_get_mutex(svc, env));
+	return AXIS2_SUCCESS;
+}
+
 AXIS2_EXPORT axis2_msg_recv_t *AXIS2_CALL
 axis2_msg_recv_create(
     const axutil_env_t * env)
@@ -94,6 +161,7 @@
 
     msg_recv->scope = axutil_strdup(env, "app*");
     msg_recv->derived = NULL;
+	msg_recv->load_and_init_svc = axis2_msg_recv_load_and_init_svc_impl;
     msg_recv->receive = axis2_msg_recv_receive_impl;
     return msg_recv;
 }
@@ -150,7 +218,7 @@
 	{
 		/* When we load the DLL we have to make sure that only one thread will load it */
 		axutil_thread_mutex_lock(axis2_svc_get_mutex(svc, env));
-		/* If more than one thread tries to acuire the lock, first thread loads the DLL. 
+		/* If more than one thread tries to acquires the lock, first thread loads the DLL. 
 		Others should not load the DLL */
 		impl_class = axis2_svc_get_impl_class(svc, env);
 		if (impl_class)
@@ -381,7 +449,7 @@
 
     /* Reset the out message context to avoid double freeing at http worker. For example if this is
      * not done here both in and out message context will try to free the transport out stream 
-     * which will result in memeory corruption.
+     * which will result in memory corruption.
      */
     if (!axis2_msg_ctx_is_paused(out_msg_ctx, env) &&
         !axis2_msg_ctx_is_keep_alive(out_msg_ctx, env))
@@ -451,3 +519,22 @@
 {
     return msg_recv->receive(msg_recv, env, msg_ctx, callback_recv_param);
 }
+
+AXIS2_EXPORT axis2_status_t AXIS2_CALL
+axis2_msg_recv_set_load_and_init_svc(
+	 axis2_msg_recv_t *msg_recv,
+	 const axutil_env_t *env,
+	 AXIS2_MSG_RECV_LOAD_AND_INIT_SVC func)
+{
+	msg_recv->load_and_init_svc = func;
+	return AXIS2_SUCCESS;
+}
+
+AXIS2_EXPORT axis2_status_t AXIS2_CALL
+axis2_msg_recv_load_and_init_svc(
+	 axis2_msg_recv_t *msg_recv,
+	 const axutil_env_t *env,
+	 struct axis2_svc *svc)
+{
+	return msg_recv->load_and_init_svc(msg_recv, env, svc);
+}

Modified: webservices/axis2/trunk/c/src/core/transport/http/server/apache2/apache2_worker.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/src/core/transport/http/server/apache2/apache2_worker.c?rev=744043&r1=744042&r2=744043&view=diff
==============================================================================
--- webservices/axis2/trunk/c/src/core/transport/http/server/apache2/apache2_worker.c (original)
+++ webservices/axis2/trunk/c/src/core/transport/http/server/apache2/apache2_worker.c Fri Feb 13 09:05:29 2009
@@ -122,7 +122,8 @@
 			hi; hi = axutil_hash_next(env, hi))
 	{
 		void *impl_class = NULL;
-		axutil_param_t *impl_info_param = NULL;
+		axis2_msg_recv_t *msg_recv = NULL;
+		axutil_hash_t *ops_hash = NULL;
 
 		axutil_hash_this(hi, NULL, NULL, &svc);
 		if (!svc)
@@ -130,16 +131,23 @@
 		impl_class = axis2_svc_get_impl_class(svc, env);
 		if (impl_class)
 			continue;
-		impl_info_param = axis2_svc_get_param(svc, env, AXIS2_SERVICE_CLASS);
-		if (!impl_info_param)
-			continue;
-
-		axutil_class_loader_init(env);
-		impl_class = axutil_class_loader_create_dll(env, impl_info_param);
-		axis2_svc_set_impl_class(svc, env, impl_class);
-		if (impl_class)
+		ops_hash  = axis2_svc_get_all_ops(svc, env);
+		if(ops_hash)
 		{
-			AXIS2_SVC_SKELETON_INIT((axis2_svc_skeleton_t *) impl_class, env);
+			axutil_hash_index_t *op_hi = NULL;
+			void *op = NULL;
+			op_hi = axutil_hash_first(ops_hash, env);
+			if(op_hi)
+			{
+				axutil_hash_this(op_hi, NULL, NULL, &op);
+				if(op)
+				{
+					msg_recv = axis2_op_get_msg_recv(op,env);
+					if(msg_recv)
+						axis2_msg_recv_load_and_init_svc(msg_recv, env, svc);
+				}
+			}
+
 		}
 	}