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

Reply via email to