/** * Returns the number of handles currently being tracked by this * memory manager. * * Throws an IllegalStateException if the memory manager is used after it's * been released. * * @return The object reference count */ public int getObjectReferenceCount() { checkReleased(); return references.size(); }
/** * Creates a new {@link Nodejs}. * * @param basedir Base dir where to deploy a library. * @param loader Class loader to use. */ public Nodejs(final File basedir, final ClassLoader loader) { this.basedir = requireNonNull(basedir, "Basedir required."); this.loader = requireNonNull(loader, "ClassLoader required."); this.node = NodeJS.createNodeJS(); V8 v8 = node.getRuntime(); this.scope = new MemoryManager(v8); }
@Test public void testCanReleaseTwice() { MemoryManager memoryManager = new MemoryManager(v8); memoryManager.release(); memoryManager.release(); }
@Test(expected = IllegalStateException.class) public void testMemoryManagerReleased_CannotCallGetObjectReferenceCount() { MemoryManager memoryManager = new MemoryManager(v8); memoryManager.release(); memoryManager.getObjectReferenceCount(); }
@Test(expected = IllegalStateException.class) public void testCannotCallPersistOnReleasedManager() { MemoryManager memoryManager = new MemoryManager(v8); V8Object object = new V8Object(v8); memoryManager.release(); memoryManager.persist(object); }
@Test public void testIsReleasedTrue() { MemoryManager memoryManager = new MemoryManager(v8); memoryManager.release(); assertTrue(memoryManager.isReleased()); }
@Test public void testMemoryReferenceCount0() { MemoryManager memoryManager = new MemoryManager(v8); assertEquals(0, memoryManager.getObjectReferenceCount()); }
@Test public void testIsReleasedFalse() { MemoryManager memoryManager = new MemoryManager(v8); assertFalse(memoryManager.isReleased()); }
@Override public void v8HandleDisposed(final V8Value object) { // Throws CME memoryManager.persist(object); }
@SuppressWarnings("resource") @Test public void testNestedMemoryManagers() { MemoryManager memoryManager1 = new MemoryManager(v8); MemoryManager memoryManager2 = new MemoryManager(v8); new V8Object(v8); memoryManager2.release(); new V8Object(v8); assertEquals(1, v8.getObjectReferenceCount()); memoryManager1.release(); assertEquals(0, v8.getObjectReferenceCount()); }
@SuppressWarnings("resource") @Test public void testNestedMemoryManagerHasProperObjectCount() { MemoryManager memoryManager1 = new MemoryManager(v8); new V8Object(v8); MemoryManager memoryManager2 = new MemoryManager(v8); new V8Object(v8); assertEquals(2, memoryManager1.getObjectReferenceCount()); assertEquals(1, memoryManager2.getObjectReferenceCount()); memoryManager2.release(); assertEquals(1, memoryManager1.getObjectReferenceCount()); memoryManager1.release(); }
@Test public void testPersistObject() { MemoryManager memoryManager = new MemoryManager(v8); V8Object object = new V8Object(v8); memoryManager.persist(object); memoryManager.release(); assertFalse(object.isReleased()); object.close(); }
@SuppressWarnings("resource") public void testExceptionDuringReleaseDoesNotReleaseMemoryManager() { memoryManager = new MemoryManager(v8); ReferenceHandler handler = new ReferenceHandler() { @Override public void v8HandleDisposed(final V8Value object) { // Throws CME memoryManager.persist(object); } @Override public void v8HandleCreated(final V8Value object) { } }; v8.addReferenceHandler(handler); new V8Object(v8); try { memoryManager.release(); } catch (ConcurrentModificationException e) { } assertFalse(memoryManager.isReleased()); v8.removeReferenceHandler(handler); memoryManager.release(); assertTrue(memoryManager.isReleased()); }
@Test public void testMemoryReferenceCount0_AfterRemove() { MemoryManager memoryManager = new MemoryManager(v8); new V8Object(v8).close(); assertEquals(0, memoryManager.getObjectReferenceCount()); }
@SuppressWarnings("resource") @Test public void testObjectIsReleased() { MemoryManager memoryManager = new MemoryManager(v8); V8Object object = new V8Object(v8); memoryManager.release(); assertTrue(object.isReleased()); }
@SuppressWarnings("resource") @Test public void testNestedMemoryManager_ReverseReleaseOrder() { MemoryManager memoryManager1 = new MemoryManager(v8); new V8Object(v8); MemoryManager memoryManager2 = new MemoryManager(v8); new V8Object(v8); assertEquals(2, memoryManager1.getObjectReferenceCount()); assertEquals(1, memoryManager2.getObjectReferenceCount()); memoryManager1.release(); assertEquals(0, memoryManager2.getObjectReferenceCount()); memoryManager2.release(); }
/** * Persist an object that is currently being managed by this Manager. * * Objects that are being managed by a MemoryManager will be released * once the MemoryManager is released. If an object is persisted, it will * be remove from the MemoryManager's control and therefore will not * be released. * * @param object The object to persist */ public void persist(final V8Value object) { v8.getLocker().checkThread(); checkReleased(); references.remove(object); }
@Test public void testPersistNonManagedObject() { V8Object object = new V8Object(v8); MemoryManager memoryManager = new MemoryManager(v8); memoryManager.persist(object); memoryManager.release(); assertFalse(object.isReleased()); object.close(); }
private V8Engine v8(String id, String scope) { return cache.computeIfAbsent(Thread.currentThread().getName() + ":" + id, name -> { V8 v8 = V8.createV8Runtime(scope); MemoryManager mem = new MemoryManager(v8); console(v8, id); assets(getClass(), v8); b64(v8); return new V8Engine(v8, mem, id); }); }
@SuppressWarnings("resource") @Test public void testMemoryManagerReleasesObjects() { MemoryManager memoryManager = new MemoryManager(v8); new V8Object(v8); memoryManager.release(); assertEquals(0, v8.getObjectReferenceCount()); }