class_loader.cpp
Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2012, Willow Garage, Inc.
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions are met:
00007  *
00008  *     * Redistributions of source code must retain the above copyright
00009  *       notice, this list of conditions and the following disclaimer.
00010  *     * Redistributions in binary form must reproduce the above copyright
00011  *       notice, this list of conditions and the following disclaimer in the
00012  *       documentation and/or other materials provided with the distribution.
00013  *     * Neither the name of the Willow Garage, Inc. nor the names of its
00014  *       contributors may be used to endorse or promote products derived from
00015  *       this software without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00018  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00021  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00022  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00023  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00024  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00025  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00026  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00027  * POSSIBILITY OF SUCH DAMAGE.
00028  */
00029 
00030 #include "class_loader/class_loader.h"
00031 
00032 namespace class_loader
00033 {
00034 
00035 bool ClassLoader::has_unmananged_instance_been_created_ = false;
00036 
00037 bool ClassLoader::hasUnmanagedInstanceBeenCreated()
00038 {
00039   return ClassLoader::has_unmananged_instance_been_created_;
00040 }
00041 
00042 std::string systemLibrarySuffix()
00043 {
00044   return(Poco::SharedLibrary::suffix());
00045 }
00046 
00047 ClassLoader::ClassLoader(const std::string& library_path, bool ondemand_load_unload) :
00048 ondemand_load_unload_(ondemand_load_unload),
00049 library_path_(library_path),
00050 load_ref_count_(0),
00051 plugin_ref_count_(0)
00052 {
00053   logDebug("class_loader::ClassLoader: Constructing new ClassLoader (%p) bound to library %s.", this, library_path.c_str());
00054   if(!isOnDemandLoadUnloadEnabled())
00055     loadLibrary();
00056 }
00057 
00058 ClassLoader::~ClassLoader()
00059 {
00060   logDebug("class_loader::ClassLoader: Destroying class loader, unloading associated library...\n");
00061   unloadLibrary(); //TODO: while(unloadLibrary() > 0){} ??
00062 }
00063 
00064 bool ClassLoader::isLibraryLoaded()
00065 {
00066   return(class_loader::class_loader_private::isLibraryLoaded(getLibraryPath(), this));
00067 }
00068 
00069 bool ClassLoader::isLibraryLoadedByAnyClassloader()
00070 {
00071   return(class_loader::class_loader_private::isLibraryLoadedByAnybody(getLibraryPath()));
00072 }
00073 
00074 void ClassLoader::loadLibrary()
00075 {
00076   boost::recursive_mutex::scoped_lock lock(load_ref_count_mutex_);
00077   load_ref_count_ = load_ref_count_ + 1;
00078   class_loader::class_loader_private::loadLibrary(getLibraryPath(), this);
00079 }
00080 
00081 int ClassLoader::unloadLibrary()
00082 {
00083   return(unloadLibraryInternal(true));
00084 }
00085 
00086 int ClassLoader::unloadLibraryInternal(bool lock_plugin_ref_count)
00087 {
00088   boost::recursive_mutex::scoped_lock load_ref_lock(load_ref_count_mutex_);
00089   boost::recursive_mutex::scoped_lock plugin_ref_lock;
00090   if(lock_plugin_ref_count)
00091     plugin_ref_lock = boost::recursive_mutex::scoped_lock(plugin_ref_count_mutex_);
00092 
00093   if(plugin_ref_count_ > 0)
00094     logWarn("class_loader::ClassLoader: SEVERE WARNING!!! Attempting to unload library while objects created by this loader exist in the heap! You should delete your objects before attempting to unload the library or destroying the ClassLoader. The library will NOT be unloaded.");
00095   else
00096   {
00097     load_ref_count_ = load_ref_count_ - 1;
00098     if(load_ref_count_ == 0)
00099       class_loader::class_loader_private::unloadLibrary(getLibraryPath(), this);
00100     else if(load_ref_count_ < 0)
00101       load_ref_count_ = 0;
00102   }
00103   return(load_ref_count_);
00104 }
00105 
00106 }


class_loader
Author(s): Mirza Shah
autogenerated on Sun Oct 5 2014 22:50:57