Exception when uninstalling a bundle that contains a native library (and loaded 
it at bundle startup).
------------------------------------------------------------------------------------------------------

                 Key: FELIX-733
                 URL: https://issues.apache.org/jira/browse/FELIX-733
             Project: Felix
          Issue Type: Improvement
          Components: Framework
         Environment: WinXP, eclipse, sun jdk 1.5 or 1.6
            Reporter: Sylvain MARIE
            Priority: Minor


Here is a short description of the problem and how I managed to fix it. Don't 
hesitate to contact me for details
or to tell me if something here is wrong ! Cheers. Sylvain.

1- bundle "foo" embeds a native library "lib.dll" and declares it in its 
manifest, with appropriate platform declaration (os, version, processor).
2- foo's activator loads that library in the start(bc) method - with 
System.loadLibrary(...).
3- the library loads succesfully (this can be checked with e.g. processExplorer 
or pmap)
4- the bundle is stopped.
5- the bundle is uninstalled. 

> ERROR: org.apache.felix.framework.cache.BundleArchive: Unable to delete 
> archive directory

Why does this happen :
- step 4: the library is not unloaded because foo's contentclassloader is still 
alive. This is normal.
- step 5: automatic package refresh : all bundles from uninstalled list are 
garbaged. Method 
Felix.garbageCollectBundle attemps to remove the bundle archive from the cache, 
but
the dll file is still in use => ERROR. The dll is still in use because foo's 
contentclassloader has not yet
been garbaged out.

How to fix this:  
--------------------
We need the ContentClassLoader to be garbaged out. So first release all
references to foo's activator, then release all references to the 
ContentClassLoader itself,
and finally do a System.gc() before attempting to remove the bundle from the 
cache.
Two methods are impacted: ContentLoaderImpl.close() and 
Felix.garbageCollectBundle(...)


ContentLoaderImpl.java
-----------------------------------
public synchronized void close()
    {
        ...
        ...
        
        // FIX SMA : release content class loader
        m_classLoader = null;
    }

Felix.java
-------------
private void garbageCollectBundle(FelixBundle bundle) throws Exception
    {
        
        ....
        
        // FIX SMA : release reference to the activator
        bundle.getInfo().setActivator(null);
        
        // Do the garbage collection either systematically, or only if native 
libraries were loaded, or ... 
        System.gc(); // this destroys the activator, the contentclassloader, 
and unloads the dll.
        // end FIX SMA
        
        // Remove the bundle from the cache.
        m_cache.remove(m_cache.getArchive(bundle.getBundleId()));
    }



-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to