From 02fd36eae133ad2988e1679f0ecda1f549ad0d14 Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Fri, 9 Feb 2018 14:20:08 -0600 Subject: Bug 530967 - Delay in MRUBundleFileList causes performance issues Change-Id: If456680c149081e41c8065e6b02154ec531a10dc Signed-off-by: Thomas Watson --- .../eclipse/osgi/storage/bundlefile/MRUBundleFileList.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/bundlefile/MRUBundleFileList.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/bundlefile/MRUBundleFileList.java index e105c0d75..d36fefbf4 100644 --- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/bundlefile/MRUBundleFileList.java +++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/bundlefile/MRUBundleFileList.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2005, 2017 IBM Corporation and others. + * Copyright (c) 2005, 2018 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -15,7 +15,9 @@ import java.io.IOException; import java.util.Collections; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; -import org.eclipse.osgi.framework.eventmgr.*; +import org.eclipse.osgi.framework.eventmgr.EventDispatcher; +import org.eclipse.osgi.framework.eventmgr.EventManager; +import org.eclipse.osgi.framework.eventmgr.ListenerQueue; /** * A simple/quick/small implementation of an MRU (Most Recently Used) list to keep @@ -33,6 +35,7 @@ public class MRUBundleFileList implements EventDispatcher bundleFileCloser; // the current number of open bundle files @@ -47,6 +50,9 @@ public class MRUBundleFileList implements EventDispatcher MIN this.fileLimit = fileLimit; + // If the filelimit is > 5000 then use it as the delayLimit also; + // Otherwise use the max between fileLimit * 2 and 500 + this.delayLimit = Math.max(fileLimit > 5000 ? fileLimit : fileLimit * 2, 500); if (fileLimit >= MIN) { this.bundleFileList = new BundleFile[fileLimit]; this.useStampList = new long[fileLimit]; @@ -184,7 +190,7 @@ public class MRUBundleFileList implements EventDispatcher fileLimit) { + if (pendingNum > delayLimit) { // delay to allow the closer to catchup try { Thread.sleep(Math.min(500, pendingNum)); -- cgit v1.2.1