This is an automated email from the ASF dual-hosted git repository.
pauls pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/felix-dev.git
The following commit(s) were added to refs/heads/master by this push:
new 2ced71c8bf FELIX-6516 - Remove synchronization on Integer and replace
it with a dedicated StartLevelRequest object (#134)
2ced71c8bf is described below
commit 2ced71c8bf7629ffab9886c90207ef2564647291
Author: adessaigne <[email protected]>
AuthorDate: Fri May 20 00:11:28 2022 +0200
FELIX-6516 - Remove synchronization on Integer and replace it with a
dedicated StartLevelRequest object (#134)
---
.../felix/framework/FrameworkStartLevelImpl.java | 72 ++++++++++++++--------
1 file changed, 46 insertions(+), 26 deletions(-)
diff --git
a/framework/src/main/java/org/apache/felix/framework/FrameworkStartLevelImpl.java
b/framework/src/main/java/org/apache/felix/framework/FrameworkStartLevelImpl.java
index db4a611dde..53a8d7e318 100644
---
a/framework/src/main/java/org/apache/felix/framework/FrameworkStartLevelImpl.java
+++
b/framework/src/main/java/org/apache/felix/framework/FrameworkStartLevelImpl.java
@@ -34,14 +34,9 @@ class FrameworkStartLevelImpl implements
FrameworkStartLevel, Runnable
{
static final String THREAD_NAME = "FelixStartLevel";
- private static final int BUNDLE_IDX = 0;
- private static final int STARTLEVEL_IDX = 1;
-
private final Felix m_felix;
private final ServiceRegistry m_registry;
- private final List m_requests = new ArrayList();
- private final List<FrameworkListener[]> m_requestListeners
- = new ArrayList<FrameworkListener[]>();
+ private final List<StartLevelRequest> m_requests = new ArrayList<>();
private ServiceRegistration<StartLevel> m_slReg;
private Thread m_thread = null;
@@ -131,8 +126,7 @@ class FrameworkStartLevelImpl implements
FrameworkStartLevel, Runnable
throw new IllegalStateException("No inital startlevel yet");
}
// Queue request.
- m_requestListeners.add(listeners);
- m_requests.add(new Integer(startlevel));
+ m_requests.add(new StartLevelRequest(null, startlevel, listeners));
m_requests.notifyAll();
}
}
@@ -145,7 +139,7 @@ class FrameworkStartLevelImpl implements
FrameworkStartLevel, Runnable
**/
/* package */ void setStartLevelAndWait(int startlevel)
{
- Object request = new Integer(startlevel);
+ StartLevelRequest request = new StartLevelRequest(null, startlevel);
synchronized (request)
{
synchronized (m_requests)
@@ -153,7 +147,6 @@ class FrameworkStartLevelImpl implements
FrameworkStartLevel, Runnable
// Start thread if necessary.
startThread();
// Queue request.
- m_requestListeners.add(null);
m_requests.add(request);
m_requests.notifyAll();
}
@@ -241,8 +234,7 @@ class FrameworkStartLevelImpl implements
FrameworkStartLevel, Runnable
// Synchronously persists the start level.
m_bundle.setStartLevel(startlevel);
// Queue request.
- m_requestListeners.add(null);
- m_requests.add(new Object[] { m_bundle, new
Integer(startlevel) });
+ m_requests.add(new StartLevelRequest(m_bundle, startlevel));
m_requests.notifyAll();
}
}
@@ -262,11 +254,10 @@ class FrameworkStartLevelImpl implements
FrameworkStartLevel, Runnable
{
// This thread loops forever, thus it should
// be a daemon thread.
- Object previousRequest = null;
+ StartLevelRequest previousRequest = null;
while (true)
{
- Object request = null;
- FrameworkListener[] listeners = null;
+ StartLevelRequest request = null;
synchronized (m_requests)
{
// Wait for a request.
@@ -290,22 +281,20 @@ class FrameworkStartLevelImpl implements
FrameworkStartLevel, Runnable
// Get the requested start level.
request = m_requests.remove(0);
- listeners = m_requestListeners.remove(0);
}
- // If the request object is an Integer, then the request
- // is to set the framework start level. If the request is
- // an Object array, then the request is to set the start
- // level for a bundle.
+ // If the request object has no bundle, then the request
+ // is to set the framework start level, otherwise the
+ // request is to set the start level for a bundle.
// NOTE: We don't catch any exceptions here, because
// the invoked methods shield us from exceptions by
// catching Throwables when they invoke callbacks.
- if (request instanceof Integer)
+ if (request.getBundle() == null)
{
// Set the new framework start level.
try
{
- m_felix.setActiveStartLevel(((Integer)
request).intValue(), listeners);
+ m_felix.setActiveStartLevel(request.getStartLevel(),
request.getListeners());
}
catch (IllegalStateException ise)
{
@@ -333,9 +322,7 @@ class FrameworkStartLevelImpl implements
FrameworkStartLevel, Runnable
}
else
{
- Bundle bundle = (Bundle) ((Object[]) request)[BUNDLE_IDX];
- int startlevel = ((Integer) ((Object[])
request)[STARTLEVEL_IDX]).intValue();
- m_felix.setBundleStartLevel(bundle, startlevel);
+ m_felix.setBundleStartLevel(request.getBundle(),
request.getStartLevel());
}
// Notify any waiting thread that this request is done.
@@ -345,4 +332,37 @@ class FrameworkStartLevelImpl implements
FrameworkStartLevel, Runnable
}
}
}
-}
\ No newline at end of file
+
+ /**
+ * This class holds a start level request. If the bundle is null then the
+ * request is to set the framework start level.
+ */
+ private static final class StartLevelRequest
+ {
+ private final Bundle m_bundle;
+ private final int m_startLevel;
+ private final FrameworkListener[] m_listeners;
+
+ private StartLevelRequest(Bundle bundle, int startLevel,
FrameworkListener... listeners)
+ {
+ m_bundle = bundle;
+ m_startLevel = startLevel;
+ m_listeners = listeners;
+ }
+
+ private Bundle getBundle()
+ {
+ return m_bundle;
+ }
+
+ private int getStartLevel()
+ {
+ return m_startLevel;
+ }
+
+ public FrameworkListener[] getListeners()
+ {
+ return m_listeners;
+ }
+ }
+}