You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2018/10/25 15:18:46 UTC

[incubator-plc4x] branch master updated: [plc4j-pool] fixed lock mixup

This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git


The following commit(s) were added to refs/heads/master by this push:
     new 71206e0  [plc4j-pool] fixed lock mixup
71206e0 is described below

commit 71206e0f4b5bbb9e3f9aee1fd097ce0d5c44e9e9
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Oct 25 17:16:51 2018 +0200

    [plc4j-pool] fixed lock mixup
---
 .../connectionpool/PooledPlcDriverManager.java     | 32 +++++++++++++---------
 1 file changed, 19 insertions(+), 13 deletions(-)

diff --git a/plc4j/utils/connection-pool/src/main/java/org/apache/plc4x/java/utils/connectionpool/PooledPlcDriverManager.java b/plc4j/utils/connection-pool/src/main/java/org/apache/plc4x/java/utils/connectionpool/PooledPlcDriverManager.java
index fb4db02..13c7ce6 100644
--- a/plc4j/utils/connection-pool/src/main/java/org/apache/plc4x/java/utils/connectionpool/PooledPlcDriverManager.java
+++ b/plc4j/utils/connection-pool/src/main/java/org/apache/plc4x/java/utils/connectionpool/PooledPlcDriverManager.java
@@ -100,7 +100,7 @@ public class PooledPlcDriverManager extends PlcDriverManager {
         PlcAuthentication plcAuthentication = argPair.getRight();
         ObjectPool<PlcConnection> pool = poolMap.get(argPair);
         if (pool == null) {
-            Lock lock = readWriteLock.readLock();
+            Lock lock = readWriteLock.writeLock();
             lock.lock();
             try {
                 poolMap.computeIfAbsent(argPair, pair -> poolCreator.createPool(new PooledPlcConnectionFactory() {
@@ -150,19 +150,25 @@ public class PooledPlcDriverManager extends PlcDriverManager {
 
     // TODO: maybe export to jmx
     public Map<String, Number> getStatistics() {
-        HashMap<String, Number> statistics = new HashMap<>();
-        for (Map.Entry<Pair<String, PlcAuthentication>, ObjectPool<PlcConnection>> poolEntry : poolMap.entrySet()) {
-            Pair<String, PlcAuthentication> pair = poolEntry.getKey();
-            ObjectPool<PlcConnection> objectPool = poolEntry.getValue();
-            String url = pair.getLeft();
-            PlcAuthentication plcAuthentication = pair.getRight();
-
-            String authSuffix = plcAuthentication != noPlcAuthentication ? "/" + plcAuthentication : "";
-            statistics.put(url + authSuffix + ".numActive", objectPool.getNumActive());
-            statistics.put(url + authSuffix + ".numIdle", objectPool.getNumIdle());
-        }
+        Lock lock = readWriteLock.readLock();
+        try {
+            lock.lock();
+            HashMap<String, Number> statistics = new HashMap<>();
+            for (Map.Entry<Pair<String, PlcAuthentication>, ObjectPool<PlcConnection>> poolEntry : poolMap.entrySet()) {
+                Pair<String, PlcAuthentication> pair = poolEntry.getKey();
+                ObjectPool<PlcConnection> objectPool = poolEntry.getValue();
+                String url = pair.getLeft();
+                PlcAuthentication plcAuthentication = pair.getRight();
+
+                String authSuffix = plcAuthentication != noPlcAuthentication ? "/" + plcAuthentication : "";
+                statistics.put(url + authSuffix + ".numActive", objectPool.getNumActive());
+                statistics.put(url + authSuffix + ".numIdle", objectPool.getNumIdle());
+            }
 
-        return statistics;
+            return statistics;
+        } finally {
+            lock.unlock();
+        }
     }
 
     private static final class NoPlcAuthentication implements PlcAuthentication {