redmine
bin_PROGRAMS = clsync
clsync_SOURCES = sync.c cluster.c main.c output.c fileutils.c malloc.c
clsync_SOURCES = sync.c cluster.c main.c output.c fileutils.c malloc.c glibex.c
main.o: revision.h
... ...
/*
clsync - file tree sync utility based on fanotify and inotify
Copyright (C) 2013 Dmitry Yu Okunev <dyokunev@ut.mephi.ru> 0x8E30679C
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "common.h"
#include "glibex.h"
struct keyvalue_copy_arg {
// GHashTable *ht_src;
GHashTable *ht_dst;
GDupFunc k_dup_funct;
GDupFunc v_dup_funct;
};
void g_hash_table_foreach_keyvalue_copy(gpointer k, gpointer v, gpointer arg_gp) {
// GHashTable *ht_src = ((struct keyvalue_copy_arg *)arg_gp)->ht_src;
GHashTable *ht_dst = ((struct keyvalue_copy_arg *)arg_gp)->ht_dst;
GDupFunc k_dup_funct = ((struct keyvalue_copy_arg *)arg_gp)->k_dup_funct;
GDupFunc v_dup_funct = ((struct keyvalue_copy_arg *)arg_gp)->v_dup_funct;
g_hash_table_insert(ht_dst, k_dup_funct(k), v_dup_funct(v));
return;
}
GHashTable *g_hash_table_dup(GHashTable *ht, GHashFunc hash_funct, GEqualFunc key_equal_funct, GDestroyNotify key_destroy_funct, GDestroyNotify value_destroy_funct, GDupFunc key_dup_funct, GDupFunc value_dup_funct) {
GHashTable *ht_dup = g_hash_table_new_full(hash_funct, key_equal_funct, key_destroy_funct, value_destroy_funct);
struct keyvalue_copy_arg arg;
// arg.ht_src = ht;
arg.ht_dst = ht_dup;
arg.k_dup_funct = key_dup_funct;
arg.v_dup_funct = value_dup_funct;
g_hash_table_foreach(ht, g_hash_table_foreach_keyvalue_copy, &arg);
return ht_dup;
}
... ...
/*
clsync - file tree sync utility based on fanotify and inotify
Copyright (C) 2013 Dmitry Yu Okunev <dyokunev@ut.mephi.ru> 0x8E30679C
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
typedef gpointer(*GDupFunc)(gpointer data);
extern GHashTable *g_hash_table_dup(GHashTable *ht, GHashFunc hash_funct, GEqualFunc key_equal_funct, GDestroyNotify key_destroy_funct, GDestroyNotify value_destroy_funct, GDupFunc key_dup_funct, GDupFunc value_dup_funct);
... ...
... ... @@ -25,11 +25,21 @@
#include "malloc.h"
#include "cluster.h"
#include "sync.h"
#include "glibex.h"
#include <dlfcn.h>
pthread_t pthread_sighandler;
gpointer eidup(gpointer ei_gp) {
eventinfo_t *ei = (eventinfo_t *)ei_gp;
eventinfo_t *ei_dup = (eventinfo_t *)xmalloc(sizeof(*ei));
memcpy(ei_dup, ei, sizeof(*ei));
return (gpointer)ei_dup;
}
static inline int _exitcode_process(options_t *options_p, int exitcode) {
if(options_p->isignoredexitcode[(unsigned char)exitcode])
return 0;
... ... @@ -656,7 +666,7 @@ static inline int so_call_sync(options_t *options_p, indexes_t *indexes_p, int n
threadinfo_p->argv = NULL;
threadinfo_p->options_p = options_p;
threadinfo_p->starttime = time(NULL);
threadinfo_p->fpath2ei_ht = indexes_p->fpath2ei_ht;
threadinfo_p->fpath2ei_ht = g_hash_table_dup(indexes_p->fpath2ei_ht, g_str_hash, g_str_equal, free, free, (gpointer(*)(gpointer))strdup, eidup);
threadinfo_p->n = n;
threadinfo_p->ei = ei;
... ... @@ -815,9 +825,7 @@ static inline int sync_exec_thread(options_t *options_p, indexes_t *indexes_p, t
threadinfo_p->argv = argv;
threadinfo_p->options_p = options_p;
threadinfo_p->starttime = time(NULL);
threadinfo_p->fpath2ei_ht = indexes_p->fpath2ei_ht;
indexes_p->fpath2ei_ht = g_hash_table_new_full(g_str_hash, g_str_equal, free, free);
threadinfo_p->fpath2ei_ht = g_hash_table_dup(indexes_p->fpath2ei_ht, g_str_hash, g_str_equal, free, free, (gpointer(*)(gpointer))strdup, eidup);
if(options_p->synctimeout)
threadinfo_p->expiretime = threadinfo_p->starttime + options_p->synctimeout;
... ...