[MWy] Ukol CORBA
Petr Tůma
petr.tuma at d3s.mff.cuni.cz
Wed Mar 23 08:35:11 CET 2016
Dobry den,
standardni postup je vytvaret instanci servantu pomoci
CORBA::make_reference<instance_impl> (mapovani pro C++11 vyslovne rika,
ze se nesmi delat new a delete na servant classes, volani
std::make_unique podle meho nazoru do tohoto patri, protoze to je
template, ktera neni implementovana CORBOU a uvnitr ni se nakonec stejne
to new vola).
Takze ve vasem kodu byste nejspis delal neco jako:
instance_ = CORBA::make_reference<instance_impl>(...);
return instance_->_this();
Tohle bude mit soucasne za nasledek to, ze se objekt zaregistruje v mape
aktivnich objektu uvnitr POA (side efekt volani _this() pri policy
IMPLICIT_ACTIVATION, na prednasce bude az dneska :-). Pro nazornejsi
predvedeni funkce je mozna misto volani _this() lepsi explicitni volani
POA::activate_object(), ale to je delsi kod :-).
Smart pointer vraceny CORBA::make_reference() ma semantiku
std::shared_ptr, takze pri dalsim prirazeni do instance_ se predchozi
servant nebude mazat (je jeste registrovany v mape aktivnich objektu).
Skutecne smazani by pak probehlo teprve az objekt vyjmete z mapy
aktivnich objektu (a zrusite na nej vasi lokalni referenci), coz lze
ucinit volanim POA::deactivate_object() (coz by melo jit udelat uvnitr
metody instance_impl::disconnect(), protoze POA by mel behem volani
udrzovat referenci nazivu, ale v C++11 jsem to jeste netestoval).
Volani CORBA::release() je relikt z C++, standardni postup pro C++11 by
byl pouzit na klientovi jako referenci typ IDL::traits<...>::ref_type,
ktery reference counting zaridi automaticky.
Petr Tuma
On 23/03/16 01:12, Petr Stefan wrote:
> 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
>
> _______________________________________________
> MWy mailing list
> MWy at d3s.mff.cuni.cz
> https://d3s.mff.cuni.cz/mailman/listinfo/mwy
More information about the NSWI080
mailing list