mirror of
https://github.com/octoleo/lsyncd.git
synced 2024-11-11 07:40:55 +00:00
started to combine vector logic.
This commit is contained in:
parent
cdf821c8f5
commit
a52d1118d2
109
lsyncd.c
109
lsyncd.c
@ -39,8 +39,17 @@
|
|||||||
#include <libxml/tree.h>
|
#include <libxml/tree.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO?
|
||||||
|
*/
|
||||||
#define INOTIFY_BUF_LEN (512 * (sizeof(struct inotify_event) + 16))
|
#define INOTIFY_BUF_LEN (512 * (sizeof(struct inotify_event) + 16))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initial size of vectors
|
||||||
|
*/
|
||||||
|
#define VECT_INIT_SIZE 2
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Macros to compare times() values
|
* Macros to compare times() values
|
||||||
* (borrowed from linux/jiffies.h)
|
* (borrowed from linux/jiffies.h)
|
||||||
@ -53,7 +62,6 @@
|
|||||||
#define time_after_eq(a,b) ((long)(a) - (long)(b) >= 0)
|
#define time_after_eq(a,b) ((long)(a) - (long)(b) >= 0)
|
||||||
#define time_before_eq(a,b) time_after_eq(b,a)
|
#define time_before_eq(a,b) time_after_eq(b,a)
|
||||||
|
|
||||||
|
|
||||||
enum log_code {
|
enum log_code {
|
||||||
DEBUG = 1,
|
DEBUG = 1,
|
||||||
NORMAL = 2,
|
NORMAL = 2,
|
||||||
@ -205,13 +213,6 @@ struct inotify_mask_text {
|
|||||||
char const * text;
|
char const * text;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*
|
|
||||||
* Global variables
|
|
||||||
*--------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Options relevant for logging.
|
* Options relevant for logging.
|
||||||
* Part of global options.
|
* Part of global options.
|
||||||
@ -239,6 +240,9 @@ struct log {
|
|||||||
char * logfile;
|
char * logfile;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Global variables
|
||||||
|
*/
|
||||||
struct global_options {
|
struct global_options {
|
||||||
/**
|
/**
|
||||||
* Options relevant for logging.
|
* Options relevant for logging.
|
||||||
@ -316,19 +320,48 @@ struct call_option standard_callopts[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A stack of offset pointers to dir_watches to directories to sync.
|
* General purpose growable vector of integers
|
||||||
*/
|
*/
|
||||||
int *tosync = NULL;
|
struct ivector {
|
||||||
|
/**
|
||||||
|
* data
|
||||||
|
*/
|
||||||
|
int *data;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Number of ints allocated for tosync stack
|
* allocated mem
|
||||||
*/
|
*/
|
||||||
int tosync_size = 0;
|
size_t size;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The pointer of the current tosync position.
|
* length used
|
||||||
*/
|
*/
|
||||||
int tosync_pos = 0;
|
size_t len;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct pvector {
|
||||||
|
/**
|
||||||
|
* data
|
||||||
|
*/
|
||||||
|
void *data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* allocated mem
|
||||||
|
*/
|
||||||
|
size_t size;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* length used
|
||||||
|
*/
|
||||||
|
size_t len;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A FILO stack of offset pointers to dir_watches
|
||||||
|
* to directories to sync.
|
||||||
|
*/
|
||||||
|
struct ivector tosync_obj = {0,};
|
||||||
|
struct ivector *tosync = &tosync_obj;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of directories on a delay.
|
* List of directories on a delay.
|
||||||
@ -349,7 +382,6 @@ int tackle_num = 0;
|
|||||||
* A constant that assigns every inotify mask a printable string.
|
* A constant that assigns every inotify mask a printable string.
|
||||||
* Used for debugging.
|
* Used for debugging.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct inotify_mask_text mask_texts[] = {
|
struct inotify_mask_text mask_texts[] = {
|
||||||
{ IN_ACCESS, "ACCESS" },
|
{ IN_ACCESS, "ACCESS" },
|
||||||
{ IN_ATTRIB, "ATTRIB" },
|
{ IN_ATTRIB, "ATTRIB" },
|
||||||
@ -473,7 +505,6 @@ void terminate(const struct log *log, int status)
|
|||||||
exit(status);
|
exit(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prints a message to either the log stream, preceding a timestamp or
|
* Prints a message to either the log stream, preceding a timestamp or
|
||||||
* forwards a message to syslogd.
|
* forwards a message to syslogd.
|
||||||
@ -669,6 +700,25 @@ char *realdir(const struct log *log, const char *dir)
|
|||||||
return cs;
|
return cs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Appends one value on an integer vector.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ivector_push(const struct log *log, struct ivector *ivect, int val){
|
||||||
|
if (ivect->size > ivect->len + 1) {
|
||||||
|
ivect->data[ivect->len++] = val;
|
||||||
|
} else if (!ivect->data) {
|
||||||
|
ivect->data = s_calloc(log, VECT_INIT_SIZE, sizeof(int));
|
||||||
|
ivect->size = VECT_INIT_SIZE;
|
||||||
|
ivect->len = 1;
|
||||||
|
ivect->data[0] = val;
|
||||||
|
} else {
|
||||||
|
ivect->size *= 2;
|
||||||
|
ivect->data = s_realloc(log, ivect->data, ivect->size * sizeof(int));
|
||||||
|
ivect->data[ivect->len++] = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*
|
/*--------------------------------------------------------------------------*
|
||||||
* dir_configuration handling.
|
* dir_configuration handling.
|
||||||
*--------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------*/
|
||||||
@ -770,24 +820,18 @@ void remove_first_tackle() {
|
|||||||
*
|
*
|
||||||
* @param watch the index in dir_watches to the directory.
|
* @param watch the index in dir_watches to the directory.
|
||||||
*/
|
*/
|
||||||
bool append_tosync_watch(const struct log *log, int watch) {
|
void
|
||||||
|
append_tosync_watch(const struct log *log, int watch) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
printlogf(log, DEBUG, "append_tosync_watch(%d)", watch);
|
printlogf(log, DEBUG, "append_tosync_watch(%d)", watch);
|
||||||
// look if its already in the tosync list.
|
// look if its already in the tosync list.
|
||||||
for(i = 0; i < tosync_pos; i++) {
|
for(i = 0; i < tosync->len; i++) {
|
||||||
if (tosync[i] == watch) {
|
if (tosync->data[i] == watch) {
|
||||||
return true;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ivector_push(log, tosync, watch);
|
||||||
if (tosync_pos + 1 >= tosync_size) {
|
|
||||||
tosync_size *= 2;
|
|
||||||
tosync = s_realloc(log, tosync, tosync_size*sizeof(int));
|
|
||||||
}
|
|
||||||
|
|
||||||
tosync[tosync_pos++] = watch;
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1366,8 +1410,8 @@ bool process_tosync_stack(const struct global_options *opts, clock_t alarm)
|
|||||||
const struct log *log = &opts->log;
|
const struct log *log = &opts->log;
|
||||||
|
|
||||||
printlogf(log, DEBUG, "Processing through tosync stack.");
|
printlogf(log, DEBUG, "Processing through tosync stack.");
|
||||||
while(tosync_pos > 0) {
|
while(tosync->len > 0) {
|
||||||
tackle_dir(opts, tosync[--tosync_pos], alarm);
|
tackle_dir(opts, tosync->data[--tosync->len], alarm);
|
||||||
}
|
}
|
||||||
printlogf(log, DEBUG, "being done with tosync stack");
|
printlogf(log, DEBUG, "being done with tosync stack");
|
||||||
|
|
||||||
@ -2223,9 +2267,6 @@ int main(int argc, char **argv)
|
|||||||
dir_watch_size = 2;
|
dir_watch_size = 2;
|
||||||
dir_watches = s_calloc(log, dir_watch_size, sizeof(struct dir_watch));
|
dir_watches = s_calloc(log, dir_watch_size, sizeof(struct dir_watch));
|
||||||
|
|
||||||
tosync_size = 2;
|
|
||||||
tosync = s_calloc(log, tosync_size, sizeof(int));
|
|
||||||
|
|
||||||
{
|
{
|
||||||
// add all watches
|
// add all watches
|
||||||
int i;
|
int i;
|
||||||
@ -2239,7 +2280,7 @@ int main(int argc, char **argv)
|
|||||||
// super recursive rsync will handle it eitherway
|
// super recursive rsync will handle it eitherway
|
||||||
// or if nostartup user decided already to ignore it.
|
// or if nostartup user decided already to ignore it.
|
||||||
printlogf(log, DEBUG, "dumped tosync stack.");
|
printlogf(log, DEBUG, "dumped tosync stack.");
|
||||||
tosync_pos = 0;
|
tosync->len = 0;
|
||||||
|
|
||||||
// startup recursive sync.
|
// startup recursive sync.
|
||||||
if (!opts.flag_nostartup) {
|
if (!opts.flag_nostartup) {
|
||||||
|
Loading…
Reference in New Issue
Block a user