tylertian123 / RobotPathfinder

Robot motion profiler/path planner for use in FRC Java programming

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Random IllegalArgumentException when a lot of objects are created

tylertian123 opened this issue · comments

Using this code to repeatedly run TankDriveTrajectoryTest, the test usually fails after running less than 100 times:

int i = 0;
JUnitCore c = new JUnitCore();
Result r;
while((r = c.run(TankDriveTrajectoryTest.class)).wasSuccessful()) {
    System.out.println(i++);
}

for(Failure f : r.getFailures()) {
    System.out.println(f.toString());
    f.getException().printStackTrace();
}

Stack trace:

java.lang.IllegalStateException: This object has already been freed
        at com.arctos6135.robotpathfinder.core.trajectory.TankDriveTrajectory.totalTime(Native Method)
        at com.arctos6135.robotpathfinder.tests.core.trajectory.TankDriveTrajectoryTest.testTankDriveTrajectoryMultipleMirroring(TankDriveTrajectoryTest.java:222)
        at jdk.internal.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
        at org.junit.rules.RunRules.evaluate(RunRules.java:20)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at org.junit.runners.Suite.runChild(Suite.java:128)
        at org.junit.runners.Suite.runChild(Suite.java:27)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:105)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:94)
        at DebugTests.main(DebugTests.java:97)

This seems to be caused by a bug in the GlobalLifeCycleManager, since if the resource disposal threads are turned off, this problem doesn't seem to occur.

This problem might be caused by the JNI objects still remaining in the phantom reference queue of the GlobalLifeCycleManager even after the free() or close() method is called.

Fixed in a6279aa.