[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