Field synchronizer technical improvements
This commit is contained in:
parent
04c9d8ddfe
commit
f586f12b90
@ -242,7 +242,8 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa
|
||||
)
|
||||
}
|
||||
|
||||
private val endpoints = ArrayList<WeakReference<Endpoint>>()
|
||||
private var endpointsMaxCapacity = 1
|
||||
private val endpoints = ArrayList<WeakReference<Endpoint>>(1)
|
||||
val defaultEndpoint = Endpoint()
|
||||
|
||||
private var lastEndpointsCleanup = System.nanoTime()
|
||||
@ -270,17 +271,23 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa
|
||||
execute.invoke(endpoint)
|
||||
}
|
||||
}
|
||||
|
||||
if (endpoints.size < endpointsMaxCapacity / 2) {
|
||||
endpoints.trimToSize()
|
||||
endpointsMaxCapacity = endpoints.size
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inner class Endpoint {
|
||||
init {
|
||||
synchronized(endpoints) {
|
||||
endpoints.add(WeakReference(this))
|
||||
endpointsMaxCapacity = endpointsMaxCapacity.coerceAtLeast(endpoints.size)
|
||||
|
||||
if (System.nanoTime() - lastEndpointsCleanup >= 60_000_000_000) {
|
||||
lastEndpointsCleanup = System.nanoTime()
|
||||
|
||||
synchronized(endpoints) {
|
||||
val iterator = endpoints.listIterator()
|
||||
|
||||
for (value in iterator) {
|
||||
@ -288,6 +295,11 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa
|
||||
iterator.remove()
|
||||
}
|
||||
}
|
||||
|
||||
if (endpoints.size < endpointsMaxCapacity / 2) {
|
||||
endpoints.trimToSize()
|
||||
endpointsMaxCapacity = endpoints.size
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -515,6 +527,7 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa
|
||||
if (!isDirty && !codec.compare(remote, value)) {
|
||||
notifyEndpoints(this)
|
||||
isDirty = true
|
||||
remote = codec.copy(value)
|
||||
}
|
||||
}
|
||||
|
||||
@ -534,7 +547,6 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa
|
||||
val value = value
|
||||
codec.write(stream, value)
|
||||
isDirty = false
|
||||
remote = codec.copy(value)
|
||||
}
|
||||
|
||||
override fun read(stream: DataInputStream) {
|
||||
|
Loading…
Reference in New Issue
Block a user