You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@etch.apache.org by fi...@apache.org on 2011/07/21 18:12:18 UTC
svn commit: r1149251 - in
/incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler:
base_c.vm base_h.vm remote_client_c.vm remote_client_h.vm stub_c.vm
Author: fitzner
Date: Thu Jul 21 16:12:15 2011
New Revision: 1149251
URL: http://svn.apache.org/viewvc?rev=1149251&view=rev
Log:
ETCH-157 binding-c: add @Signal support
Patch is from Aleksandar Kanchev <ka...@itestra.com>
Modified:
incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/base_c.vm
incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/base_h.vm
incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/remote_client_c.vm
incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/remote_client_h.vm
incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/stub_c.vm
Modified: incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/base_c.vm
URL: http://svn.apache.org/viewvc/incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/base_c.vm?rev=1149251&r1=1149250&r2=1149251&view=diff
==============================================================================
--- incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/base_c.vm (original)
+++ incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/base_c.vm Thu Jul 21 16:12:15 2011
@@ -22,7 +22,16 @@
// $now
// This file is automatically created and should not be edited!
+#set($hasSignals = false)
+#if ($intf.signals( false ).hasNext())
+#set($hasSignals = true)
+#end
+#if ($hasSignals && $helper.isServer($mc))
+\#include "$helper.getImplFileNameH($intf, $suffix)"
+\#include "$helper.getRemoteFileNameH($intf, $helper.getRemoteDirectionName($mc))"
+#else
\#include "$helper.getBaseFileNameH($intf, $suffix)"
+#end
\#include "etch_objecttypes.h"
\#include "etch_general.h"
\#include "etch_url.h"
@@ -156,6 +165,60 @@ int destroy_$helper.getBaseName( $intf,
return 0;
}
+
+/* - - - - - - - - - - - - - -
+ * service method stubs
+ * - - - - - - - - - - - - - -
+ */
+
+#set($whoType = "etch_who*")
+#set($whoName = "sender")
+#foreach( $n in $intf.iterator() )
+#if ($n.isMessage() && $n.hasSignal() && $n.isMsgDirServer())
+#set ($methodReturn = "$helper.getPointerTypeName( $n.type() )")
+#set ($methodName = "$helper.getServiceName($intf)_ex_def_$n.name()")
+#set ($methodParams = "void* thisx")
+#foreach( $p in $n.iterator() )
+#set ($methodParams = "$methodParams, $helper.getTypeName( $p.type() ) $p.name()")
+#end
+#set ($methodParams = "$methodParams, $whoType $whoName")
+$methodReturn $methodName($methodParams)
+{
+ $helper.getImplName($intf, $suffix)* server = ($helper.getImplName($intf, $suffix)*)thisx;
+ etch_exception* exception = NULL;
+ int errorcode;
+
+#foreach( $p in $n.iterator())
+#if($p.type().isBuiltin())
+ etch_object_destroy($p.name());
+ $p.name() = NULL;
+#else
+ etch_object_destroy($p.name());
+#end
+#end
+#set ($subscriptionMethodPrefix = 'remove')
+#if ($n.isSignalSubscribeMessage())
+#set ($subscriptionMethodPrefix = 'add')
+#end
+
+#set ($clientVar = "server->$helper.getDirectionName($helper.getRemoteDirection($mc))")
+#set ($subscriptionMethod = "${subscriptionMethodPrefix}_$n.getMessageSignal().getSignalName()_subscriber")
+ errorcode = ${clientVar}->$subscriptionMethod($clientVar, $whoName);
+ if (errorcode != ETCH_SUCCESS) {
+ exception = new_etch_exception_from_errorcode(errorcode);
+ ETCH_ASSERT(exception != NULL);
+ }
+
+ if (errorcode == ETCH_ENOMEM)
+ etch_exception_set_message(exception, new_stringw(L"out of memory"));
+ else if (errorcode == ETCH_ERROR)
+ etch_exception_set_message(exception, new_stringw(L"unable to $subscriptionMethodPrefix subscriber"));
+
+ return exception;
+}
+
+#end
+#end
#end
## client base
#if ($helper.isClient($mc))
Modified: incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/base_h.vm
URL: http://svn.apache.org/viewvc/incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/base_h.vm?rev=1149251&r1=1149250&r2=1149251&view=diff
==============================================================================
--- incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/base_h.vm (original)
+++ incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/base_h.vm Thu Jul 21 16:12:15 2011
@@ -39,6 +39,23 @@ extern "C" {
#endif
extern unsigned short CLASSID_$helper.getBaseName( $intf, $suffix ).toUpperCase()_BASE;
+#if($helper.isServer($mc))
+##generate typedefs for the server signal methods
+#set($whoType = "etch_who*")
+#set($whoName = "sender")
+#foreach( $n in $intf.iterator() )
+#if ($n.isMessage() && $n.isMsgDir($mc) && $n.hasSignal() && $n.isMsgDirServer())
+#set ($methodReturn = "$helper.getPointerTypeName( $n.type() )")
+#set ($methodName = "$helper.getServiceName($intf)_ex_$n.name()")
+#set ($methodParams = "void* thisx")
+#foreach( $p in $n.iterator() )
+#set ($methodParams = "$methodParams, $helper.getTypeName( $p.type() ) $p.name()")
+#end
+#set ($methodParams = "$methodParams, $whoType $whoName")
+typedef $methodReturn (*$methodName)($methodParams);
+#end
+#end
+#end
//typedef struct $helper.getImplName( $intf, $suffix ) $helper.getImplName( $intf, $suffix );
@@ -86,6 +103,20 @@ typedef struct i_$helper.getBaseName( $i
i_$helper.getBaseName( $intf, $suffix )* new_$helper.getBaseName( $intf, $suffix )_base (void* implobj, i_$helper.getIntfName( $intf )*);
i_$helper.getBaseName( $intf, $suffix )* new_$helper.getRemoteName( $intf, $suffix )_base (void* implobj, i_$helper.getIntfName( $intf )*);
int destroy_$helper.getBaseName( $intf, $suffix )_base (void*);
+
+##generate method prototypes for the default server signal handlers
+#foreach( $n in $intf.iterator() )
+#if ($n.isMessage() && $n.isMsgDir($mc) && $n.hasSignal() && $n.isMsgDirServer())
+#set ($methodReturn = "$helper.getPointerTypeName( $n.type() )")
+#set ($methodName = "$helper.getServiceName($intf)_ex_def_$n.name()")
+#set ($methodParams = "void* thisx")
+#foreach( $p in $n.iterator() )
+#set ($methodParams = "$methodParams, $helper.getTypeName( $p.type() ) $p.name()")
+#end
+#set ($methodParams = "$methodParams, $whoType $whoName")
+$methodReturn $methodName($methodParams);
+#end
+#end
#end
#if($helper.isClient( $mc ))
i_$helper.getBaseName($intf, $suffix)* new_$helper.getBaseName($intf, $suffix)_base();
Modified: incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/remote_client_c.vm
URL: http://svn.apache.org/viewvc/incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/remote_client_c.vm?rev=1149251&r1=1149250&r2=1149251&view=diff
==============================================================================
--- incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/remote_client_c.vm (original)
+++ incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/remote_client_c.vm Thu Jul 21 16:12:15 2011
@@ -17,6 +17,12 @@
## under the License.
##
+#set($whoType = "etch_who*")
+#set($whoName = "whoto")
+#set($hasSignals = false)
+#if ($intf.signals( false ).hasNext())
+#set($hasSignals = true)
+#end
// This file automatically generated by:
// $version
// $now
@@ -40,6 +46,9 @@
\#include "etch_log.h"
\#include "etch_objecttypes.h"
\#include "etch_general.h"
+#if ($hasSignals)
+\#include "etch_map.h"
+#end
static const char* LOG_CATEGORY = "$helper.getRemoteName($intf, $suffix)";
@@ -53,6 +62,16 @@ char* $helper.getServiceName($intf).toUp
#if (!$n.isHidden())
#if ($n.isMsgDir($mc) || $n.isMsgDirBoth())
+#if ($n.hasSignal())
+#set ($methodReturn = "$helper.getPointerTypeName( $n.type() )")
+#set ($methodName = "$helper.getRemoteName($intf, '')_client_ex_$n.name()")
+#set ($methodParams = "void*")
+#foreach( $p in $n.iterator() )
+#set ($methodParams = "$methodParams, $helper.getTypeName( $p.type() ) $p.name()")
+#end
+#set ($methodParams = "$methodParams, $whoType $whoName")
+$methodReturn $methodName($methodParams);
+#end
#set ($sb = "$helper.getPointerTypeName($n.type()) $helper.getRemoteName($intf, '')_client_$n.name() (void*")
#foreach( $p in $n.iterator() )
#set ( $sb = "$sb, $helper.getTypeName($p.type()) $p.name()")
@@ -74,6 +93,15 @@ $sb
#end
#end
#end
+## add/remove subscriber method prototypes
+#if ($hasSignals)
+
+#foreach( $s in $intf.signals( false ) )
+
+int $helper.getRemoteName($intf, '')_client_add_$s.getSignalName()_subscriber(void* thisx, $whoType subscriber);
+int $helper.getRemoteName($intf, '')_client_remove_$s.getSignalName()_subscriber(void* thisx, $whoType subscriber);
+#end
+#end
/* generated signatures */
@@ -117,6 +145,9 @@ $helper.getRemoteName($intf, $suffix)* n
#if (!$n.isHidden())
#if ($n.isMsgDir($mc) || $n.isMsgDirBoth())
rc->$n.name() = $helper.getRemoteName($intf, '')_client_$n.name();
+#if ($n.hasSignal())
+ rc->_$n.name() = $helper.getRemoteName($intf, '')_client_ex_$n.name();
+#end
#if (!$n.isOneway())
rc->async_begin_$n.name() = $helper.getRemoteName($intf, '')_begin_client_$n.name();
rc->async_end_$n.name() = $helper.getRemoteName($intf, '')_end_client_$n.name();
@@ -145,6 +176,12 @@ $helper.getRemoteName($intf, $suffix)* n
#end
#end
+#foreach( $s in $intf.signals( false ) )
+ rc->$s.getSignalName()_subscribers = new_etch_set(0);
+ rc->add_$s.getSignalName()_subscriber = $helper.getRemoteName($intf, '')_client_add_$s.getSignalName()_subscriber;
+ rc->remove_$s.getSignalName()_subscriber = $helper.getRemoteName($intf, '')_client_remove_$s.getSignalName()_subscriber;
+
+#end
return rc;
}
@@ -164,6 +201,12 @@ int destroy_$helper.getRemoteName($intf,
remote->remote_base = NULL;
etch_object_destroy(remote->client_base);
remote->client_base = NULL;
+#if ($hasSignals)
+
+#foreach( $s in $intf.signals( false ) )
+ etch_object_destroy(remote->$s.getSignalName()_subscribers);
+#end
+#end
}
return destroy_objectex((etch_object*)remote);
}
@@ -464,8 +507,16 @@ void* $helper.getRemoteName($intf, '')_e
return NULL;
}
+#set ($signalSuffix = '')
+#set ($signalArg = '')
+#set ($signalParam = 'NULL')
+#if ($n.hasSignal())
+#set ($signalSuffix = '_ex')
+#set ($signalArg = ", $whoType $whoName")
+#set ($signalParam = "$whoName")
+#end
/**
- * $helper.getRemoteName($intf, '')_$n.name()()
+ * $helper.getRemoteName($intf, '')_client${signalSuffix}_$n.name()()
* $helper.getIntfName($intf).$n.name() remote 1-way method call.
* sends $helper.getIntfName($intf).$n.name() message and does not wait for a result. if server implementation
* code throws an exception, the exception arrives via session_notify override if any.
@@ -473,11 +524,11 @@ void* $helper.getRemoteName($intf, '')_e
* @param x etch_string caller relinquishes.
* @return integer transport result code cast to void*.
*/
-#set ($sb = "$helper.getPointerTypeName($n.type()) $helper.getRemoteName($intf, '')_client_$n.name()(void* thisx")
+#set ($sb = "$helper.getPointerTypeName($n.type()) $helper.getRemoteName($intf, '')_client${signalSuffix}_$n.name()(void* thisx")
#foreach( $p in $n.iterator() )
#set ( $sb = "$sb, $helper.getTypeName($p.type()) $p.name()")
#end
-#set ($sb = "$sb)")
+#set ($sb = "$sb$signalArg)")
$sb
{
$helper.getRemoteName($intf, $suffix)* remote = ($helper.getRemoteName($intf, $suffix)*)thisx;
@@ -486,14 +537,119 @@ $sb
#foreach( $p in $n.iterator() )
#set ( $sb = "$sb, $p.name()")
#end
-#set ($sb = "$sb, NULL);")
+#set ($sb = "$sb, $signalParam);")
$sb
return _resultobj;
}
+#if ($n.hasSignal() && $n.isMsgDirClient())
+
+/**
+ * $helper.getRemoteName($intf, '')_client_$n.name()()
+ * wrapper for $helper.getRemoteName($intf, '')_client${signalSuffix}_$n.name()().
+ */
+#set ($methodReturn = "$helper.getPointerTypeName( $n.type() )")
+#set ($methodName = "$helper.getRemoteName($intf, '')_client_$n.name()")
+#set ($methodParams = "void* thisx")
+#foreach( $p in $n.iterator() )
+#set ($methodParams = "$methodParams, $helper.getTypeName( $p.type() ) $p.name()")
+#end
+$methodReturn $methodName($methodParams)
+{
+ $helper.getRemoteName($intf, $suffix)* client = ($helper.getRemoteName($intf, $suffix)*)thisx;
+ etch_iterator* iter;
+
+ ETCH_ASSERT(client != NULL);
+ ETCH_ASSERT(client->$n.getMessageSignalName()_subscribers != NULL);
+
+ iter = new_iterator(client->$n.getMessageSignalName()_subscribers, &client->$n.getMessageSignalName()_subscribers->iterable);
+ ETCH_ASSERT(iter != NULL);
+ if (iter != NULL) {
+ while (iter->has_next(iter)) {
+## clone the signal method parameters before doing the actual signal call
+#set ($methodName = "$helper.getRemoteName($intf, '')_client${signalSuffix}_$n.name()")
+#set ($methodParams = "thisx")
+#foreach( $p in $n.iterator() )
+#set ($paramType = "$helper.getTypeName( $p.type() )")
+#set ($paramCloneName = "$p.name()_clone")
+#set ($methodParams = "$methodParams, $paramCloneName")
+ $paramType $paramCloneName = ($paramType)etch_object_clone_func($p.name());
+#end
+#set ($methodParams = "$methodParams, subscriber")
+ $whoType subscriber = ($whoType)(iter->current_key);
+
+ $methodName($methodParams);
+
+ iter->next(iter);
+ }
+
+ etch_object_destroy(iter);
+ }
+
+## destroy the signal method wrapper parameters
+#foreach( $p in $n.iterator() )
+ etch_object_destroy($p.name());
+#end
+
+ return NULL;
+}
+#end
#end
#end
#end
#end
#end
+#if ($hasSignals)
+
+
+/* - - - - - - - - - - - - - - - - - - - -
+ * add/remove subscribers helper procedures
+ * - - - - - - - - - - - - - - - - - - - -
+ */
+#foreach( $s in $intf.signals( false ) )
+
+int $helper.getRemoteName($intf, '')_client_add_$s.getSignalName()_subscriber(void* thisx, etch_who* subscriber)
+{
+ $helper.getRemoteName($intf, $suffix)* client = ($helper.getRemoteName($intf, $suffix)*) thisx;
+ etch_object* subscriber_clone;
+
+ ETCH_ASSERT(client != NULL);
+ ETCH_ASSERT(subscriber != NULL);
+ ETCH_ASSERT(client->$s.getSignalName()_subscribers != NULL);
+
+ subscriber_clone = etch_object_clone_func(subscriber);
+ if (subscriber_clone == NULL)
+ return ETCH_ENOMEM;
+
+ if (etchmap_set_add(client->$s.getSignalName()_subscribers, subscriber_clone) != 0) {
+ etch_object_destroy(subscriber_clone);
+ return ETCH_ERROR;
+ }
+
+ return ETCH_SUCCESS;
+}
+
+int $helper.getRemoteName($intf, '')_client_remove_$s.getSignalName()_subscriber(void* thisx, etch_who* subscriber)
+{
+ $helper.getRemoteName($intf, $suffix)* client = ($helper.getRemoteName($intf, $suffix)*) thisx;
+ etch_hashitem hashbucket, *item = &hashbucket;
+ etch_object* key = (etch_object*)subscriber;
+ struct i_hashtable* vtab;
+ void* realtable;
+
+ ETCH_ASSERT(client != NULL);
+ ETCH_ASSERT(subscriber != NULL);
+ ETCH_ASSERT(client->$s.getSignalName()_subscribers != NULL);
+
+ vtab = (struct i_hashtable*)((etch_object*)(client->$s.getSignalName()_subscribers))->vtab;
+ realtable = client->$s.getSignalName()_subscribers->realtable;
+ if (vtab->removeh(realtable, key->get_hashkey(key), client->$s.getSignalName()_subscribers, &item) != 0)
+ return ETCH_ERROR;
+
+ etch_object_destroy(item->key);
+
+ return ETCH_SUCCESS;
+}
+#end
+#end
Modified: incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/remote_client_h.vm
URL: http://svn.apache.org/viewvc/incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/remote_client_h.vm?rev=1149251&r1=1149250&r2=1149251&view=diff
==============================================================================
--- incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/remote_client_h.vm (original)
+++ incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/remote_client_h.vm Thu Jul 21 16:12:15 2011
@@ -64,6 +64,22 @@ $sb;
#end
#end
+##generate typedefs for the client signal methods
+#set($whoType = "etch_who*")
+#set($whoName = "sender")
+#foreach( $n in $intf.iterator() )
+#if ($n.isMessage() && $n.hasSignal() && $n.isMsgDirClient())
+#set ($methodReturn = "$helper.getPointerTypeName( $n.type() )")
+#set ($methodName = "$helper.getServiceName($intf)_ex_$n.name()")
+#set ($methodParams = "void* thisx")
+#foreach( $p in $n.iterator() )
+#set ($methodParams = "$methodParams, $helper.getTypeName( $p.type() ) $p.name()")
+#end
+#set ($methodParams = "$methodParams, $whoType $whoName")
+typedef $methodReturn (*$methodName)($methodParams);
+#end
+#end
+
/**
* $helper.getRemoteName($intf, $suffix)
*/
@@ -87,6 +103,12 @@ typedef struct $helper.getRemoteName($in
#end
#end
+#foreach( $n in $intf.iterator() )
+#if ($n.isMessage() && $n.hasSignal() && $n.isMsgDirClient())
+ $helper.getServiceName( $intf )_ex_$n.name() _$n.name();
+#end
+#end
+
#foreach( $x in $intf.iterator() )
#if( $x.isMixin() )
@@ -103,6 +125,13 @@ typedef struct $helper.getRemoteName($in
#end
#end
+#foreach( $s in $intf.signals( false ) )
+
+ etch_hashtable* $s.getSignalName()_subscribers;
+ int (*add_$s.getSignalName()_subscriber)(void* thisx, $whoType $whoName);
+ int (*remove_$s.getSignalName()_subscriber)(void* thisx, $whoType $whoName);
+#end
+
/* private, generally. since unit tests invoke async begin and end,
* we must expose them either as virtuals or as external references.
Modified: incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/stub_c.vm
URL: http://svn.apache.org/viewvc/incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/stub_c.vm?rev=1149251&r1=1149250&r2=1149251&view=diff
==============================================================================
--- incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/stub_c.vm (original)
+++ incubator/etch/branches/singlestack/binding-c/compiler/src/main/resources/org/apache/etch/bindings/c/compiler/stub_c.vm Thu Jul 21 16:12:15 2011
@@ -116,13 +116,22 @@ int $helper.getStubName($intf, $suffix)_
#if ($n.isMessage())
#if ($n.isMsgDir($mc) || $n.isMsgDirBoth())
#if (!$n.isHidden())
+#set($isSignalSubscription = false)
+#set($signalMethod = '')
+#set($signalParam = '')
+#if ($n.hasSignal() && $n.isMsgDirServer())
+#set($isSignalSubscription = true)
+#set($signalMethod = '_ex')
+#set($signalParam = ', whofrom')
+#end
+
/**
* $helper.getStubName($intf, '')_run_$n.name()
*/
int $helper.getStubName($intf, '')_run_$helper.getDirectionName($mc)_$n.name()(etch_stub* stub, i_delivery_service* dsvc, void* obj, etch_who* whofrom, etch_message* msg)
{
i_$helper.getBaseName($intf, $suffix)* $suffix = (i_$helper.getBaseName($intf, $suffix)*)obj;
- $helper.getServiceName($intf)_$n.name() func;
+ $helper.getServiceName($intf)${signalMethod}_$n.name() func;
int returnCode = 0;
$helper.getVfName($intf)_impl* pvfi = NULL;
$helper.getVfName($intf)* pvf = NULL;
@@ -164,34 +173,34 @@ int $helper.getStubName($intf, '')_run_$
##end
/* execute the service method */
- func = ($helper.getServiceName($intf)_$n.name()) etchmap_findxw(${suffix}->virtuals, $helper.getVfName($intf)_get_static()->str_$helper.getIntfName($intf)_$n.name(), NULL);
+ func = ($helper.getServiceName($intf)${signalMethod}_$n.name()) etchmap_findxw(${suffix}->virtuals, $helper.getVfName($intf)_get_static()->str_$helper.getIntfName($intf)_$n.name(), NULL);
if (func)
#set($sb = '')
-#if($n.hasReturn() || $n.hasThrown())
+#if($n.hasReturn() || $n.hasThrown() || $isSignalSubscription)
#set ( $sb = "resultobj = ")
#end
#set ($sb = "$sb func (impl")
#foreach( $p in $n.iterator() )
#set ( $sb = "$sb, val_$p.name()")
#end
-#set ($sb = "$sb);")
+#set ($sb = "$sb$signalParam);")
$sb
else
#set($sb = '')
-#if($n.hasReturn() || $n.hasThrown())
+#if($n.hasReturn() || $n.hasThrown() || $isSignalSubscription)
#set ( $sb = "resultobj = ")
#end
-#set ($sb = "$sb $helper.getServiceName($intf)_def_$n.name() (impl")
+#set ($sb = "$sb $helper.getServiceName($intf)${signalMethod}_def_$n.name() (impl")
#foreach( $p in $n.iterator() )
#set ( $sb = "$sb, val_$p.name()")
#end
-#set ($sb = "$sb);")
+#set ($sb = "$sb$signalParam);")
$sb
-#if(!$n.isOneway() && !$n.hasReturn() && !$n.hasThrown())
+#if(!$n.isOneway() && !$n.hasReturn() && !$n.hasThrown() && !$isSignalSubscription)
/* transmit reply back to sender */
returnCode = etchstub_send_reply (stub, dsvc, whofrom, msg, (void*) resultobj, FALSE);
-#elseif(!$n.isOneway() && !$n.hasReturn() && $n.hasThrown())
+#elseif(!$n.isOneway() && !$n.hasReturn() && ($n.hasThrown() || $isSignalSubscription))
returnCode = etchstub_send_reply (stub, dsvc, whofrom, msg, (void*) resultobj, resultobj != NULL);
#elseif(!$n.isOneway() && $n.hasReturn() && !$helper.isRefType($n.getResultMessage().getResultParam().type()))
returnCode = etchstub_send_reply (stub, dsvc, whofrom, msg, (void*) resultobj, TRUE);