クライアントの異常終了などで接続が切断された場合は、スケルトンに実装されているインプリメンテーションクラスのデストラクタが自動的に呼び出されますが、デストラクタが実行される前に何らかの処理を行う場合は、その処理内容を記述した処理関数を登録します。
ここで登録された関数は、デストラクタが呼び出される直前に実行されます。
(1) 処理関数の形式
処理関数の形式を以下に示します。引数はvoidのポインタですが、呼出し時にthisポインタが渡されます。復帰値は、ありません。
void exit_func( void *this_pointer );
(2) 処理関数の登録
処理関数、CORBA::ORB::reg_exit_function()で登録します。登録は、CORBA::ORB_init()とCORBA::BOA::impl_is_ready()の間で行ってください。
登録例を以下に示します。
void exit_func( void *this_pointer ) { // 処理内容。例は後で示す。 } int main( int argc, char *argv[] ) { int current_argc = argc; ..... // 初期化処理 orb = CORBA::ORB_init( current_argc, argv, FJ_OM_ORBid, env ); .... // 処理関数の登録 orb->reg_exit_function( orb, _INTF_ODsample_intf1, exit_func, env ); .... // サーバの活性化 boa->impl_is_ready( impl, env ); }
(3) 処理関数の内容例
privateデータの内容と共に簡単な警告を出力します。ただし、privateメンバを参照するためには、exit_func関数をODsample_intf1_implクラスのfriend関数にしておく必要があります。
void exit_func( void *this_pointer ) { ODsample_intf1_impl *ptr = (ODsample_intf1_impl *)this_pointer; }
注意
CORBA::BOA::dispose()が発行された後にクライアントとの接続が切断された場合、登録された処理関数は呼び出されません。この場合も処理関数を実行する場合は、CORBA::BOA::dispose()の発行前に処理関数を実行してください。
void ODsample_intf1_impl::destroy( CORBA::Environment &env ) throw( CORBA::Exception ) { try { exit_func( this ); // 登録関数の明示的な呼び出し boa->dispose( this, env ); } catch( CORBA::SystemException &se ) { throw( se ); } }