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 ev = new Event<>((WatchEvent.Kind)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();