glib/gio/inotify/inotify-kernel.h
Ryan Lortie c5d5e2916b inotify: implement "boredom" algorithm
Use the "interesting" value from g_file_monitor_source_handle_event() to
decide if we're currently being flooded by a stream of boring events.

The main case here is when one or more files is being written to and the
change events are all being rate-limited in the GFileMonitor frontends.

In that case, we become "bored" with the event stream and add a backoff
timeout.  In the case that it is exactly one large file being written
(which is the common case) then leaving the event in the queue also lets
the kernel perform merging on it, so when we wake up, we will only see
the one event.  Even in the case that the kernel is unable to perform
merging, the context switch overhead will be vastly reduced.

In testing, this cuts down on the number of wake ups during a large file
copy, by a couple orders of magnitude (ie: less than 1% of the number of
wake ups).
2015-03-20 12:01:35 -04:00

64 lines
2.0 KiB
C

/*
Copyright (C) 2005 John McCutchan
The Gnome Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The Gnome Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the Gnome Library; see the file COPYING.LIB. If not,
see <http://www.gnu.org/licenses/>.
Authors:.
John McCutchan <john@johnmccutchan.com>
*/
#ifndef __INOTIFY_KERNEL_H
#define __INOTIFY_KERNEL_H
typedef struct ik_event_s {
gint32 wd;
guint32 mask;
guint32 original_mask;
guint32 cookie;
guint32 len;
char * name;
/* TRUE if this event is the last element of a pair
* (e.g., MOVE_TO in a pair of MOVE_FROM, MOVE_TO events) */
gboolean is_second_in_pair;
/* if event1 and event2 are two paired events
* (e.g., MOVE_FROM and MOVE_TO events related to the same file move),
* then event1->pair == event2 and event2->pair == NULL.
* It will result also in event1->pair->is_second_in_pair == TRUE */
struct ik_event_s *pair;
gint64 timestamp; /* monotonic time that this was created */
} ik_event_t;
gboolean _ik_startup (gboolean (*cb) (ik_event_t *event));
ik_event_t *_ik_event_new_dummy (const char *name,
gint32 wd,
guint32 mask);
void _ik_event_free (ik_event_t *event);
gint32 _ik_watch (const char *path,
guint32 mask,
int *err);
int _ik_ignore (const char *path,
gint32 wd);
/* The miss count will probably be enflated */
void _ik_move_stats (guint32 *matches,
guint32 *misses);
const char *_ik_mask_to_string (guint32 mask);
#endif