Hello Felix developer community,

I am having an interesting (and critical) problem running my application with Felix in an embedded environment where an alternate JVM, JamVM is necessary.

The deadlock is non-deterministic with the deadlocked stack traces blocking at odd places (though they might not seem odd to people used to messing with class loading - but a block on new XXX() to me is quite the novelty). An example of the relevant parts of the thread stack is in FelixJamVMDeadlockStackTrace.txt, attached. It shows a lock between:

  • java.lang.ClassLoader.findLoadedClass(ClassLoader.java:580) looks like:

      protected final synchronized Class<?> findLoadedClass(String name)
     {
        checkInitialized();
        return VMClassLoader.findLoadedClass(this, name);
     }

    where line 580 is checkInitialized() which throws an exception if isInitialized is false.

  • net.sf.retrotranslator.runtime.asm.ClassReader.readConst(ClassReader.java:1591) looks like:

        public Object readConst(final int item, final char[] buf) {
            int index = items[item];
            switch (b[index - 1]) {
                case ClassWriter.INT:
                    return new Integer(readInt(index));
                case ClassWriter.FLOAT:
                    return new Float(Float.intBitsToFloat(readInt(index)));
                case ClassWriter.LONG:
                    return new Long(readLong(index));
                case ClassWriter.DOUBLE:
                    return new Double(Double.longBitsToDouble(readLong(index)));
                case ClassWriter.CLASS:
                    String s = readUTF8(index, buf);
                    return Type.getType(s.charAt(0) == '[' ? s : "L" + s + ";");
                // case ClassWriter.STR:
                default:
                    return readUTF8(index, buf);
            }
        }
    where line 1591 is return new Integer(readInt(index));

  • org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.findClass(BundleWiringImpl.java:2038) is a big method, where line 2038 looks inconspicuously like:

    if (!hooks.isEmpty())

Gogo and Retrotranslator are red herrings, without them in the application the deadlock just happens somewhere else.

I don't even vaguely understand how, but neither Eclipse nor Knopflerfish suffer from this problem. I would, however, much rather use Felix.

Please let me know if there's any further information I can provide.

Best, Dan.


"Gogo shell" (daemon) 0x7fdd84267600 priority: 5 tid: 0x7fdd8b5fc700 id: 8 
state: BLOCKED (5)
        at 
org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.findClass(BundleWiringImpl.java:2038)
        at 
org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1501)
        at 
org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
        at 
org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:293)
        at 
net.sf.retrotranslator.runtime.impl.WeakIdentityTable.obtain(WeakIdentityTable.java:53)
        at net.sf.retrotranslator.runtime.java.lang.Enum_.<init>(Enum_.java:62)
        at 
org.apache.felix.gogo.runtime.Tokenizer$Type.<init>(Tokenizer.java:58)
        at 
org.apache.felix.gogo.runtime.Tokenizer$Type.<clinit>(Tokenizer.java:49)
        at org.apache.felix.gogo.runtime.Tokenizer.<init>(Tokenizer.java:77)
        at org.apache.felix.gogo.runtime.Tokenizer.<init>(Tokenizer.java:89)
        at org.apache.felix.gogo.runtime.Parser.<init>(Parser.java:35)
        at org.apache.felix.gogo.runtime.Closure.<init>(Closure.java:61)
        at 
org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:88)
        at org.apache.felix.gogo.shell.Activator.run(Activator.java:75)
        at java.lang.Thread.run(Thread.java:745)

"Amqp Reconnection" (daemon) 0x7fdd841d7470 priority: 5 tid: 0x7fdd8bdfd700 id: 
7 state: BLOCKED (5)
        at 
net.sf.retrotranslator.runtime.asm.ClassReader.readConst(ClassReader.java:1591)
        at 
net.sf.retrotranslator.runtime.asm.ClassReader.accept(ClassReader.java:536)
        at 
net.sf.retrotranslator.runtime.asm.ClassReader.accept(ClassReader.java:300)
        at 
net.sf.retrotranslator.runtime.impl.ClassDescriptor.<init>(ClassDescriptor.java:67)
        at 
net.sf.retrotranslator.runtime.impl.ClassDescriptor.getInstance(ClassDescriptor.java:86)
        at 
net.sf.retrotranslator.runtime.java.lang._Class.getEnclosingClass(_Class.java:126)
        at 
net.sf.retrotranslator.runtime.java.lang._Class.getSimpleName(_Class.java:171)
        at 
com.redbite.rededge.amqp.RedEdgeConnectionFactory.toString(RedEdgeConnectionFactory.java:40)
        at java.lang.String.valueOf(String.java:1832)
        at java.lang.AbstractStringBuffer.append(AbstractStringBuffer.java:283)
        at java.lang.StringBuffer.append(StringBuffer.java:293)
        at com.redbite.rededge.amqp.Activator$2.getService(Activator.java:46)
        at com.redbite.rededge.amqp.Activator$2.getService(Activator.java:42)
        at 
com.redbite.rededge.amqp.Activator.tryToGetAChannel(Activator.java:86)
        at com.redbite.rededge.amqp.Activator$3.run(Activator.java:58)
        at 
edu.emory.mathcs.backport.java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442)
        at 
edu.emory.mathcs.backport.java.util.concurrent.FutureTask.runAndReset(FutureTask.java:200)
        at 
edu.emory.mathcs.backport.java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:151)
        at 
edu.emory.mathcs.backport.java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:263)
        at 
edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1061)
        at 
edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:575)
        at java.lang.Thread.run(Thread.java:745)

"FelixStartLevel" (daemon) 0x17df4f0 priority: 5 tid: 0x7fdd909c9700 id: 6 
state: BLOCKED (5)
        at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:580)
        at 
org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1948)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:293)
        at 
org.apache.felix.framework.BundleWiringImpl.getClassByDelegation(BundleWiringImpl.java:1374)
        at 
org.apache.felix.framework.BundleWiringImpl.searchDynamicImports(BundleWiringImpl.java:1630)
        at 
org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1511)
        at 
org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
        at 
org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:293)
        at 
org.apache.felix.scr.impl.manager.AbstractComponentManager.<clinit>(AbstractComponentManager.java:225)
        at 
org.apache.felix.scr.impl.config.ImmediateComponentHolder.createComponentManager(ImmediateComponentHolder.java:130)
        at 
org.apache.felix.scr.impl.config.ImmediateComponentHolder.<init>(ImmediateComponentHolder.java:116)
        at 
org.apache.felix.scr.impl.ComponentRegistry.createComponentHolder(ComponentRegistry.java:546)
        at 
org.apache.felix.scr.impl.BundleComponentActivator.loadDescriptor(BundleComponentActivator.java:247)
        at 
org.apache.felix.scr.impl.BundleComponentActivator.initialize(BundleComponentActivator.java:149)
        at 
org.apache.felix.scr.impl.BundleComponentActivator.<init>(BundleComponentActivator.java:113)
        at 
org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:261)
        at 
org.apache.felix.scr.impl.Activator.loadAllComponents(Activator.java:199)
        at org.apache.felix.scr.impl.Activator.start(Activator.java:108)
        at 
org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)
        at org.apache.felix.framework.Felix.activateBundle(Felix.java:2146)
        at org.apache.felix.framework.Felix.startBundle(Felix.java:2064)
        at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1291)
        at 
org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:304)
        at java.lang.Thread.run(Thread.java:745)


Reply via email to