[omniORB] Dynamically generate objects (here: EventChannel) ???
Sebastian Bickel
Seb.ADIO at gmx.de
Mon Oct 2 22:00:03 BST 2006
Ist there a technique to dynamically generate CORBA objects during runtime. I want to
generate multiple event channels, but if I do that in the implementation of the CORBA object,
I get a "AlreadyExist"-Message. Can you please help me.
The code is attached. I only want to create multiple objects of the event channel during
runtime, but it doesn't succeed. Please help me.
// A little bit changed from the examples to omniEvents
//
// Package : omniEvents
// channel.cc Created : 2005/04/23
// Author : Alex Tingle
//
// Copyright (C) 2005 Alex Tingle
//
// This file is part of the omniEvents application and has been
modified
// during the study thesis of Sebastian BIckel.
//
// omniEvents is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later
version.
//
// omniEvents is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General
Public
// License along with this library; if not, write to the Free
Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA
//
// Description:
// Demonstates how to make a standalone EventChannel in your own
// application, using libomniEvents.
//
[...]
#include <omniEvents/EventChannel.h>
/** Signal handler. */
void myShutdown(int signum)
{
OmniEvents::Orb::inst().shutdown(signum);
}
void * event_channel_task (void *)
{
std::cout << "OmniEvents::Orb::inst().run() calling!" <<
std::endl;
OmniEvents::Orb::inst().run();
std::cout << "OmniEvents::Orb::inst().run() called!" <<
std::endl;
}
#include "channel_factory.h"
#include <pthread.h>
std::string * ChannelFactory::createChannel(CORBA::ORB_var orb)
{
//
// Start orb.
// CORBA::ORB_var orb = CORBA::ORB_init(argc,argv);
const char* action=""; // Use this variable to help report errors.
try {
action="initialise OmniEvents::Orb";
// Your code MUST include these two lines.
OmniEvents::Orb::inst()._orb=CORBA::ORB::_duplicate(orb);
OmniEvents::Orb::inst().resolveInitialReferences();
action="activate the RootPOA's POAManager";
// You MUST activate the RootPOA's POAManager. You can do this
yourself
// in the normal way, or you can use the reference that
OmniEvents::Orb
// has resolved for you.
PortableServer::POAManager_var pman;
pman=OmniEvents::Orb::inst()._RootPOA->the_POAManager();
pman->activate();
action="create EventChannel servant";
// The constructor just allocates memory.
OmniEvents::EventChannel_i* channelSrv =new
OmniEvents::EventChannel_i();
action="activate EventChannel servant";
// activate() creates & activates the EventChannel's POA and
CORBA objects.
try {
channelSrv->activate("EventChannel");
} catch(...)
{
==> std::cout << "AdapterAlreadyExists" << std::endl;
}
// From this point, clients may invoke EventChannel operations.
action="obtain an object reference to the EventChannel";
CosEventChannelAdmin::EventChannel_var channelRef =channelSrv-
>_this();
// The user interface of this example is simple: The
EventChannel's IOR
// is dumped to the standard output stream.
action="stringify the EventChannel reference";
CORBA::String_var sior =orb->object_to_string(channelRef.in());
cout<<sior.in()<<endl;
action="set signal handlers";
::signal(SIGINT , ::myShutdown);
::signal(SIGTERM, ::myShutdown);
action="collect orphan requests";
// You MUST call this method, it processes orphan (asynchronous)
method
// calls made by the EventChannel.
// You can safely call it instead of CORBA::ORB::run(). If you
do not
// want to park the main thread, then you must create a new
thread for this
// method.
//cout<<"Calling OmniEvents::Orb::inst().run()
asynchronusly..."<<endl;
// OmniEvents::Orb::inst().run();
pthread_t thread;
pthread_create(&thread // Thread-Id
,NULL // Attributes
,::event_channel_task // Function
,NULL); // Arguments (none)
// OmniEvents::Orb::inst().run();
std::string * str_iop = new std::string();
(*str_iop) = sior.in();
return str_iop;
// OmniEvents::Orb::shutdown() has been called by the
myShutdown() signal
// handler. (The user pressed Ctrl-C or killed the process.)
// In order to make run() return, you MUST call
OmniEvents::Orb::shutdown().
action="destroy orb";
orb->destroy();
}
catch(CORBA::SystemException& ex) {
cerr<<"Failed to "<<action<<".";
#if defined(HAVE_OMNIORB4)
cerr<<" "<<ex._name();
if(ex.NP_minorString())
cerr<<" ("<<ex.NP_minorString()<<")";
#endif
cerr<<endl;
::exit(1);
}
catch(CORBA::Exception& ex) {
cerr<<"Failed to "<<action<<"."
#if defined(HAVE_OMNIORB4)
" "<<ex._name()
#endif
<<endl;
::exit(1);
}
return 0;
}
Greetings
Sebastian
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.omniorb-support.com/pipermail/omniorb-list/attachments/20061002/b9089759/attachment-0001.htm
More information about the omniORB-list
mailing list