diff options
Diffstat (limited to 'devel/gamin/files/patch-server_gam_kqueue.c')
-rw-r--r-- | devel/gamin/files/patch-server_gam_kqueue.c | 356 |
1 files changed, 0 insertions, 356 deletions
diff --git a/devel/gamin/files/patch-server_gam_kqueue.c b/devel/gamin/files/patch-server_gam_kqueue.c deleted file mode 100644 index 89289c533..000000000 --- a/devel/gamin/files/patch-server_gam_kqueue.c +++ /dev/null @@ -1,356 +0,0 @@ ---- server/gam_kqueue.c.orig 2007-07-04 09:50:41.000000000 -0400 -+++ server/gam_kqueue.c 2009-06-03 13:43:38.000000000 -0400 -@@ -5,7 +5,8 @@ - * - * * http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi?coll=0650&db=bks&fname=/SGI_Developer/books/IIDsktp_IG/sgi_html/ch08.html - * states that FAM does not follow monitored symbolic links: we -- * do the same (note that regarding -+ * do NOT do the same to preserve compatibility with SGI FAM (note -+ * that regarding - * http://oss.sgi.com/bugzilla/show_bug.cgi?id=405, we do what - * FAM should do: we do not call g_dir_open() if the file is a - * symbolic link). -@@ -28,10 +29,9 @@ - * - kqueue needs to be augmented with a filename-based - * monitoring facility; - * -- * - kqueue needs to be moved out the UFS code. -- * - * Copyright (C) 2005 Joe Marcus Clarke <marcus@FreeBSD.org> -- * Copyright (C) 2005 Jean-Yves Lefort <jylefort@FreeBSD.org> -+ * Copyright (C) 2005, 2006 Jean-Yves Lefort <jylefort@FreeBSD.org> -+ * Copyright (C) 2006 Alex Dupre <ale@FreeBSD.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public -@@ -53,6 +53,9 @@ - #include <fcntl.h> - #include <unistd.h> - #include <sys/param.h> -+#ifndef USE_GAMIN_POLLER -+#include <sys/mount.h> -+#endif - #include <sys/types.h> - #include <sys/sysctl.h> - #include <sys/stat.h> -@@ -62,6 +65,7 @@ - #include "gam_error.h" - #include "gam_kqueue.h" - #include "gam_event.h" -+#include "gam_excludes.h" - #include "gam_server.h" - #include "gam_poll_basic.h" - -@@ -130,7 +134,7 @@ typedef struct - HashTableRemoveFunc remove; - HashTablePostRemoveFunc post_remove; - } HashTableMethods; -- -+ - /* - * A hash table which can be modified while iterating over it. - */ -@@ -281,8 +285,8 @@ static void - gam_kqueue_mini_lstat (const char *pathname, MiniStat *mini_sb) - { - struct stat sb; -- -- if (lstat(pathname, &sb) < 0) -+ -+ if (stat(pathname, &sb) < 0) - memset(mini_sb, 0, sizeof(*mini_sb)); - else - { -@@ -319,14 +323,14 @@ gam_kqueue_isdir (const char *pathname, - else - { - struct stat sb; -- return lstat(pathname, &sb) >= 0 && (sb.st_mode & S_IFDIR) != 0; -+ return stat(pathname, &sb) >= 0 && (sb.st_mode & S_IFDIR) != 0; - } - } - - static gboolean - gam_kqueue_get_uint_sysctl (const char *name, unsigned int *value) - { -- unsigned int value_len = sizeof(*value); -+ size_t value_len = sizeof(*value); - - if (sysctlbyname(name, value, &value_len, (void *)NULL, 0) < 0) - { -@@ -406,7 +410,7 @@ gam_kqueue_hash_table_foreach (HashTable - table->iterating = TRUE; - g_hash_table_foreach(table->main, func, user_data); - table->iterating = FALSE; -- -+ - if (table->pending_additions) - { - GSList *l; -@@ -509,33 +513,52 @@ static gboolean - gam_kqueue_monitor_enable_kqueue (Monitor *mon) - { - struct kevent ev[1]; -+#ifndef USE_GAMIN_POLLER -+ struct statfs sb; -+#endif - - if (open_files == max_open_files) - { - GAM_DEBUG(DEBUG_INFO, "cannot open %s (max_open_files limit reached), falling back to poll\n", mon->pathname); - return FALSE; - } -- -- mon->fd = open(mon->pathname, O_RDONLY | O_NOFOLLOW); -+ -+ if (gam_exclude_check(mon->pathname)) -+ { -+ GAM_DEBUG(DEBUG_INFO, "not using kqueue for %s since it is excluded, falling back to poll\n", mon->pathname); -+ return FALSE; -+ } -+ -+ mon->fd = open(mon->pathname, O_RDONLY | O_NONBLOCK | O_NOFOLLOW); - if (mon->fd < 0) - { - GAM_DEBUG(DEBUG_INFO, "cannot open %s (%s), falling back to poll\n", mon->pathname, g_strerror(errno)); - return FALSE; - } - -+#ifndef USE_GAMIN_POLLER -+ if (fstatfs(mon->fd, &sb) == 0 && (sb.f_flags & MNT_LOCAL) == 0) -+ { -+ GAM_DEBUG(DEBUG_INFO, "%s resides on a remote file system, falling back to poll\n", mon->pathname); -+ goto poll; -+ } -+#endif -+ - EV_SET(ev, mon->fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR, VN_NOTE_ALL, 0, mon); - if (kevent(kq, ev, G_N_ELEMENTS(ev), NULL, 0, NULL) < 0) - { - GAM_DEBUG(DEBUG_INFO, "cannot enable kqueue notification for %s (%s), falling back to poll\n", mon->pathname, g_strerror(errno)); -- -- close(mon->fd); -- mon->fd = -1; -- -- return FALSE; -+ goto poll; - } - - open_files++; - return TRUE; -+ -+ poll: -+ close(mon->fd); -+ mon->fd = -1; -+ -+ return FALSE; - } - - static void -@@ -612,7 +635,7 @@ gam_kqueue_sub_monitor_free (SubMonitor - gam_kqueue_poller_remove_sub_monitor(&missing_smon_poller, smon); - gam_kqueue_poller_remove_sub_monitor(&unsupported_smon_poller, smon); - /* unsupported_dirs_poller is handled by _clear_fmons() below */ -- -+ - gam_kqueue_sub_monitor_clear_fmons(smon); - gam_kqueue_monitor_free(MONITOR(smon)); - } -@@ -700,7 +723,7 @@ gam_kqueue_sub_monitor_enable_notificati - { - struct stat sb; - -- exists = lstat(mon->pathname, &sb) >= 0; -+ exists = stat(mon->pathname, &sb) >= 0; - flags |= (exists && (sb.st_mode & S_IFDIR) != 0) ? MONITOR_ISDIR : MONITOR_ISNOTDIR; - } - -@@ -715,21 +738,21 @@ gam_kqueue_sub_monitor_enable_notificati - { - GDir *dir; - GError *err = NULL; -- -+ - dir = g_dir_open(mon->pathname, 0, &err); - if (dir) - { - const char *filename; -- -+ - while ((filename = g_dir_read_name(dir))) - { - FileMonitor *fmon; - FileMonitorFlags fmon_flags; -- -+ - fmon = gam_kqueue_file_monitor_new(smon, filename, &fmon_flags); - gam_kqueue_file_monitor_emit_event(fmon, gevent, fmon_flags); - } -- -+ - g_dir_close(dir); - } - else -@@ -749,7 +772,7 @@ gam_kqueue_sub_monitor_enable_notificati - - return; - } -- -+ - /* then we enable kqueue notification, falling back to poll if necessary */ - - if (! gam_kqueue_monitor_enable_kqueue(mon)) -@@ -774,7 +797,7 @@ gam_kqueue_sub_monitor_handle_directory_ - - filenames = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); - -- if (isdir) /* do not follow symbolic links */ -+ if (isdir) - { - GDir *dir; - GError *err = NULL; -@@ -783,7 +806,7 @@ gam_kqueue_sub_monitor_handle_directory_ - if (dir) - { - const char *filename; -- -+ - while ((filename = g_dir_read_name(dir))) - { - g_hash_table_insert(filenames, g_strdup(filename), GINT_TO_POINTER(TRUE)); -@@ -793,12 +816,12 @@ gam_kqueue_sub_monitor_handle_directory_ - { - FileMonitor *fmon; - FileMonitorFlags fmon_flags; -- -+ - fmon = gam_kqueue_file_monitor_new(smon, filename, &fmon_flags); - gam_kqueue_file_monitor_emit_event(fmon, GAMIN_EVENT_CREATED, fmon_flags); - } - } -- -+ - g_dir_close(dir); - } - else -@@ -840,6 +863,8 @@ gam_kqueue_sub_monitor_emit_event (SubMo - case GAMIN_EVENT_MOVED: - gam_kqueue_sub_monitor_set_missing(smon); - break; -+ default: -+ break; - } - - gam_server_emit_event(mon->pathname, isdir, event, smon->subs, 1); -@@ -931,11 +956,11 @@ gam_kqueue_file_monitor_emit_event (File - gboolean isdir; - gboolean stat_done; - gboolean stat_succeeded; -- -+ - if ((flags & MONITOR_ISDIR) == 0 && (flags & MONITOR_ISNOTDIR) == 0) - { - stat_done = TRUE; -- stat_succeeded = lstat(mon->pathname, &sb) >= 0; -+ stat_succeeded = stat(mon->pathname, &sb) >= 0; - isdir = stat_succeeded && (sb.st_mode & S_IFDIR) != 0; - } - else -@@ -943,7 +968,7 @@ gam_kqueue_file_monitor_emit_event (File - stat_done = FALSE; - isdir = (flags & MONITOR_ISDIR) != 0; - } -- -+ - gam_server_emit_event(mon->pathname, isdir, event, fmon->smon->subs, 1); - - switch (event) -@@ -962,7 +987,7 @@ gam_kqueue_file_monitor_emit_event (File - { - FileMonitor *new_fmon; - FileMonitorFlags new_fmon_flags; -- -+ - /* - * The file exists again. It means that kqueue has - * aggregated a removal+creation into a single event. We -@@ -978,9 +1003,11 @@ gam_kqueue_file_monitor_emit_event (File - break; /* do not remove the fmon we've just created */ - } - } -- -+ - gam_kqueue_hash_table_remove(fmon->smon->fmons, fmon); - break; -+ default: -+ break; - } - } - -@@ -1033,7 +1060,7 @@ gam_kqueue_kevent_cb (GIOChannel *source - - for (i = 0; i < nevents; i++) - MONITOR(ev[i].udata)->handle_kevent(MONITOR(ev[i].udata), &ev[i]); -- -+ - return TRUE; /* keep source */ - } - -@@ -1042,7 +1069,7 @@ gam_kqueue_missing_smon_poll (SubMonitor - { - struct stat sb; - -- if (lstat(MONITOR(smon)->pathname, &sb) >= 0) -+ if (stat(MONITOR(smon)->pathname, &sb) >= 0) - { - gam_kqueue_poller_remove_sub_monitor(&missing_smon_poller, smon); - gam_kqueue_sub_monitor_enable_notification(smon, SUB_MONITOR_WAS_MISSING | ((sb.st_mode & S_IFDIR) != 0 ? MONITOR_ISDIR : MONITOR_ISNOTDIR)); -@@ -1062,16 +1089,16 @@ gam_kqueue_unsupported_smon_poll (SubMon - if (gam_kqueue_monitor_enable_kqueue(mon)) - gam_kqueue_poller_remove_sub_monitor(&missing_smon_poller, smon); - } -- -+ - gam_kqueue_mini_lstat(mon->pathname, &sb); -- -+ - if (! sb.exists && mon->sb.exists) - event = GAMIN_EVENT_DELETED; - else if (gam_kqueue_differs(&sb, &mon->sb)) - event = GAMIN_EVENT_CHANGED; - else - return; -- -+ - memcpy(&mon->sb, &sb, sizeof(sb)); - gam_kqueue_sub_monitor_emit_event(smon, event, (sb.mode & S_IFDIR) != 0 ? MONITOR_ISDIR : MONITOR_ISNOTDIR); - } -@@ -1167,7 +1194,10 @@ gam_kqueue_init (void) - channel = g_io_channel_unix_new(kq); - g_io_add_watch(channel, G_IO_IN, gam_kqueue_kevent_cb, NULL); - -- -+#ifdef USE_GAMIN_POLLER -+ gam_poll_basic_init (); -+#endif -+ - gam_server_install_kernel_hooks(GAMIN_K_KQUEUE, - gam_kqueue_add_subscription, - gam_kqueue_remove_subscription, -@@ -1200,7 +1230,7 @@ gam_kqueue_add_subscription (GamSubscrip - smon->subs = g_list_append(smon->subs, sub); - return TRUE; - } -- -+ - smon = gam_kqueue_sub_monitor_new(sub); - smon->subs = g_list_append(smon->subs, sub); - -@@ -1260,6 +1290,6 @@ gam_kqueue_remove_all_for (GamListener * - success = FALSE; - - g_list_free(subs); -- -+ - return success; - } |