Hello,
I'm trying to do a CosTransactions service based on 'Stefano Marocco' source
(http://www.mico.org/pipermail/mico-devel/2003-April/006872.html)
But I've a segmentation fault ...
Here my client Code:
--------------------------------------------------------------------------
#include <ots.h>
#include <util.h>
#include <sys-excp.h>
#include <CosTransactions.h>
#include <orb-initializer.h>
using namespace ONED;
using namespace ONED::OTS;
CORBA::ORB_var orb;
int
main( int argc , char** argv )
try
{
OrbInitializer::init();
orb = CORBA::ORB_init( argc , argv , "mico-local-orb" );
CosTransactions::Current_var c =
resolve_initial<CosTransactions::Current>( orb , "TransactionCurrent" );
// See below for the code of 'resolve_initial'
c->begin();
}
catch ( ONED::Exception& p_excp )
{
std::cerr << p_excp << '\n';
}
catch ( std::exception& p_excp )
{
std::cerr << "Main catch std::exception : " << p_excp.what() << '\n';
}
catch ( ... )
{
std::cerr << "Unknown exception !\n";
}
-------------------------------------------------------------------------
--- OrbInitializer ------------------------------------------------------
void
ONED::OTS::OrbInitializer::pre_init( PortableInterceptor::ORBInitInfo_ptr info )
{
_transaction_slot = info->allocate_slot_id();
// Allocate the codec
IOP::CodecFactory_var codec_factory = info->codec_factory();
IOP::Encoding encoding;
encoding.format = IOP::ENCODING_CDR_ENCAPS;
encoding.minor_version = 1;
encoding.major_version = 2;
IOP::Codec_var codec_var = codec_factory->create_codec( encoding );
//
// Allocate the client and server interceptor and pass the allocating slot
// and codec to it for future use in 'send_request' and
// 'receive_request_service_context'
//
info->add_server_request_interceptor( new ONED::OTS::ServerInterceptor(
_transaction_slot , codec_var ) );
info->add_client_request_interceptor( new ONED::OTS::ClientInterceptor(
_transaction_slot , codec_var ) );
}
void
ONED::OTS::OrbInitializer::post_init( PortableInterceptor::ORBInitInfo_ptr info
)
{
//
// Resolve initial reference of 'TransactionService'
// The Transaction service should then create a persistent
TransactionFactory
// object with an objectId of 'TransactionService'.
//
CosTransactions::TransactionFactory_ptr ptr =
resolve_initial<CosTransactions::TransactionFactory>( info ,
"TransactionService" );
// see below for the code of 'resolve_initial'
//
// Register initial reference for 'CosTransactions::Current'
//
CurrentImpl *_current = new CurrentImpl( info , ptr , _transaction_slot );
info->register_initial_reference( "TransactionCurrent" , _current );
}
void
OrbInitializer::init( void )
{
OrbInitializer *init = new OrbInitializer;
PortableInterceptor::register_orb_initializer( init );
}
Right now, Server interceptor and client interceptor are empty.
Here the code of 'resolve_initial'
template <typename _narrowType, typename T_resolve_intf>
typename _narrowType::_ptr_type
resolve_initial( T_resolve_intf p_orb , const char* p_object_id )
try
{
CORBA::Object_var obj;
obj = p_orb->resolve_initial_references( p_object_id );
if ( CORBA::is_nil( obj ) )
THROW_EXCP_WITH_ARG( ResolveException,
<< ONED::Msg( "Unable to resolve initial reference
for name $1 !\n")
<< ONED::Param( 1 , p_object_id ));
typename _narrowType::_var_type ref;
ref = _narrowType::_narrow(obj);
if ( CORBA::is_nil( ref ) )
THROW_EXCP_WITH_ARG( ResolveException,
<< ONED::Msg( "Unable to narrow object reference
`$2' to type `$1'\n" )
<< ONED::Param( 2 , ONED::ABI::demangle(
typeid(ref).name() ) )
<< ONED::Param( 1 , p_object_id ));
return ref._retn();
} // try Server::resolve_initial
catch ( CORBA::ORB::InvalidName& p_excp )
{
THROW_EXCP_WITH_ARG( ResolveException,
<< ONED::Msg( "Could not resolve initial reference $1\n"
"$1 is an invalid name !" )
<< ONED::Param( 1 , p_object_id ) );
} // catch ( InvalidName )
catch ( CORBA::Exception& p_excp )
{
CORBA::Any tmp;
tmp <<= p_excp;
CORBA::TypeCode_var tc = tmp.type();
const char* p = tc->name();
THROW_EXCP_WITH_ARG( ResolveException,
<< ONED::Msg( "Could not resolve initial reference
`$1'\n"
"[$2]: $3 !" )
<< ONED::Param( 1 , p_object_id )
<< ONED::Param( 2 , tc->id() )
<< ONED::Param( 3 , p ? p : "(null)" ) );
} // catch ( CORBA::Exception )
------ CURRENT-IMPL.CPP -------------------
CurrentImpl::CurrentImpl(
PortableInterceptor::ORBInitInfo_ptr p_info_ptr
, CosTransactions::TransactionFactory_ptr p_factory_ptr
, PortableInterceptor::SlotId p_slot )
: _info_ptr( p_info_ptr )
, _factory_ptr( p_factory_ptr )
, _slot( p_slot )
{
}
void
CurrentImpl::begin( void )
{
std::cerr << __PRETTY_FUNCTION__ << '\n';
// ---- SEGFAULT HERE ---
PortableInterceptor::Current_var picurrent =
resolve_initial<PortableInterceptor::Current>(
_info_ptr , "PICurrent" );
std::cerr << "COUCOU -1-\n";
CORBA::Any* anyptr = picurrent->get_slot( _slot );
std::cerr << "COUCOU -2-\n";
CORBA::TypeCode_var tc = anyptr->type();
std::cerr << "COUCOU -3-\n";
if ( tc->kind() != CORBA::tk_void && tc->kind() != CORBA::tk_null )
mico_throw( CosTransactions::SubtransactionsUnavailable() );
std::cerr << "COUCOU -4-\n";
}
I'm on RH ES 3, mico 2.3.12, gcc 3.2.3
here the bt from gdb
#0 0x00000018 in ?? ()
#1 0x0015ad49 in ONED::OTS::resolve_initial<PortableInterceptor::Current,
PortableInterceptor::ORBInitInfo*> (p_orb=0x8465de8,
p_object_id=0x161c42 "PICurrent") at
/users/home/lmarzullo/work/devel/CosTransactions/head/include/util.h:47
#2 0x0015a98a in ONED::OTS::CurrentImpl::begin (this=0x8467d08) at
../../../devel/CosTransactions/head/src/current-impl.cpp:96
#3 0x0804c24f in main (argc=1, argv=0xbfff8464) at
../../../../../devel/CosTransactions/head/test/current/client.cpp:44
line 47 of 'util.h' is 'obj = p_orb->resolve_initial_references( p_object_id );'
What am I doing wrong ?
Thanks a lot
+--------------------+
+ Laurent Marzullo
+
_______________________________________________
Mico-devel mailing list
[email protected]
http://www.mico.org/mailman/listinfo/mico-devel