+(defun file-notify--rm-descriptor (descriptor)
+ "Remove DESCRIPTOR from `file-notify-descriptors'.
+DESCRIPTOR should be an object returned by `file-notify-add-watch'.
+If it is registered in `file-notify-descriptors', a stopped event is sent."
+ (let* ((desc (if (consp descriptor) (car descriptor) descriptor))
+ (registered (gethash desc file-notify-descriptors))
+ (file (if (consp descriptor) (cdr descriptor) (cl-caadr registered)))
+ (dir (car registered)))
+
+ (when (consp registered)
+ ;; Send `stopped' event.
+ (funcall
+ (cdr (assoc file (cdr registered)))
+ `(,descriptor stopped ,(if file (expand-file-name file dir) dir)))
+
+ ;; Modify `file-notify-descriptors'.
+ (if (not file)
+ (remhash desc file-notify-descriptors)
+ (setcdr registered
+ (delete (assoc file (cdr registered)) (cdr registered)))
+ (if (null (cdr registered))
+ (remhash desc file-notify-descriptors)
+ (puthash desc registered file-notify-descriptors))))))
+
+;; This function is used by `inotify', `kqueue', `gfilenotify' and
+;; `w32notify' events.