diff options
author | kwm <kwm@df743ca5-7f9a-e211-a948-0013205c9059> | 2011-09-17 17:24:15 +0800 |
---|---|---|
committer | kwm <kwm@df743ca5-7f9a-e211-a948-0013205c9059> | 2011-09-17 17:24:15 +0800 |
commit | 6bc09622bc031d90d33d2a1206581815cf77ccc6 (patch) | |
tree | 59cf022af9c952ce406acd1728cc37acf7700ca3 /devel/gamin/files/patch-server_gam_kqueue.c | |
parent | 2b18eed63f6b5f551538eac07e2b524aee8236e6 (diff) | |
download | marcuscom-ports-6bc09622bc031d90d33d2a1206581815cf77ccc6.tar marcuscom-ports-6bc09622bc031d90d33d2a1206581815cf77ccc6.tar.gz marcuscom-ports-6bc09622bc031d90d33d2a1206581815cf77ccc6.tar.bz2 marcuscom-ports-6bc09622bc031d90d33d2a1206581815cf77ccc6.tar.lz marcuscom-ports-6bc09622bc031d90d33d2a1206581815cf77ccc6.tar.xz marcuscom-ports-6bc09622bc031d90d33d2a1206581815cf77ccc6.tar.zst marcuscom-ports-6bc09622bc031d90d33d2a1206581815cf77ccc6.zip |
Fix build with new glib20. s/G_CONST_RETURN/const/
git-svn-id: svn://creme-brulee.marcuscom.com/ports/trunk@16204 df743ca5-7f9a-e211-a948-0013205c9059
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, 356 insertions, 0 deletions
diff --git a/devel/gamin/files/patch-server_gam_kqueue.c b/devel/gamin/files/patch-server_gam_kqueue.c new file mode 100644 index 000000000..89289c533 --- /dev/null +++ b/devel/gamin/files/patch-server_gam_kqueue.c @@ -0,0 +1,356 @@ +--- 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; + } |