[omniORB] The Simple example not working :0)
Bjorn R. Jensen
bjensen@fastmail.fm
Fri Oct 11 10:52:01 2002
Hi there,
There is a problem in your implementation of the Item servant,
where you return a char * to the orb runtime. The orb runtime
expects a char * to memory allocated using CORBA::string_alloc.
The orb runtime also assumes ownership of the string handed to
it, and will free it using CORBA::string_free, when it is done
marshalling it. In your case it would be easiest, if you used
return CORBA::string_dup(d_name). You are basically corrupting
the heap.
Yours sincerely,
Bjorn
On Thu, 10 Oct 2002 16:19:07 -0500, "Laurent JOIGNY"
<ljoigny@houston.westerngeco.slb.com> said:
> Hi,
>
> I am a new user of omniORB and I tried to run a simple example
> of a time server. All goes well until I decide to add some spicy
> stuff like sequence.
>
> First of all my problem was at the compilation stage, when I try to
> assign an element of a vector to an element of my sequence.
> It seems that the _this() operation was enough to solve the problem,
> but at the execution stage my server stop in this portion of code.
>
> If somebody has an idea, I would be glad to hear it.
>
> I read some of other issues on the list archive but I didn't find my
> answer. Any way I thing that a bigger example of omniORB use, with
> sequence,
> should be present in the product archive.
>
> Server Execution:
> -----------------
> Get ORB reference
> Get the POA reference
> Create and activate the TimeImpl object
> Start the POA manager
> Stringify the TimeImpl reference
> Running ORB...
>
> Begin get_items
> itemList size = 3
> New sequence created
> Copy an item
>
> Client Execution:
> ------------------
> Starting the server
> Get ORB reference
> Destringify the Object reference
> Get a Time object from the reference
> Use the time service
> Time in GreenWich is 21:13:17
> Get a list of item and display it
> ERROR IN THE CLIENT
>
>
> IDL:
> -----
> module TIDL {
> interface Item {
> attribute string name;
> };
> typedef sequence<Item> ItemSeq;
> struct TimeOfDay {
> short hour;
> short minute;
> short second;
> };
> interface Time {
> TimeOfDay get_gmt();
> ItemSeq get_items();
> };
> };
>
> Servant code: timeImpl.cc
> -------------------------
> using namespace TIDL;
>
> class ItemImpl : public POA_TIDL::Item,
> public PortableServer::RefCountServantBase
> {
> public :
> ItemImpl(char *n) { strcpy(d_name, n); };
> virtual char *name() { return d_name; };
> virtual void name(const char *n) { strcpy(d_name, n); };
>
> char d_name[50];
> };
>
> class TimeImpl : public POA_TIDL::Time,
> public PortableServer::RefCountServantBase
> {
> public :
> virtual TimeOfDay get_gmt();
> virtual ItemSeq* get_items();
>
> vector<ItemImpl> itemList;
> };
>
> TimeOfDay TimeImpl::get_gmt()
> {
> TimeOfDay tod;
> ... etc ..
> return tod;
> }
>
> ItemSeq* TimeImpl::get_items()
> {
> cerr<<"Begin get_items"<<endl;
> int len = itemList.size();
> cerr<<"itemList size = "<<len<<endl;
> ItemSeq* seq = new ItemSeq(len);
> cerr<<"New sequence created"<<endl;
>
> for (int i=0; i<len; i++)
> {
> cerr<<"Copy an item"<<endl;
> (*seq)[i] = itemList[i]._this(); // FIXE ME !!
> }
>
> cerr<<"End get_items"<<endl;
> return seq;
> }
>
> Server code: timeImpl.cc
> ------------------------
> int main(int argc, char * argv[])
> {
> ... etc...
> TimeImpl *mytime = new TimeImpl();
>
> ItemImpl item = ItemImpl("A");
> mytime->itemList.push_back( item );
> item.name("simple");
> mytime->itemList.push_back( item );
> item.name("test");
> mytime->itemList.push_back( item );
>
> PortableServer::ObjectId_var mytimeid = poa->activate_object(mytime);
>
> Time_var mytimeref = mytime->_this();
> mytime->_remove_ref();
>
> ... etc ...
> }
>
> Client code:
> ------------
> int main(int argc, char * argv[])
> {
> ... etc ...
> cerr<<"Get a Time object from the reference"<<endl;
> Time_var tm = Time::_narrow(obj);
> if (CORBA::is_nil(tm)) {
> cerr<<"Argument is not a Time reference"<<endl;
> throw 0;
> }
>
> // Get time
> cerr<<"Use the time service"<<endl;
> TimeOfDay tod = tm->get_gmt();
> ... etc ...
>
> cout<<"Get a list of item and display it "<<endl;
> ItemSeq *seq = tm->get_items();
> cout<<"List taken"<<endl;
> int len2 = seq->length();
> for (int i=0; i<len2; i++)
> {
> cout<<(*seq)[i]<<" ";
> }
>
> ... etc ...
> }
>
>
> --
> Laurent JOIGNY
> WesternGeco / Schlumberger / Houston
> phone : (+1) 713 689 6646
>
> _______________________________________________
> omniORB-list mailing list
> omniORB-list@omniorb-support.com
> http://www.omniorb-support.com/mailman/listinfo/omniorb-list
>