checkWritable();
performAndWritePutAll(m);
}
private void performAndWritePutAll(@NotNull Map<? extends K, ? extends V> m) {
Excerpt excerpt = getExcerpt(m.size() * maxMessageSize, putAll);
long eventId = excerpt.index();
int pos = excerpt.position();
excerpt.writeInt(0); // place holder for the actual size.
int count = 0;
for (int i = 0; i < listeners.size(); i++) {
MapListener<K, V> listener = listeners.get(i);
listener.eventStart(eventId, name);
}
for (Entry<? extends K, ? extends V> entry : m.entrySet()) {
K key = entry.getKey();
V value = entry.getValue();
V previous = underlying.put(key, value);
if (sameOrNotEqual(previous, value)) {
writeKey(excerpt, key);
writeValue(excerpt, value);
for (int i = 0; i < listeners.size(); i++) {
MapListener<K, V> listener = listeners.get(i);
if (previous == null)
listener.add(key, value);
else
listener.update(key, previous, value);
}
count++;
}
for (int i = 0; i < listeners.size(); i++) {
MapListener<K, V> listener = listeners.get(i);
listener.eventEnd(true);
}
}
excerpt.writeInt(pos, count);
excerpt.finish();
}