Co-Authored-By: Claude Sonnet 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01KqJyCidz3ZgRyHABv2GVJh
55 lines
2.3 KiB
Plaintext
55 lines
2.3 KiB
Plaintext
final void signalEvent(WatchEvent.Kind<?> kind, Object context) {
|
|
boolean isModify = (kind == StandardWatchEventKinds.ENTRY_MODIFY);
|
|
synchronized (this) {
|
|
int size = events.size();
|
|
if (size > 0) {
|
|
// if the previous event is an OVERFLOW event or this is a
|
|
// repeated event then we simply increment the counter
|
|
WatchEvent<?> prev = events.get(size-1);
|
|
if ((prev.kind() == StandardWatchEventKinds.OVERFLOW) ||
|
|
((kind == prev.kind() &&
|
|
Objects.equals(context, prev.context()))))
|
|
{
|
|
((Event<?>)prev).increment();
|
|
return;
|
|
}
|
|
|
|
// if this is a modify event and the last entry for the context
|
|
// is a modify event then we simply increment the count
|
|
if (!lastModifyEvents.isEmpty()) {
|
|
if (isModify) {
|
|
WatchEvent<?> ev = lastModifyEvents.get(context);
|
|
if (ev != null) {
|
|
assert ev.kind() == StandardWatchEventKinds.ENTRY_MODIFY;
|
|
((Event<?>)ev).increment();
|
|
return;
|
|
}
|
|
} else {
|
|
// not a modify event so remove from the map as the
|
|
// last event will no longer be a modify event.
|
|
lastModifyEvents.remove(context);
|
|
}
|
|
}
|
|
|
|
// if the list has reached the limit then drop pending events
|
|
// and queue an OVERFLOW event
|
|
if (size >= MAX_EVENT_LIST_SIZE) {
|
|
kind = StandardWatchEventKinds.OVERFLOW;
|
|
isModify = false;
|
|
context = null;
|
|
}
|
|
}
|
|
|
|
// non-repeated event
|
|
Event<Object> ev =
|
|
new Event<>((WatchEvent.Kind<Object>)kind, context);
|
|
if (isModify) {
|
|
lastModifyEvents.put(context, ev);
|
|
} else if (kind == StandardWatchEventKinds.OVERFLOW) {
|
|
// drop all pending events
|
|
events.clear();
|
|
lastModifyEvents.clear();
|
|
}
|
|
events.add(ev);
|
|
signal();
|