@Test public void testMergingConcurrency() throws TimeoutException { rootQuad = new ConcurrentPointQuadTree<CollisionPoint>(CONCURRENCY_TEST_WATERMARK * 2, CONCURRENCY_TEST_WATERMARK, 0, 0, TREE_WIDTH, TREE_HEIGHT); for (int i = 0; i < MathUtils.round(TREE_WIDTH); i++) { createNextCollision(); } int totalThreads = Runtime.getRuntime().availableProcessors(); if (totalThreads % 2 == 1) { totalThreads++; } for (int i = 0; i < totalThreads; i++) { new Thread(this).start(); } waiter.await(CONCURRENCY_TEST_TIMEOUT); System.out.println(rootQuad.getTotalMergeOperations() + " total merge operations, " + collisionsFound.getAndIncrement() + " collisions found concurrently"); Assert.assertEquals(true, rootQuad.getTotalMergeOperations() > 0); Assert.assertEquals(true, collisionsFound.get() > 0); Assert.assertEquals(false, concurrencyExceptionOccurred.get()); }
public int getTotalMergeOperations() { lock.lockRead(); int result = totalMerges; if(topLeft != null) { result += topLeft.getTotalMergeOperations(); result += topRight.getTotalMergeOperations(); result += bottomLeft.getTotalMergeOperations(); result += bottomRight.getTotalMergeOperations(); } lock.unlockRead(); return result; }
ConcurrentPointQuadTree extends Rectangle implements QuadTree<T> { public int getTotalMergeOperations() { lock.lockRead(); int result = totalMerges; if(topLeft != null) { result += topLeft.getTotalMergeOperations(); result += topRight.getTotalMergeOperations(); result += bottomLeft.getTotalMergeOperations(); result += bottomRight.getTotalMergeOperations(); } lock.unlockRead(); return result; } }
ConcurrentPointQuadTree extends Rectangle implements QuadTree<T> { public int getTotalMergeOperations() { lock.lockRead(); int result = totalMerges; if(topLeft != null) { result += topLeft.getTotalMergeOperations(); result += topRight.getTotalMergeOperations(); result += bottomLeft.getTotalMergeOperations(); result += bottomRight.getTotalMergeOperations(); } lock.unlockRead(); return result; } ConcurrentPointQuadTree(int elementLimitPerQuad, float x, float y, float width, float height);  ConcurrentPointQuadTree(ConcurrentPointQuadTree<T> parent, float x, float y, float width, float height);  ConcurrentPointQuadTree(int elementLimitPerQuad, int mergeWatermark, float x, float y, float width,
			float height);  ConcurrentPointQuadTree(float minimumQuadWidth, float minimumQuadHeight, int elementLimitPerQuad,
			int mergeWatermark, float x, float y, float width, float height); }
ConcurrentPointQuadTree extends Rectangle implements QuadTree<T> { public int getTotalMergeOperations() { lock.lockRead(); int result = totalMerges; if(topLeft != null) { result += topLeft.getTotalMergeOperations(); result += topRight.getTotalMergeOperations(); result += bottomLeft.getTotalMergeOperations(); result += bottomRight.getTotalMergeOperations(); } lock.unlockRead(); return result; } ConcurrentPointQuadTree(int elementLimitPerQuad, float x, float y, float width, float height);  ConcurrentPointQuadTree(ConcurrentPointQuadTree<T> parent, float x, float y, float width, float height);  ConcurrentPointQuadTree(int elementLimitPerQuad, int mergeWatermark, float x, float y, float width,
			float height);  ConcurrentPointQuadTree(float minimumQuadWidth, float minimumQuadHeight, int elementLimitPerQuad,
			int mergeWatermark, float x, float y, float width, float height); void debugRender(Graphics g); void addAll(Array<T> elementsToAdd); boolean add(T element); void removeAll(Array<T> elementsToRemove); @Override void clear(); boolean remove(T element); @Override Array<T> getElementsWithinArea(Shape area); @Override Array<T> getElementsWithinArea(Shape area, QuadTreeSearchDirection searchDirection); @Override void getElementsWithinArea(Array<T> result, Shape area); @Override void getElementsWithinArea(Array<T> result, Shape area, QuadTreeSearchDirection searchDirection); @Override Array<T> getElementsContainingArea(Shape area, boolean entirelyContained); @Override Array<T> getElementsContainingArea(Shape area, QuadTreeSearchDirection searchDirection, boolean entirelyContained); @Override void getElementsContainingArea(Array<T> result, Shape area, boolean entirelyContained); @Override void getElementsContainingArea(Array<T> result, Shape area, QuadTreeSearchDirection searchDirection, boolean entirelyContained); @Override Array<T> getElementsContainingPoint(Point point); @Override Array<T> getElementsContainingPoint(Point point, QuadTreeSearchDirection searchDirection); @Override void getElementsContainingPoint(Array<T> result, Point point); @Override void getElementsContainingPoint(Array<T> result, Point point, QuadTreeSearchDirection searchDirection); Array<T> getElementsIntersectingLineSegment(LineSegment lineSegment); @Override Array<T> getElementsIntersectingLineSegment(LineSegment lineSegment, QuadTreeSearchDirection searchDirection); void getElementsIntersectingLineSegment(Array<T> result, LineSegment lineSegment); @Override void getElementsIntersectingLineSegment(Array<T> result, LineSegment lineSegment, QuadTreeSearchDirection searchDirection); Array<T> getElements(); void getElements(Array<T> result); int getTotalQuads(); int getTotalElements(); @Override void positionChanged(T moved); QuadTree<T> getParent(); int getTotalMergeOperations(); int getElementLimitPerQuad(); int getMergeWatermark(); @Override float getMinimumQuadWidth(); @Override float getMinimumQuadHeight(); }
ConcurrentPointQuadTree extends Rectangle implements QuadTree<T> { public int getTotalMergeOperations() { lock.lockRead(); int result = totalMerges; if(topLeft != null) { result += topLeft.getTotalMergeOperations(); result += topRight.getTotalMergeOperations(); result += bottomLeft.getTotalMergeOperations(); result += bottomRight.getTotalMergeOperations(); } lock.unlockRead(); return result; } ConcurrentPointQuadTree(int elementLimitPerQuad, float x, float y, float width, float height);  ConcurrentPointQuadTree(ConcurrentPointQuadTree<T> parent, float x, float y, float width, float height);  ConcurrentPointQuadTree(int elementLimitPerQuad, int mergeWatermark, float x, float y, float width,
			float height);  ConcurrentPointQuadTree(float minimumQuadWidth, float minimumQuadHeight, int elementLimitPerQuad,
			int mergeWatermark, float x, float y, float width, float height); void debugRender(Graphics g); void addAll(Array<T> elementsToAdd); boolean add(T element); void removeAll(Array<T> elementsToRemove); @Override void clear(); boolean remove(T element); @Override Array<T> getElementsWithinArea(Shape area); @Override Array<T> getElementsWithinArea(Shape area, QuadTreeSearchDirection searchDirection); @Override void getElementsWithinArea(Array<T> result, Shape area); @Override void getElementsWithinArea(Array<T> result, Shape area, QuadTreeSearchDirection searchDirection); @Override Array<T> getElementsContainingArea(Shape area, boolean entirelyContained); @Override Array<T> getElementsContainingArea(Shape area, QuadTreeSearchDirection searchDirection, boolean entirelyContained); @Override void getElementsContainingArea(Array<T> result, Shape area, boolean entirelyContained); @Override void getElementsContainingArea(Array<T> result, Shape area, QuadTreeSearchDirection searchDirection, boolean entirelyContained); @Override Array<T> getElementsContainingPoint(Point point); @Override Array<T> getElementsContainingPoint(Point point, QuadTreeSearchDirection searchDirection); @Override void getElementsContainingPoint(Array<T> result, Point point); @Override void getElementsContainingPoint(Array<T> result, Point point, QuadTreeSearchDirection searchDirection); Array<T> getElementsIntersectingLineSegment(LineSegment lineSegment); @Override Array<T> getElementsIntersectingLineSegment(LineSegment lineSegment, QuadTreeSearchDirection searchDirection); void getElementsIntersectingLineSegment(Array<T> result, LineSegment lineSegment); @Override void getElementsIntersectingLineSegment(Array<T> result, LineSegment lineSegment, QuadTreeSearchDirection searchDirection); Array<T> getElements(); void getElements(Array<T> result); int getTotalQuads(); int getTotalElements(); @Override void positionChanged(T moved); QuadTree<T> getParent(); int getTotalMergeOperations(); int getElementLimitPerQuad(); int getMergeWatermark(); @Override float getMinimumQuadWidth(); @Override float getMinimumQuadHeight(); static Color QUAD_COLOR; static Color ELEMENT_COLOR; }