[MWy] Ukol CORBA

Petr Stefan ptr.stef at gmail.com
Wed Mar 23 01:12:13 CET 2016


Dobry den,

narazil jsem na problem pri implementaci serveru v druhem domacim ukolu. 
Klient mi funguje v poradku a mam implementovanou i vetsinu serveru, 
pouzivam TAOX11. Metoda connect() na implementaci rozhrani server_i 
(oznacme si ji server_impl) vraci referenci na instanci nejake tridy, 
ktera implementuje rozhrani instance_i (tu si oznacme instance_impl). To 
znamena, ze server musi v teto metode vytvorit novou instanci tridy 
instance_impl a vratit referenci ziskanou metodou _this(). Ale je treba 
zajistit, aby instance vraceneho objektu existovala dostatecne dlouho. 
Proto jsem zacal s tim, ze se vzdy bude pripojovat pouze jeden klient, 
na ktery si budu udrzovat v server_impl odkaz (std::unique_ptr). Pokud 
pak v metode server_impl::connect() provadim kod:

instance_ = std::make_unique<instance_impl>(peer, key);
return instance_->_this();

tak prvni spusteni klienta probehne v poradku, ale pri druhem spusteni 
server z niceho nic v tomto miste spadne na segmentation fault. Coz mi 
samo o sobe prijde divne, protoze pouzivam chytre ukazatele abych vzdy 
pracoval s pameti spravne. Tento kod by vlastne mel vytvorit novy 
inicializovany unique_ptr, ktery se move semantikou priradi do privatni 
promenne instance_, cimz se provede automaticka dealokace puvodniho 
objektu. Nevite, cim by to mohlo byt toto divne chovani zpusobeno?
Jiste reseni by mohlo byt ukladat si jednotlive instance do nejakeho 
kontejneru v server_impl (napr. std::vector), ale tam vznika problem s 
mazanim instanci - metoda disconnect() je na instance_i a ne server_i, 
tudiz se tato instance nemuze sama odebrat z kolekce v server_impl. Jak 
takovou vec resit, popripade poskytuje CORBA primo nejake prostredky? Me 
by nyni prislo logicke presunout metodu disconnect() z rozhrani 
instance_i do server_i, ale to s sebou prinasi drobne nevyhody jako 
nutnost rozpoznavat jednotlive instance podle unikatnich ID atd.

Takze pro shrnuti: Jak zajistit zivotnost objektu instance_impl? Jak je 
dealokovat pomoci jejich vlastni metody disconnect()?

Jeste jedna otazka na zaver: je nutne v klientovi na ziskane instanci 
pri ukoncovani zavolat CORBA::release() po poslednim volani, tj. po 
instance->disconnect()?

S pozdravem,
Petr Stefan




More information about the NSWI080 mailing list