FindBugs: Use a special lock object for requestWindow because in 
#resizeBuffer() requestWindow needs to be re-assigned and locking on its old 
instance is wrong.


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/0b6a46f7
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/0b6a46f7
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/0b6a46f7

Branch: refs/heads/master
Commit: 0b6a46f7777a2058e5d1769a9fe356c088e1638d
Parents: a0ef6af
Author: Martin Tzvetanov Grigorov <[email protected]>
Authored: Sat Jun 20 17:03:22 2015 +0300
Committer: Martin Tzvetanov Grigorov <[email protected]>
Committed: Sat Jun 20 17:03:22 2015 +0300

----------------------------------------------------------------------
 .../protocol/http/AbstractRequestLogger.java    | 32 +++++++++++---------
 1 file changed, 18 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/0b6a46f7/wicket-core/src/main/java/org/apache/wicket/protocol/http/AbstractRequestLogger.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/protocol/http/AbstractRequestLogger.java
 
b/wicket-core/src/main/java/org/apache/wicket/protocol/http/AbstractRequestLogger.java
index ce83ab3..0c5d7d0 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/protocol/http/AbstractRequestLogger.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/protocol/http/AbstractRequestLogger.java
@@ -85,6 +85,13 @@ public abstract class AbstractRequestLogger implements 
IRequestLogger
        private RequestData[] requestWindow;
 
        /**
+        * A special object used as a lock before accessing {@linkplain 
#requestWindow}.
+        * Needed because {@linkplain #requestWindow} is being reassigned in 
some cases,
+        * e.g. {@link #resizeBuffer()}
+        */
+       private final Object requestWindowLock = new Object();
+
+       /**
         * Cursor pointing to the current writable location in the buffer. 
Points to the first empty
         * slot or if the buffer has been filled completely to the oldest 
request in the buffer.
         */
@@ -109,7 +116,7 @@ public abstract class AbstractRequestLogger implements 
IRequestLogger
        {
                int requestsWindowSize = getRequestsWindowSize();
                requestWindow = new RequestData[requestsWindowSize];
-               liveSessions = new ConcurrentHashMap<String, SessionData>();
+               liveSessions = new ConcurrentHashMap<>();
        }
 
        @Override
@@ -142,7 +149,7 @@ public abstract class AbstractRequestLogger implements 
IRequestLogger
        @Override
        public List<RequestData> getRequests()
        {
-               synchronized (requestWindow)
+               synchronized (requestWindowLock)
                {
                        RequestData[] result = new 
RequestData[hasBufferRolledOver() ? requestWindow.length
                                : indexInWindow];
@@ -242,7 +249,7 @@ public abstract class AbstractRequestLogger implements 
IRequestLogger
 
                        addRequest(requestdata);
 
-                       SessionData sessiondata = null;
+                       SessionData sessiondata;
                        if (sessionId != null)
                        {
                                sessiondata = liveSessions.get(sessionId);
@@ -335,7 +342,7 @@ public abstract class AbstractRequestLogger implements 
IRequestLogger
                // ensure the buffer has the proper installed length
                resizeBuffer();
 
-               synchronized (requestWindow)
+               synchronized (requestWindowLock)
                {
                        // if the requestWindow is a zero-length array, nothing 
gets stored
                        if (requestWindow.length == 0)
@@ -366,19 +373,16 @@ public abstract class AbstractRequestLogger implements 
IRequestLogger
 
        private int getWindowSize()
        {
-               synchronized (requestWindow)
-               {
-                       if (requestWindow[requestWindow.length - 1] == null)
-                               return indexInWindow;
-                       else
-                               return requestWindow.length;
-               }
+               if (requestWindow[requestWindow.length - 1] == null)
+                       return indexInWindow;
+               else
+                       return requestWindow.length;
        }
 
        @Override
        public long getAverageRequestTime()
        {
-               synchronized (requestWindow)
+               synchronized (requestWindowLock)
                {
                        int windowSize = getWindowSize();
                        if (windowSize == 0)
@@ -390,7 +394,7 @@ public abstract class AbstractRequestLogger implements 
IRequestLogger
        @Override
        public long getRequestsPerMinute()
        {
-               synchronized (requestWindow)
+               synchronized (requestWindowLock)
                {
                        int windowSize = getWindowSize();
                        if (windowSize == 0)
@@ -439,7 +443,7 @@ public abstract class AbstractRequestLogger implements 
IRequestLogger
                        return;
 
                RequestData[] newRequestWindow = new RequestData[newCapacity];
-               synchronized (requestWindow)
+               synchronized (requestWindowLock)
                {
                        int oldCapacity = requestWindow.length;
                        int oldNumberOfElements = hasBufferRolledOver() ? 
oldCapacity : indexInWindow;

Reply via email to