diff options
Diffstat (limited to 'externals/ace/Service_Repository.cpp')
-rw-r--r-- | externals/ace/Service_Repository.cpp | 630 |
1 files changed, 0 insertions, 630 deletions
diff --git a/externals/ace/Service_Repository.cpp b/externals/ace/Service_Repository.cpp deleted file mode 100644 index 10195145ff1..00000000000 --- a/externals/ace/Service_Repository.cpp +++ /dev/null @@ -1,630 +0,0 @@ -// $Id: Service_Repository.cpp 90337 2010-05-28 20:00:49Z cbeaulac $ - -#include "ace/Service_Repository.h" - -#if !defined (__ACE_INLINE__) -#include "ace/Service_Repository.inl" -#endif /* __ACE_INLINE__ */ - -#include "ace/Service_Types.h" -#include "ace/Object_Manager.h" -#include "ace/Log_Msg.h" -#include "ace/ACE.h" -#include "ace/OS_NS_unistd.h" -#include "ace/OS_NS_errno.h" -#include "ace/OS_NS_string.h" - -ACE_RCSID (ace, - Service_Repository, - "$Id: Service_Repository.cpp 90337 2010-05-28 20:00:49Z cbeaulac $") - - ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -ACE_ALLOC_HOOK_DEFINE(ACE_Service_Repository) - -/// Process-wide Service Repository. -ACE_Service_Repository *ACE_Service_Repository::svc_rep_ = 0; - -/// Controls whether the Service_Repository is deleted when we shut -/// down (we can only delete it safely if we created it)! -bool ACE_Service_Repository::delete_svc_rep_ = false; - -void -ACE_Service_Repository::dump (void) const -{ -#if defined (ACE_HAS_DUMP) - ACE_TRACE ("ACE_Service_Repository::dump"); -#endif /* ACE_HAS_DUMP */ -} - -ACE_Service_Repository * -ACE_Service_Repository::instance (size_t size) -{ - ACE_TRACE ("ACE_Service_Repository::instance"); - - if (ACE_Service_Repository::svc_rep_ == 0) - { - // Perform Double-Checked Locking Optimization. - ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon, - *ACE_Static_Object_Lock::instance (), 0)); - if (ACE_Service_Repository::svc_rep_ == 0) - { - if (ACE_Object_Manager::starting_up () || - !ACE_Object_Manager::shutting_down ()) - { - ACE_NEW_RETURN (ACE_Service_Repository::svc_rep_, - ACE_Service_Repository (size), - 0); - ACE_Service_Repository::delete_svc_rep_ = true; - } - } - } - - return ACE_Service_Repository::svc_rep_; -} - -ACE_Service_Repository * -ACE_Service_Repository::instance (ACE_Service_Repository *s) -{ - ACE_TRACE ("ACE_Service_Repository::instance"); - ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon, - *ACE_Static_Object_Lock::instance (), 0)); - - ACE_Service_Repository *t = ACE_Service_Repository::svc_rep_; - // We can't safely delete it since we don't know who created it! - ACE_Service_Repository::delete_svc_rep_ = false; - - ACE_Service_Repository::svc_rep_ = s; - return t; -} - -void -ACE_Service_Repository::close_singleton (void) -{ - ACE_TRACE ("ACE_Service_Repository::close_singleton"); - - ACE_MT (ACE_GUARD (ACE_Recursive_Thread_Mutex, ace_mon, - *ACE_Static_Object_Lock::instance ())); - - if (ACE_Service_Repository::delete_svc_rep_) - { - delete ACE_Service_Repository::svc_rep_; - ACE_Service_Repository::svc_rep_ = 0; - ACE_Service_Repository::delete_svc_rep_ = false; - } -} - -/// Initialize the Repository to a clean slate. -int -ACE_Service_Repository::open (size_t size) -{ - ACE_TRACE ("ACE_Service_Repository::open"); - - // Create a new array and swap it with the local array - array_type local_array (size); - this->service_array_.swap (local_array); - - return 0; -} - -ACE_Service_Repository::ACE_Service_Repository (size_t size) - : service_array_ (size) -{ - ACE_TRACE ("ACE_Service_Repository::ACE_Service_Repository"); -} - - -/// Finalize (call fini() and possibly delete) all the services. - -int -ACE_Service_Repository::fini (void) -{ - ACE_TRACE ("ACE_Service_Repository::fini"); - ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon, this->lock_, -1)); - - int retval = 0; - // Do not be tempted to use the prefix decrement operator. Use - // postfix decrement operator since the index is unsigned and may - // wrap around the 0 - // - // debug output for empty service entries -#ifndef ACE_NLOGGING - if (ACE::debug ()) - { - for (size_t i = this->service_array_.size (); i-- != 0;) - { - ACE_Service_Type *s = - const_cast<ACE_Service_Type *> (this->service_array_[i]); - if (s == 0) - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("ACE (%P|%t) SR::fini, repo=%@ [%d] -> 0\n"), - this, - i)); - } - } -#endif - // - // Remove all the Service_Object and Stream instances - // - for (size_t i = this->service_array_.size (); i-- != 0;) - { - // <fini> the services in reverse order. - ACE_Service_Type *s = - const_cast<ACE_Service_Type *> (this->service_array_[i]); - - if (s != 0 && - s->type () != 0 && - (s->type ()->service_type () != ACE_Service_Type::MODULE)) - { -#ifndef ACE_NLOGGING - if (ACE::debug ()) - { - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("ACE (%P|%t) SR::fini, repo=%@ [%d], ") - ACE_TEXT ("name=%s, type=%@, object=%@, active=%d\n"), - this, - i, - s->name (), - s->type (), - (s->type () != 0) ? s->type ()->object () : 0, - s->active ())); - } -#endif - - // Collect any errors. - retval += s->fini (); - } - } - // - // Remove all the Module instances - // - for (size_t i = this->service_array_.size (); i-- != 0;) - { - // <fini> the services in reverse order. - ACE_Service_Type *s = - const_cast<ACE_Service_Type *> (this->service_array_[i]); - - if (s != 0 && - s->type () != 0 && - (s->type ()->service_type () == ACE_Service_Type::MODULE)) - { -#ifndef ACE_NLOGGING - if (ACE::debug ()) - { - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("ACE (%P|%t) SR::fini, repo=%@ [%d], ") - ACE_TEXT ("name=%s, type=%@, object=%@, active=%d\n"), - this, - i, - s->name (), - s->type (), - (s->type () != 0) ? s->type ()->object () : 0, - s->active ())); - } -#endif - // Collect any errors. - retval += s->fini (); - } - } - return (retval == 0) ? 0 : -1; -} - - -/// Close down all the services. -int -ACE_Service_Repository::close (void) -{ - ACE_TRACE ("ACE_Service_Repository::close"); - ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon, this->lock_, -1)); - -#ifndef ACE_NLOGGING - if(ACE::debug ()) - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("ACE (%P|%t) SR::close - repo=%@, size=%d\n"), - this, - this->service_array_.size())); -#endif - - // Do not use the prefix decrement operator since the index is - // unsigned and may wrap around the 0. - for (size_t i = this->service_array_.size(); i-- != 0; ) - { - // Delete services in reverse order. - ACE_Service_Type *s = - const_cast<ACE_Service_Type *> (this->service_array_[i]); - -#ifndef ACE_NLOGGING - if(ACE::debug ()) - { - if (s == 0) - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("ACE (%P|%t) SR::close - repo=%@ [%d] -> 0\n"), - this, - i)); - else - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("ACE (%P|%t) SR::close - repo=%@ [%d], name=%s, object=%@\n"), - this, - i, - s->name (), - s)); - } -#endif - delete s; - } - - this->service_array_.clear (); - - return 0; -} - -ACE_Service_Repository::~ACE_Service_Repository (void) -{ - ACE_TRACE ("ACE_Service_Repository::~ACE_Service_Repository"); -#ifndef ACE_NLOGGING - if(ACE::debug ()) - ACE_DEBUG ((LM_DEBUG, "ACE (%P|%t) SR::<dtor>, this=%@\n", this)); -#endif - this->close (); -} - -/// Locate an entry with @a name in the table. If @a ignore_suspended is -/// set then only consider services marked as resumed. If the caller -/// wants the located entry, pass back a pointer to the located entry -/// via @a srp. If @a name is not found -1 is returned. If @a name is -/// found, but it is suspended and the caller wants to ignore suspended -/// services a -2 is returned. Must be called with locks held. -int -ACE_Service_Repository::find_i (const ACE_TCHAR name[], - size_t &slot, - const ACE_Service_Type **srp, - bool ignore_suspended) const -{ - ACE_TRACE ("ACE_Service_Repository::find_i"); - size_t i = 0; - array_type::const_iterator element = this->service_array_.end (); - - for (i = 0; i < this->service_array_.size(); i++) - { - array_type::const_iterator iter = this->service_array_.find (i); - if (iter != this->service_array_.end () - && (*iter).second != 0 // skip any empty slots - && ACE_OS::strcmp (name, (*iter).second->name ()) == 0) - { - element = iter; - break; - } - } - - if (element != this->service_array_.end ()) - { - slot = i; - if ((*element).second->fini_called ()) - { - if (srp != 0) - *srp = 0; - return -1; - } - - if (srp != 0) - *srp = (*element).second; - - if (ignore_suspended - && (*element).second->active () == 0) - return -2; - - return 0; - } - - return -1; -} - - -/// @brief Relocate (a static) service to another DLL. -/// -/// Works by having the service type keep a reference to a specific -/// DLL. No locking, caller makes sure calling it is safe. You can -/// forcefully relocate any DLLs in the given range, not only the -/// static ones - but that will cause Very Bad Things (tm) to happen. -int -ACE_Service_Repository::relocate_i (size_t begin, - size_t end, - const ACE_DLL& adll) -{ - ACE_SHLIB_HANDLE new_handle = adll.get_handle (0); - - for (size_t i = begin; i < end; i++) - { - ACE_Service_Type *type = - const_cast<ACE_Service_Type *> (this->service_array_[i]); - - ACE_SHLIB_HANDLE old_handle = (type == 0) ? ACE_SHLIB_INVALID_HANDLE - : type->dll ().get_handle (0); - -#ifndef ACE_NLOGGING - if (ACE::debug ()) - { - if (type == 0) - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("ACE (%P|%t) SR::relocate_i - repo=%@ [%d]") - ACE_TEXT (": skipping empty slot\n"), - this, - i)); - else - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("ACE (%P|%t) SR::relocate_i - repo=%@ [%d]") - ACE_TEXT (": trying name=%s, handle: %d -> %d\n"), - this, - i, - type->name (), - old_handle, - new_handle)); - } -#endif - - if (type != 0 // skip any gaps - && old_handle == ACE_SHLIB_INVALID_HANDLE - && new_handle != old_handle) - { -#ifndef ACE_NLOGGING - if (ACE::debug ()) - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("ACE (%P|%t) SR::relocate_i - repo=%@ [%d]") - ACE_TEXT (": relocating name=%s, handle: %d -> %d\n"), - this, - i, - type->name (), - old_handle, - new_handle)); -#endif - type->dll (adll); // ups the refcount on adll - } - } - - return 0; -} - -int -ACE_Service_Repository::find (const ACE_TCHAR name[], - const ACE_Service_Type **srp, - bool ignore_suspended) const -{ - ACE_TRACE ("ACE_Service_Repository::find"); - ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon, this->lock_, -1)); - size_t ignore_location = 0; - return this->find_i (name, ignore_location, srp, ignore_suspended); -} - -/// Insert the ACE_Service_Type SR into the repository. Note that -/// services may be inserted either resumed or suspended. Using same -/// name as in an existing service causes the delete () to be called -/// for the old one, i.e. make sure @code sr is allocated on the heap! -int -ACE_Service_Repository::insert (const ACE_Service_Type *sr) -{ - ACE_TRACE ("ACE_Service_Repository::insert"); - - size_t i = 0; - int return_value = -1; - ACE_Service_Type const *s = 0; - - // Establish scope for locking while manipulating the service - // storage - { - // @TODO: Do we need a recursive mutex here? - ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, - ace_mon, - this->lock_, - -1)); - - return_value = find_i (sr->name (), i, &s, false); - - // Adding an entry. - if (s != 0) - { - this->service_array_[i] = sr; - } - else - { - // New services are always added where current_size_ points, - // because if any DLL relocation needs to happen, it will be - // performed on services with indexes between some old - // current_size_ and the new current_size_ value. See - // ACE_Service_Type_Dynamic_Guard ctor and dtor for details. - - if (i < this->service_array_.size ()) - i = this->service_array_.size (); - - this->service_array_[i] = sr; - return_value = 0; - } - } -#ifndef ACE_NLOGGING - if (ACE::debug ()) - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("ACE (%P|%t) SR::insert - repo=%@ [%d],") - ACE_TEXT (" name=%s (%C) (type=%@, object=%@, active=%d)\n"), - this, - i, - sr->name(), - (return_value == 0 ? ((s==0) ? "new" : "replacing") : "failed"), - sr->type (), - (sr->type () != 0) ? sr->type ()->object () : 0, - sr->active ())); -#endif - - // If necessary, delete but outside the lock. (s may be 0, but - // that's okay, too) - delete s; - - if (return_value == -1) - ACE_OS::last_error (ENOSPC); - - return return_value; -} - -/// Resume a service that was previously suspended. -int -ACE_Service_Repository::resume (const ACE_TCHAR name[], - const ACE_Service_Type **srp) -{ - ACE_TRACE ("ACE_Service_Repository::resume"); - ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon, this->lock_, -1)); - - size_t i = 0; - if (-1 == this->find_i (name, i, srp, 0)) - return -1; - - return this->service_array_[i]->resume (); -} - -/// Suspend a service so that it will not be considered active under -/// most circumstances by other portions of the ACE_Service_Repository. -int -ACE_Service_Repository::suspend (const ACE_TCHAR name[], - const ACE_Service_Type **srp) -{ - ACE_TRACE ("ACE_Service_Repository::suspend"); - ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon, this->lock_, -1)); - size_t i = 0; - if (-1 == this->find_i (name, i, srp, 0)) - return -1; - - return this->service_array_[i]->suspend (); -} - -/** - * @brief Completely remove a @a name entry from the Repository and - * dynamically unlink it if it was originally dynamically linked. - */ -int -ACE_Service_Repository::remove (const ACE_TCHAR name[], ACE_Service_Type **ps) -{ - ACE_TRACE ("ACE_Service_Repository::remove"); - ACE_Service_Type *s = 0; - { - ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon, this->lock_, -1)); - - // Not found!? - if (this->remove_i (name, &s) == -1) - return -1; - } - - if (ps != 0) - *ps = s; - else - delete s; - return 0; -} - -/** - * @brief Completely remove a @a name entry from the Repository and - * dynamically unlink it if it was originally dynamically linked. - * - * Return a ptr to the entry in @code ps. There is no locking so make - * sure you hold the repo lock when calling. - * - * Since the order of services in the Respository matters, we can't - * simply overwrite the entry being deleted with the last and - * decrement the @c current_size by 1. A good example of why the order - * matters is a dynamic service, in whose DLL there is at least one - * static service. In order to prevent SEGV during finalization, those - * static services must be finalized _before_the dynamic service that - * owns them. Otherwice the TEXT segment, containing the code for the - * static service's desructor may be unloaded with the DLL. - * - * Neither can we "pack" the array because this may happen inside the - * scope of a Service_Dynamic_Guard, which caches an index where - * loading of a DLL started in order to relocate dependent services. - */ -int -ACE_Service_Repository::remove_i (const ACE_TCHAR name[], ACE_Service_Type **ps) -{ - size_t i = 0; - if (-1 == this->find_i (name, i, 0, false)) - return -1; // Not found - - // We may need the old ptr - to be delete outside the lock! - *ps = const_cast<ACE_Service_Type *> (this->service_array_[i]); - -#ifndef ACE_NLOGGING - if (ACE::debug ()) - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("ACE (%P|%t) SR::remove_i - repo=%@ [%d],") - ACE_TEXT (" name=%s (removed) (type=%@, active=%d)\n"), - this, - i, - name, - *ps, - (*ps)->active ())); -#endif - - this->service_array_[i] = 0; // simply leave a gap - return 0; -} - -ACE_ALLOC_HOOK_DEFINE(ACE_Service_Repository_Iterator) - -void -ACE_Service_Repository_Iterator::dump (void) const -{ -#if defined (ACE_HAS_DUMP) - ACE_TRACE ("ACE_Service_Repository_Iterator::dump"); -#endif /* ACE_HAS_DUMP */ -} - -/// Initializes the iterator and skips over any suspended entries at -/// the beginning of the table, if necessary. Note, you must not -/// perform destructive operations on elements during this iteration... -ACE_Service_Repository_Iterator::ACE_Service_Repository_Iterator - (ACE_Service_Repository &sr, bool ignored_suspended) - : svc_rep_ (sr), - next_ (0), - ignore_suspended_ (ignored_suspended) -{ - while (!(done() || valid())) - this->next_++; -} - -/// Obtains a pointer to the next valid service in the table. If there -/// are no more entries, returns 0, else 1. -int -ACE_Service_Repository_Iterator::next (const ACE_Service_Type *&sr) -{ - ACE_TRACE ("ACE_Service_Repository_Iterator::next"); - - if (done ()) - return 0; - - sr = this->svc_rep_.service_array_[this->next_]; - return 1; -} - -/// Advance the iterator by the proper amount. If we are ignoring -/// suspended entries and the current entry is suspended, then we must -/// skip over this entry. Otherwise, we must advance the NEXT index to -/// reference the next valid service entry. -int -ACE_Service_Repository_Iterator::advance (void) -{ - ACE_TRACE ("ACE_Service_Repository_Iterator::advance"); - - if (done()) return 0; - - do this->next_++; while (!(done () || valid ())); - - return !done(); -} - -bool -ACE_Service_Repository_Iterator::valid (void) const -{ - ACE_TRACE ("ACE_Service_Repository_Iterator::valid"); - if (!this->ignore_suspended_) - return (this->svc_rep_.service_array_[this->next_] != 0); // skip over gaps - - return (this->svc_rep_.service_array_[this->next_] != 0 - && this->svc_rep_.service_array_[this->next_]->active ()); -} - -ACE_END_VERSIONED_NAMESPACE_DECL |