00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "tao/ORB_Core.h"
00013 #include "tao/debug.h"
00014 #include "tao/PortableServer/ServantRetentionStrategyRetain.h"
00015 #include "tao/PortableServer/Non_Servant_Upcall.h"
00016 #include "tao/PortableServer/Servant_Upcall.h"
00017 #include "tao/PortableServer/POA_Current_Impl.h"
00018 #include "tao/PortableServer/Root_POA.h"
00019 #include "tao/PortableServer/Active_Object_Map.h"
00020 #include "tao/PortableServer/Active_Object_Map_Entry.h"
00021 #include "ace/Auto_Ptr.h"
00022
00023 ACE_RCSID (PortableServer,
00024 Servant_Retention_Strategy,
00025 "$Id: ServantRetentionStrategyRetain.cpp 79258 2007-08-08 11:58:47Z johnnyw $")
00026
00027 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00028
00029 namespace TAO
00030 {
00031 namespace Portable_Server
00032 {
00033 ServantRetentionStrategyRetain::ServantRetentionStrategyRetain (void) :
00034 ServantRetentionStrategyNonRetain (),
00035 active_object_map_ (0),
00036 waiting_servant_deactivation_ (0)
00037 {
00038 }
00039
00040 void
00041 ServantRetentionStrategyRetain::strategy_init (TAO_Root_POA *poa)
00042 {
00043 poa_ = poa;
00044
00045
00046 TAO_Active_Object_Map *active_object_map = 0;
00047 ACE_NEW_THROW_EX (active_object_map,
00048 TAO_Active_Object_Map (!poa->system_id (),
00049 !poa->allow_multiple_activations (),
00050 poa->is_persistent (),
00051 poa->orb_core().server_factory ()->active_object_map_creation_parameters ()
00052 ), CORBA::NO_MEMORY ());
00053
00054
00055
00056
00057 auto_ptr<TAO_Active_Object_Map> new_active_object_map (active_object_map);
00058
00059
00060
00061
00062
00063 this->active_object_map_ = new_active_object_map.release ();
00064 }
00065
00066 void
00067 ServantRetentionStrategyRetain::strategy_cleanup(void)
00068 {
00069
00070 delete this->active_object_map_;
00071 active_object_map_ = 0;
00072 }
00073
00074 void
00075 ServantRetentionStrategyRetain::deactivate_object (
00076 const PortableServer::ObjectId &id)
00077 {
00078
00079 TAO_Active_Object_Map_Entry *active_object_map_entry = 0;
00080 int const result = this->active_object_map_->
00081 find_entry_using_user_id (id, active_object_map_entry);
00082
00083
00084
00085 if (result != 0)
00086 {
00087 throw PortableServer::POA::ObjectNotActive ();
00088 }
00089
00090 this->deactivate_map_entry (active_object_map_entry);
00091 }
00092
00093 void
00094 ServantRetentionStrategyRetain::deactivate_map_entry (
00095 TAO_Active_Object_Map_Entry *active_object_map_entry)
00096 {
00097
00098 CORBA::UShort const new_count = --active_object_map_entry->reference_count_;
00099
00100
00101
00102
00103 if (active_object_map_entry->deactivated_ == 0)
00104 {
00105 this->poa_->servant_deactivated_hook (
00106 active_object_map_entry->servant_,
00107 active_object_map_entry->user_id_
00108 );
00109 }
00110
00111 if (new_count == 0)
00112 {
00113 this->poa_->cleanup_servant (active_object_map_entry->servant_,
00114 active_object_map_entry->user_id_);
00115 }
00116 else
00117 {
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 active_object_map_entry->deactivated_ = 1;
00130 }
00131 }
00132
00133 int
00134 ServantRetentionStrategyRetain::unbind_using_user_id (
00135 const PortableServer::ObjectId &user_id)
00136 {
00137 return this->active_object_map_->unbind_using_user_id (user_id);
00138 }
00139
00140 PortableServer::Servant
00141 ServantRetentionStrategyRetain::find_servant (
00142 const PortableServer::ObjectId &system_id)
00143 {
00144
00145 PortableServer::ObjectId_var user_id;
00146 if (active_object_map_->
00147 find_user_id_using_system_id (system_id, user_id.out()) != 0)
00148 {
00149 throw ::CORBA::OBJ_ADAPTER ();
00150 }
00151
00152
00153
00154
00155
00156 TAO_Active_Object_Map_Entry *entry = 0;
00157 PortableServer::Servant servant = 0;
00158
00159 int const result =
00160 active_object_map_->
00161 find_servant_using_system_id_and_user_id (system_id,
00162 user_id.in(),
00163 servant,
00164 entry);
00165
00166 if (result == -1)
00167 {
00168 throw PortableServer::POA::ObjectNotActive ();
00169 }
00170
00171 return servant;
00172 }
00173
00174 PortableServer::ObjectId *
00175 ServantRetentionStrategyRetain::system_id_to_object_id (
00176 const PortableServer::ObjectId &system_id)
00177 {
00178
00179
00180 PortableServer::ObjectId_var user_id;
00181 if (this->active_object_map_->
00182 find_user_id_using_system_id (system_id,
00183 user_id.out ()) != 0)
00184 {
00185 throw ::CORBA::OBJ_ADAPTER ();
00186 }
00187
00188 return user_id._retn ();
00189 }
00190
00191 PortableServer::Servant
00192 ServantRetentionStrategyRetain::user_id_to_servant (
00193 const PortableServer::ObjectId &id)
00194 {
00195
00196
00197
00198 PortableServer::Servant servant = 0;
00199
00200 int const result =
00201 this->active_object_map_->find_servant_using_user_id (id, servant);
00202
00203 if (result == -1)
00204 {
00205 throw PortableServer::POA::ObjectNotActive ();
00206 }
00207
00208 return servant;
00209 }
00210
00211 CORBA::Object_ptr
00212 ServantRetentionStrategyRetain::id_to_reference (
00213 const PortableServer::ObjectId &id,
00214 bool indirect)
00215 {
00216
00217
00218
00219 PortableServer::ObjectId_var system_id;
00220 PortableServer::Servant servant;
00221 CORBA::Short priority;
00222
00223 if (this->active_object_map_->
00224 find_servant_and_system_id_using_user_id (id,
00225 servant,
00226 system_id.out (),
00227 priority) == 0)
00228 {
00229
00230 this->poa_->key_to_object_params_.set (system_id,
00231 servant->_interface_repository_id (),
00232 servant,
00233 1,
00234 priority,
00235 indirect);
00236
00237 return this->poa_->invoke_key_to_object_helper_i (servant->_interface_repository_id (),
00238 id);
00239 }
00240 else
00241 {
00242
00243
00244 throw PortableServer::POA::ObjectNotActive ();
00245 }
00246 }
00247
00248 TAO_SERVANT_LOCATION
00249 ServantRetentionStrategyRetain::servant_present (
00250 const PortableServer::ObjectId &system_id,
00251 PortableServer::Servant &servant)
00252 {
00253
00254 PortableServer::ObjectId_var user_id;
00255 if (this->active_object_map_->
00256 find_user_id_using_system_id (system_id,
00257 user_id.out()) != 0)
00258 {
00259 throw ::CORBA::OBJ_ADAPTER ();
00260 }
00261
00262 TAO_Active_Object_Map_Entry *entry = 0;
00263 int const result = this->active_object_map_->
00264 find_servant_using_system_id_and_user_id (system_id,
00265 user_id.in(),
00266 servant,
00267 entry);
00268 if (result == 0)
00269 {
00270
00271 return TAO_SERVANT_FOUND;
00272 }
00273 else
00274 {
00275 return TAO_SERVANT_NOT_FOUND;
00276 }
00277 }
00278
00279 PortableServer::Servant
00280 ServantRetentionStrategyRetain::find_servant (
00281 const PortableServer::ObjectId &system_id,
00282 TAO::Portable_Server::Servant_Upcall &servant_upcall,
00283 TAO::Portable_Server::POA_Current_Impl &poa_current_impl)
00284 {
00285 PortableServer::ObjectId user_id;
00286
00287
00288 if (this->active_object_map_->
00289 find_user_id_using_system_id (system_id,
00290 user_id) != 0)
00291 {
00292 throw ::CORBA::OBJ_ADAPTER ();
00293 }
00294
00295 poa_current_impl.object_id(user_id);
00296 servant_upcall.user_id (&poa_current_impl.object_id());
00297
00298
00299
00300
00301
00302 PortableServer::Servant servant = 0;
00303 TAO_Active_Object_Map_Entry *active_object_map_entry = 0;
00304 int const result = this->active_object_map_->
00305 find_servant_using_system_id_and_user_id (system_id,
00306 user_id,
00307 servant,
00308 active_object_map_entry);
00309
00310
00311 if (result == 0)
00312 {
00313 servant_upcall.active_object_map_entry (active_object_map_entry);
00314
00315
00316 servant_upcall.increment_servant_refcount ();
00317 }
00318
00319 return servant;
00320 }
00321
00322 int
00323 ServantRetentionStrategyRetain::find_servant_priority (
00324 const PortableServer::ObjectId &system_id,
00325 CORBA::Short &priority)
00326 {
00327 PortableServer::ObjectId user_id;
00328
00329
00330 if (this->active_object_map_->
00331 find_user_id_using_system_id (system_id,
00332 user_id) != 0)
00333 {
00334 throw ::CORBA::OBJ_ADAPTER ();
00335 }
00336
00337
00338
00339
00340
00341 PortableServer::Servant servant = 0;
00342 TAO_Active_Object_Map_Entry *active_object_map_entry = 0;
00343 int const result = this->active_object_map_->
00344 find_servant_using_system_id_and_user_id (system_id,
00345 user_id,
00346 servant,
00347 active_object_map_entry);
00348
00349 if (result == 0)
00350 {
00351 priority = active_object_map_entry->priority_;
00352 return 0;
00353 }
00354
00355 return -1;
00356 }
00357
00358 int
00359 ServantRetentionStrategyRetain::is_servant_in_map (
00360 PortableServer::Servant servant,
00361 bool &wait_occurred_restart_call)
00362 {
00363 bool deactivated = false;
00364 int servant_in_map =
00365 this->active_object_map_->is_servant_in_map (servant, deactivated);
00366
00367 if (!servant_in_map)
00368 {
00369 return 0;
00370 }
00371 else
00372 {
00373 if (deactivated)
00374 {
00375 if (TAO_debug_level > 0)
00376 ACE_DEBUG ((LM_DEBUG,
00377 ACE_TEXT ("(%t) TAO_Root_POA::is_servant_in_map: waiting for servant to deactivate\n")));
00378
00379
00380
00381
00382
00383 wait_occurred_restart_call = true;
00384
00385 ++this->waiting_servant_deactivation_;
00386
00387 if (this->poa_->object_adapter ().enable_locking ())
00388 this->poa_->servant_deactivation_condition ().wait ();
00389
00390 --this->waiting_servant_deactivation_;
00391
00392 return 0;
00393 }
00394 else
00395 {
00396 return 1;
00397 }
00398 }
00399 }
00400
00401 int
00402 ServantRetentionStrategyRetain::is_user_id_in_map (
00403 const PortableServer::ObjectId &id,
00404 CORBA::Short priority,
00405 bool &priorities_match,
00406 bool &wait_occurred_restart_call)
00407 {
00408 bool deactivated = false;
00409 bool user_id_in_map =
00410 this->active_object_map_->is_user_id_in_map (id,
00411 priority,
00412 priorities_match,
00413 deactivated);
00414
00415 if (!user_id_in_map)
00416 {
00417 return 0;
00418 }
00419 else
00420 {
00421 if (deactivated)
00422 {
00423 if (TAO_debug_level > 0)
00424 ACE_DEBUG ((LM_DEBUG,
00425 ACE_TEXT ("(%t) TAO_Root_POA::is_user_id_in_map: waiting for servant to deactivate\n")));
00426
00427
00428
00429
00430
00431 wait_occurred_restart_call = 1;
00432
00433 ++this->waiting_servant_deactivation_;
00434
00435 if (this->poa_->object_adapter ().enable_locking ())
00436 this->poa_->servant_deactivation_condition ().wait ();
00437
00438 --this->waiting_servant_deactivation_;
00439
00440 return 0;
00441 }
00442 else
00443 {
00444 return 1;
00445 }
00446 }
00447 }
00448
00449 CORBA::ULong
00450 ServantRetentionStrategyRetain::waiting_servant_deactivation (void) const
00451 {
00452 return waiting_servant_deactivation_;
00453 }
00454
00455 void
00456 ServantRetentionStrategyRetain::deactivate_all_objects (void)
00457 {
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469 ACE_Array_Base<TAO_Active_Object_Map_Entry *> map_entries
00470 (this->active_object_map_->current_size ());
00471
00472 size_t counter = 0;
00473 TAO_Active_Object_Map::user_id_map::iterator end
00474 = this->active_object_map_->user_id_map_->end ();
00475
00476 for (TAO_Active_Object_Map::user_id_map::iterator iter
00477 = this->active_object_map_->user_id_map_->begin ();
00478 iter != end;
00479 ++iter)
00480 {
00481 TAO_Active_Object_Map::user_id_map::value_type map_pair = *iter;
00482 TAO_Active_Object_Map_Entry *active_object_map_entry = map_pair.second ();
00483
00484 if (!active_object_map_entry->deactivated_)
00485 {
00486 map_entries[counter] = active_object_map_entry;
00487 ++counter;
00488 }
00489 }
00490
00491 for (size_t i = 0;
00492 i < counter;
00493 ++i)
00494 {
00495 this->deactivate_map_entry (map_entries[i]);
00496 }
00497 }
00498
00499 PortableServer::ObjectId *
00500 ServantRetentionStrategyRetain::servant_to_user_id (
00501 PortableServer::Servant servant)
00502 {
00503
00504
00505
00506 if (!((!this->poa_->allow_multiple_activations ()
00507 || this->poa_->allow_implicit_activation ())))
00508 {
00509 throw PortableServer::POA::WrongPolicy ();
00510 }
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527 PortableServer::ObjectId_var user_id;
00528 if (!this->poa_->allow_multiple_activations () &&
00529 this->active_object_map_->
00530 find_user_id_using_servant (servant, user_id.out ()) != -1)
00531 {
00532 return user_id._retn ();
00533 }
00534
00535
00536
00537
00538
00539
00540 if (this->poa_->allow_implicit_activation ())
00541 {
00542
00543
00544
00545 PortableServer::ObjectId_var user_id;
00546 if (this->active_object_map_->
00547 bind_using_system_id_returning_user_id (servant,
00548 this->poa_->server_priority (),
00549 user_id.out ()) != 0)
00550 {
00551 throw ::CORBA::OBJ_ADAPTER ();
00552 }
00553
00554
00555
00556
00557
00558
00559
00560 this->poa_->servant_activated_hook (servant, user_id.in ());
00561
00562
00563 Non_Servant_Upcall non_servant_upcall (*this->poa_);
00564 ACE_UNUSED_ARG (non_servant_upcall);
00565
00566
00567
00568
00569
00570 servant->_add_ref ();
00571
00572 return user_id._retn ();
00573 }
00574
00575
00576
00577
00578 throw PortableServer::POA::ServantNotActive ();
00579 }
00580
00581 PortableServer::ObjectId *
00582 ServantRetentionStrategyRetain::servant_to_system_id_i (
00583 PortableServer::Servant servant,
00584 CORBA::Short &priority)
00585 {
00586
00587
00588
00589 if (!((!this->poa_->allow_multiple_activations ()
00590 || this->poa_->allow_implicit_activation ())))
00591 {
00592 throw PortableServer::POA::WrongPolicy ();
00593 }
00594
00595
00596
00597
00598
00599 PortableServer::ObjectId_var system_id;
00600 if (!this->poa_->allow_multiple_activations () &&
00601 this->active_object_map_->
00602 find_system_id_using_servant (servant,
00603 system_id.out (),
00604 priority) != -1)
00605 {
00606 return system_id._retn ();
00607 }
00608
00609 #if defined (CORBA_E_COMPACT) || defined (CORBA_E_MICRO)
00610
00611
00612 throw PortableServer::POA::WrongPolicy ();
00613 #endif
00614
00615
00616
00617
00618
00619
00620 if (this->poa_->allow_implicit_activation ())
00621 {
00622
00623
00624
00625 PortableServer::ObjectId_var system_id;
00626 if (this->active_object_map_->
00627 bind_using_system_id_returning_system_id (servant,
00628 priority,
00629 system_id.out ()) != 0)
00630 {
00631 throw ::CORBA::OBJ_ADAPTER ();
00632 }
00633
00634
00635
00636
00637
00638
00639
00640 this->poa_->servant_activated_hook (servant, system_id.in ());
00641
00642
00643 Non_Servant_Upcall non_servant_upcall (*this->poa_);
00644 ACE_UNUSED_ARG (non_servant_upcall);
00645
00646
00647
00648
00649
00650 servant->_add_ref ();
00651
00652 return system_id._retn ();
00653 }
00654
00655
00656 throw PortableServer::POA::ServantNotActive ();
00657 }
00658
00659 CORBA::Object_ptr
00660 ServantRetentionStrategyRetain::servant_to_reference (
00661 PortableServer::Servant servant)
00662 {
00663
00664
00665
00666
00667
00668
00669 CORBA::Short priority = this->poa_->server_priority ();
00670
00671 PortableServer::ObjectId_var system_id =
00672 this->servant_to_system_id_i (servant, priority);
00673
00674 PortableServer::ObjectId user_id;
00675
00676
00677
00678 if (this->active_object_map_->
00679 find_user_id_using_system_id (system_id.in (), user_id) != 0)
00680 {
00681 throw ::CORBA::OBJ_ADAPTER ();
00682 }
00683
00684
00685 this->poa_->key_to_object_params_.set (
00686 system_id,
00687 servant->_interface_repository_id (),
00688 servant,
00689 1,
00690 priority,
00691 true);
00692
00693
00694
00695
00696
00697
00698 return this->poa_->invoke_key_to_object_helper_i (
00699 servant->_interface_repository_id (), user_id);
00700 }
00701
00702 PortableServer::ObjectId *
00703 ServantRetentionStrategyRetain::activate_object (
00704 PortableServer::Servant servant,
00705 CORBA::Short priority,
00706 bool &wait_occurred_restart_call)
00707 {
00708 if (!this->poa_->has_system_id ())
00709 {
00710 throw PortableServer::POA::WrongPolicy ();
00711 }
00712
00713 bool may_activate =
00714 this->poa_->is_servant_activation_allowed (servant, wait_occurred_restart_call);
00715
00716 if (!may_activate)
00717 {
00718 if (wait_occurred_restart_call)
00719 {
00720 return 0;
00721 }
00722 else
00723 {
00724 throw PortableServer::POA::ServantAlreadyActive ();
00725 }
00726 }
00727
00728
00729
00730
00731 PortableServer::ObjectId_var user_id;
00732 if (this->active_object_map_->
00733 bind_using_system_id_returning_user_id (servant,
00734 priority,
00735 user_id.out ()) != 0)
00736 {
00737 throw ::CORBA::OBJ_ADAPTER ();
00738 }
00739
00740
00741
00742
00743
00744
00745
00746 this->poa_->servant_activated_hook (servant, user_id.in ());
00747
00748
00749 Non_Servant_Upcall non_servant_upcall (*this->poa_);
00750 ACE_UNUSED_ARG (non_servant_upcall);
00751
00752
00753
00754
00755
00756 servant->_add_ref ();
00757
00758 return user_id._retn ();
00759 }
00760
00761 #if !defined (CORBA_E_MICRO)
00762 void
00763 ServantRetentionStrategyRetain::activate_object_with_id (
00764 const PortableServer::ObjectId &id,
00765 PortableServer::Servant servant,
00766 CORBA::Short priority,
00767 bool &wait_occurred_restart_call)
00768 {
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778 if (this->poa_->has_system_id () &&
00779 !this->poa_->is_poa_generated_id (id))
00780 {
00781 throw ::CORBA::BAD_PARAM ();
00782 }
00783
00784
00785
00786
00787 bool priorities_match = true;
00788 bool result =
00789 this->is_user_id_in_map (id,
00790 priority,
00791 priorities_match,
00792 wait_occurred_restart_call);
00793
00794
00795
00796
00797 if (result)
00798 {
00799 throw PortableServer::POA::ObjectAlreadyActive ();
00800 }
00801 else if (wait_occurred_restart_call)
00802 {
00803
00804
00805
00806 return;
00807 }
00808
00809
00810
00811
00812
00813
00814
00815 if (!priorities_match)
00816 {
00817 throw ::CORBA::BAD_INV_ORDER (CORBA::OMGVMCID | 1,
00818 CORBA::COMPLETED_NO);
00819 }
00820
00821 bool const may_activate =
00822 this->poa_->is_servant_activation_allowed (servant, wait_occurred_restart_call);
00823
00824 if (!may_activate)
00825 {
00826 if (wait_occurred_restart_call)
00827 {
00828 return;
00829 }
00830 else
00831 {
00832 throw PortableServer::POA::ServantAlreadyActive ();
00833 }
00834 }
00835
00836
00837
00838
00839 if (this->active_object_map_->bind_using_user_id (servant,
00840 id,
00841 priority) != 0)
00842 {
00843 throw ::CORBA::OBJ_ADAPTER ();
00844 }
00845
00846
00847
00848
00849
00850
00851
00852 this->poa_->servant_activated_hook (servant, id);
00853
00854
00855 Non_Servant_Upcall non_servant_upcall (*this->poa_);
00856 ACE_UNUSED_ARG (non_servant_upcall);
00857
00858
00859
00860
00861
00862 servant->_add_ref ();
00863 }
00864 #endif
00865
00866 CORBA::Object_ptr
00867 ServantRetentionStrategyRetain::create_reference (
00868 const char *intf,
00869 CORBA::Short priority)
00870 {
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880 PortableServer::ObjectId_var system_id;
00881 PortableServer::ObjectId user_id;
00882
00883 if (this->active_object_map_->
00884 bind_using_system_id_returning_system_id (0,
00885 priority,
00886 system_id.out ()) != 0)
00887 {
00888 throw ::CORBA::OBJ_ADAPTER ();
00889 }
00890
00891
00892 if (this->active_object_map_->
00893 find_user_id_using_system_id (system_id.in (),
00894 user_id) != 0)
00895 {
00896 throw ::CORBA::OBJ_ADAPTER ();
00897 }
00898
00899
00900 this->poa_->key_to_object_params_.set (system_id,
00901 intf,
00902 0,
00903 1,
00904 priority,
00905 true);
00906
00907 return this->poa_->invoke_key_to_object_helper_i (intf,
00908 user_id);
00909 }
00910
00911 CORBA::Object_ptr
00912 ServantRetentionStrategyRetain::create_reference_with_id (
00913 const PortableServer::ObjectId &oid,
00914 const char *intf,
00915 CORBA::Short priority)
00916 {
00917
00918
00919
00920
00921
00922
00923
00924
00925 PortableServer::Servant servant = 0;
00926 PortableServer::ObjectId_var system_id;
00927
00928
00929
00930
00931
00932
00933
00934 if (this->active_object_map_->
00935 find_system_id_using_user_id (oid,
00936 priority,
00937 system_id.out ()) != 0)
00938 {
00939 throw ::CORBA::OBJ_ADAPTER ();
00940 }
00941
00942
00943 this->poa_->key_to_object_params_.set (system_id,
00944 intf,
00945 servant,
00946 1,
00947 priority,
00948 true);
00949
00950 return this->poa_->invoke_key_to_object_helper_i (intf, oid);
00951 }
00952
00953 int
00954 ServantRetentionStrategyRetain::rebind_using_user_id_and_system_id (
00955 PortableServer::Servant servant,
00956 const PortableServer::ObjectId &user_id,
00957 const PortableServer::ObjectId &system_id,
00958 TAO::Portable_Server::Servant_Upcall &servant_upcall)
00959 {
00960 TAO_Active_Object_Map_Entry *entry = 0;
00961 int result = this->active_object_map_->
00962 rebind_using_user_id_and_system_id (servant,
00963 user_id,
00964 system_id,
00965 entry);
00966 servant_upcall.active_object_map_entry(entry);
00967
00968 return result;
00969 }
00970
00971 CORBA::Boolean
00972 ServantRetentionStrategyRetain::servant_has_remaining_activations (
00973 PortableServer::Servant servant)
00974 {
00975 return this->active_object_map_->remaining_activations (servant);
00976 }
00977
00978
00979 ::PortableServer::ServantRetentionPolicyValue
00980 ServantRetentionStrategyRetain::type(void) const
00981 {
00982 return ::PortableServer::RETAIN;
00983 }
00984
00985 }
00986 }
00987
00988 TAO_END_VERSIONED_NAMESPACE_DECL