From bd6476059b158e69f26af5348d4c092f90e721fb Mon Sep 17 00:00:00 2001 From: Robinson Date: Tue, 12 Dec 2023 13:31:07 +0100 Subject: [PATCH] ConnectionCounts are now threadsafe --- .../network/handshake/ConnectionCounts.kt | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/dorkbox/network/handshake/ConnectionCounts.kt b/src/dorkbox/network/handshake/ConnectionCounts.kt index 2f15a66c..1270c571 100644 --- a/src/dorkbox/network/handshake/ConnectionCounts.kt +++ b/src/dorkbox/network/handshake/ConnectionCounts.kt @@ -1,3 +1,19 @@ +/* + * Copyright 2023 dorkbox, llc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package dorkbox.network.handshake import org.agrona.collections.Object2IntHashMap @@ -9,18 +25,22 @@ import java.net.InetAddress internal class ConnectionCounts { private val connectionsPerIpCounts = Object2IntHashMap(-1) + @Synchronized fun get(inetAddress: InetAddress): Int { return connectionsPerIpCounts.getOrPut(inetAddress) { 0 } } + @Synchronized fun increment(inetAddress: InetAddress, currentCount: Int) { connectionsPerIpCounts[inetAddress] = currentCount + 1 } + @Synchronized fun decrement(inetAddress: InetAddress, currentCount: Int) { connectionsPerIpCounts[inetAddress] = currentCount - 1 } + @Synchronized fun decrementSlow(inetAddress: InetAddress) { if (connectionsPerIpCounts.containsKey(inetAddress)) { val defaultVal = connectionsPerIpCounts.getValue(inetAddress) @@ -28,10 +48,12 @@ internal class ConnectionCounts { } } + @Synchronized fun isEmpty(): Boolean { return connectionsPerIpCounts.isEmpty() } + @Synchronized override fun toString(): String { return connectionsPerIpCounts.entries.map { it.key }.joinToString() }