diff options
Diffstat (limited to 'devel/glib20/files/gkqueuefilemonitor.c')
| -rw-r--r-- | devel/glib20/files/gkqueuefilemonitor.c | 224 |
1 files changed, 0 insertions, 224 deletions
diff --git a/devel/glib20/files/gkqueuefilemonitor.c b/devel/glib20/files/gkqueuefilemonitor.c deleted file mode 100644 index 8f89b139e89e..000000000000 --- a/devel/glib20/files/gkqueuefilemonitor.c +++ /dev/null @@ -1,224 +0,0 @@ -/*- - * Copyright (c) 2016 - 2019 Rozhuk Ivan <rozhuk.im@gmail.com> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * Author: Rozhuk Ivan <rozhuk.im@gmail.com> - * - */ - -#include "config.h" - -#include <glib-object.h> -#include <string.h> -#include <gio/gfilemonitor.h> -#include <gio/glocalfilemonitor.h> -#include <gio/giomodule.h> -#include "glib-private.h" -#include <glib-unix.h> -#include "kqueue_fnm.h" - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -/* Defaults. */ -#ifndef KQUEUE_MON_RATE_LIMIT_TIME_INIT -# define KQUEUE_MON_RATE_LIMIT_TIME_INIT 1000 -#endif - -#ifndef KQUEUE_MON_RATE_LIMIT_TIME_MAX -# define KQUEUE_MON_RATE_LIMIT_TIME_MAX 4000 -#endif -#ifndef KQUEUE_MON_RATE_LIMIT_TIME_MUL -# define KQUEUE_MON_RATE_LIMIT_TIME_MUL 2 -#endif -#ifndef KQUEUE_MON_MAX_DIR_FILES -# define KQUEUE_MON_MAX_DIR_FILES 128 -#endif -#ifndef KQUEUE_MON_LOCAL_SUBFILES -# define KQUEUE_MON_LOCAL_SUBFILES 1 -#endif -#ifndef KQUEUE_MON_LOCAL_SUBDIRS -# define KQUEUE_MON_LOCAL_SUBDIRS 0 -#endif - - -static GMutex kqueue_lock; -static volatile kq_fnm_p kqueue_fnm = NULL; -/* Exclude from file changes monitoring, watch only for dirs. */ -static const char *non_local_fs[] = { - "fusefs.sshfs", - NULL -}; - -#define G_TYPE_KQUEUE_FILE_MONITOR (g_kqueue_file_monitor_get_type()) -#define G_KQUEUE_FILE_MONITOR(inst) (G_TYPE_CHECK_INSTANCE_CAST((inst), \ - G_TYPE_KQUEUE_FILE_MONITOR, GKqueueFileMonitor)) - -typedef GLocalFileMonitorClass GKqueueFileMonitorClass; - -typedef struct { - GLocalFileMonitor parent_instance; - kq_fnme_p fnme; -} GKqueueFileMonitor; - -GType g_kqueue_file_monitor_get_type(void); -G_DEFINE_TYPE_WITH_CODE (GKqueueFileMonitor, g_kqueue_file_monitor, G_TYPE_LOCAL_FILE_MONITOR, - g_io_extension_point_implement(G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME, - g_define_type_id, - "kqueue", - 10)) - - -static void -kqueue_event_handler(kq_fnm_p kfnm, - kq_fnme_p fnme, void *udata, uint32_t event, - const char *base, const char *filename, const char *new_filename) { - static const uint32_t kfnm_to_glib_map[] = { - 0, /* KF_EVENT_NOT_CHANGED */ - G_FILE_MONITOR_EVENT_CREATED, /* KF_EVENT_CREATED */ - G_FILE_MONITOR_EVENT_DELETED, /* KF_EVENT_DELETED */ - G_FILE_MONITOR_EVENT_RENAMED, /* KF_EVENT_RENAMED */ - G_FILE_MONITOR_EVENT_CHANGED /* KF_EVENT_CHANGED */ - }; - - if (NULL == kfnm || NULL == filename || 0 == filename[0] || - strchr(filename, '/') || - KF_EVENT_CREATED > event || - KF_EVENT_CHANGED < event) - return; - - g_file_monitor_source_handle_event(udata, - kfnm_to_glib_map[event], - filename, new_filename, NULL, - g_get_monotonic_time()); -} - -static gboolean -g_kqueue_file_monitor_is_supported(void) { - kq_file_mon_settings_t kfms; - - if (NULL != kqueue_fnm) - return (TRUE); - /* Init only once. */ - g_mutex_lock(&kqueue_lock); - if (NULL != kqueue_fnm) { - g_mutex_unlock(&kqueue_lock); - return (TRUE); /* Initialized while wait lock. */ - } - - memset(&kfms, 0x00, sizeof(kq_file_mon_settings_t)); - kfms.rate_limit_time_init = KQUEUE_MON_RATE_LIMIT_TIME_INIT; - kfms.rate_limit_time_max = KQUEUE_MON_RATE_LIMIT_TIME_MAX; - kfms.rate_limit_time_mul = KQUEUE_MON_RATE_LIMIT_TIME_MUL; - kfms.max_dir_files = KQUEUE_MON_MAX_DIR_FILES; - kfms.mon_local_subfiles = KQUEUE_MON_LOCAL_SUBFILES; - kfms.mon_local_subdirs = KQUEUE_MON_LOCAL_SUBDIRS; - kfms.local_fs = NULL; - kfms.non_local_fs = non_local_fs; - - kqueue_fnm = kq_fnm_create(&kfms, kqueue_event_handler); - if (NULL == kqueue_fnm) { - g_mutex_unlock(&kqueue_lock); - return (FALSE); /* Init fail. */ - } - g_mutex_unlock(&kqueue_lock); - - return (TRUE); -} - -static gboolean -g_kqueue_file_monitor_cancel(GFileMonitor *monitor) { - GKqueueFileMonitor *gffm = G_KQUEUE_FILE_MONITOR(monitor); - - kq_fnm_del(kqueue_fnm, gffm->fnme); - gffm->fnme = NULL; - - return (TRUE); -} - -static void -g_kqueue_file_monitor_finalize(GObject *object) { - //GKqueueFileMonitor *gffm = G_KQUEUE_FILE_MONITOR(object); - - //g_mutex_lock(&kqueue_lock); - //kq_fnm_free(kqueue_fnm); - //kqueue_fnm = NULL; - //g_mutex_unlock(&kqueue_lock); - //G_OBJECT_CLASS(g_kqueue_file_monitor_parent_class)->finalize(object); -} - -static void -g_kqueue_file_monitor_start(GLocalFileMonitor *local_monitor, - const gchar *dirname, const gchar *basename, - const gchar *filename, GFileMonitorSource *source) { - GKqueueFileMonitor *gffm = G_KQUEUE_FILE_MONITOR(local_monitor); - - g_assert(NULL != kqueue_fnm); - //g_source_ref((GSource*)source); - - if (NULL == filename) { - filename = dirname; - } - gffm->fnme = kq_fnm_add(kqueue_fnm, filename, source); -} - -static void -g_kqueue_file_monitor_init(GKqueueFileMonitor *monitor) { - -} - -static void -g_kqueue_file_monitor_class_init(GKqueueFileMonitorClass *class) { - GObjectClass *gobject_class = G_OBJECT_CLASS(class); - GFileMonitorClass *file_monitor_class = G_FILE_MONITOR_CLASS(class); - - class->is_supported = g_kqueue_file_monitor_is_supported; - class->start = g_kqueue_file_monitor_start; - class->mount_notify = TRUE; /* TODO: ??? */ - file_monitor_class->cancel = g_kqueue_file_monitor_cancel; - gobject_class->finalize = g_kqueue_file_monitor_finalize; -} - -static void -g_kqueue_file_monitor_class_finalize(GKqueueFileMonitorClass *class) { - -} - -void -g_io_module_load(GIOModule *module) { - - g_type_module_use(G_TYPE_MODULE(module)); - - g_io_extension_point_implement(G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME, - G_TYPE_KQUEUE_FILE_MONITOR, "kqueue", 10); - g_io_extension_point_implement(G_NFS_FILE_MONITOR_EXTENSION_POINT_NAME, - G_TYPE_KQUEUE_FILE_MONITOR, "kqueue", 10); -} - -void -g_io_module_unload(GIOModule *module) { - - g_assert_not_reached(); -} |
