mirror of
https://github.com/octoleo/lsyncd.git
synced 2025-01-07 17:14:03 +00:00
further vectorisation, fixed an error condition on deletion
This commit is contained in:
parent
a52d1118d2
commit
2332d1882b
56
lsyncd.c
56
lsyncd.c
@ -366,17 +366,8 @@ struct ivector *tosync = &tosync_obj;
|
|||||||
/**
|
/**
|
||||||
* List of directories on a delay.
|
* List of directories on a delay.
|
||||||
*/
|
*/
|
||||||
int *tackles;
|
struct ivector tackles_obj = {0, };
|
||||||
|
struct ivector *tackles = &tackles_obj;
|
||||||
/**
|
|
||||||
* Size allocated of the tackle list.
|
|
||||||
*/
|
|
||||||
int tackle_size = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Number of tackles.
|
|
||||||
*/
|
|
||||||
int tackle_num = 0;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A constant that assigns every inotify mask a printable string.
|
* A constant that assigns every inotify mask a printable string.
|
||||||
@ -422,6 +413,8 @@ int inotf;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Seconds of delay between event and action
|
* Seconds of delay between event and action
|
||||||
|
*
|
||||||
|
* TODO is an option.
|
||||||
*/
|
*/
|
||||||
clock_t delay = 5;
|
clock_t delay = 5;
|
||||||
|
|
||||||
@ -785,7 +778,8 @@ void dir_conf_add_target(const struct log *log, struct dir_conf *dir_conf, char
|
|||||||
* @param watch the index in dir_watches to the directory.
|
* @param watch the index in dir_watches to the directory.
|
||||||
* @param alarm times() when the directory should be acted.
|
* @param alarm times() when the directory should be acted.
|
||||||
*/
|
*/
|
||||||
bool append_tackle(const struct log *log, int watch, clock_t alarm) {
|
bool
|
||||||
|
append_tackle(const struct log *log, int watch, clock_t alarm) {
|
||||||
printlogf(log, DEBUG, "add tackle(%d)", watch);
|
printlogf(log, DEBUG, "add tackle(%d)", watch);
|
||||||
if (dir_watches[watch].tackled) {
|
if (dir_watches[watch].tackled) {
|
||||||
printlogf(log, DEBUG, "ignored since already tackled.", watch);
|
printlogf(log, DEBUG, "ignored since already tackled.", watch);
|
||||||
@ -794,20 +788,18 @@ bool append_tackle(const struct log *log, int watch, clock_t alarm) {
|
|||||||
dir_watches[watch].tackled = true;
|
dir_watches[watch].tackled = true;
|
||||||
dir_watches[watch].alarm = alarm;
|
dir_watches[watch].alarm = alarm;
|
||||||
|
|
||||||
if (tackle_num + 1 >= tackle_size) {
|
ivector_push(log, tackles, watch);
|
||||||
tackle_size *= 2;
|
|
||||||
tackles = s_realloc(log, tackles, tackle_size*sizeof(int));
|
|
||||||
}
|
|
||||||
tackles[tackle_num++] = watch;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes the first directory on the tackle list.
|
* Removes the first directory on the tackle list.
|
||||||
*/
|
*/
|
||||||
void remove_first_tackle() {
|
void
|
||||||
int tw = tackles[0];
|
remove_first_tackle() {
|
||||||
memmove(tackles, tackles + 1, (--tackle_num) * sizeof(int));
|
int tw = tackles->data[0];
|
||||||
|
// TODO make own function
|
||||||
|
memmove(tackles->data, tackles->data + 1, (--tackles->len) * sizeof(int));
|
||||||
dir_watches[tw].tackled = false;
|
dir_watches[tw].tackled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1365,12 +1357,16 @@ bool remove_dirwatch(const struct log *log, const char * name, int parent)
|
|||||||
// remove a possible tackle
|
// remove a possible tackle
|
||||||
// (this dir is on the delay list)
|
// (this dir is on the delay list)
|
||||||
if (delay > 0 && dir_watches[dw].tackled) {
|
if (delay > 0 && dir_watches[dw].tackled) {
|
||||||
for(i = 0; i < tackle_num; i++) {
|
i = 0;
|
||||||
if (tackles[i] == dw) {
|
while (i < tackles->len) {
|
||||||
|
if (tackles->data[i] == dw) {
|
||||||
// move the list up.
|
// move the list up.
|
||||||
memmove(tackles + i, tackles + i + 1, (tackle_num - i - 1) * sizeof(int));
|
// TODO move own lockig
|
||||||
tackle_num--;
|
memmove(tackles->data + i, tackles->data + i + 1, (tackles->len - i - 1) * sizeof(int));
|
||||||
|
tackles->len--;
|
||||||
break;
|
break;
|
||||||
|
} else {
|
||||||
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1526,17 +1522,14 @@ bool master_loop(const struct global_options *opts)
|
|||||||
printlogf(log, ERROR, "Clocks per seoond invalid! %d", printlogf);
|
printlogf(log, ERROR, "Clocks per seoond invalid! %d", printlogf);
|
||||||
terminate(log, LSYNCD_INTERNALFAIL);
|
terminate(log, LSYNCD_INTERNALFAIL);
|
||||||
}
|
}
|
||||||
tackle_size = 2;
|
|
||||||
tackles = s_calloc(log, tackle_size, sizeof(int));
|
|
||||||
tackle_num = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while (keep_going) {
|
while (keep_going) {
|
||||||
if (delay > 0 && tackle_num > 0) {
|
if (delay > 0 && tackles->len > 0) {
|
||||||
// use select() to determine what happens first
|
// use select() to determine what happens first
|
||||||
// a new event or "alarm" of an event to actually
|
// a new event or "alarm" of an event to actually
|
||||||
// call its binary.
|
// call its binary.
|
||||||
alarm = dir_watches[tackles[0]].alarm;
|
alarm = dir_watches[tackles->data[0]].alarm;
|
||||||
now = times(NULL);
|
now = times(NULL);
|
||||||
tv.tv_sec = (alarm - now) / clocks_per_sec;
|
tv.tv_sec = (alarm - now) / clocks_per_sec;
|
||||||
tv.tv_usec = (alarm - now) * 1000000 / clocks_per_sec % 1000000;
|
tv.tv_usec = (alarm - now) * 1000000 / clocks_per_sec % 1000000;
|
||||||
@ -1577,9 +1570,10 @@ bool master_loop(const struct global_options *opts)
|
|||||||
|
|
||||||
// then check through all events on the
|
// then check through all events on the
|
||||||
// "tackle FIFO" if they expired.
|
// "tackle FIFO" if they expired.
|
||||||
while (tackle_num > 0 && time_after(times(NULL), dir_watches[tackles[0]].alarm)) {
|
// TODO take a common fixed time instead of recalling times();
|
||||||
|
while (tackles->len > 0 && time_after(times(NULL), dir_watches[tackles->data[0]].alarm)) {
|
||||||
printlogf(log, DEBUG, "time for %d arrived.", tackles[0]);
|
printlogf(log, DEBUG, "time for %d arrived.", tackles[0]);
|
||||||
rsync_dir(opts, tackles[0]);
|
rsync_dir(opts, tackles->data[0]);
|
||||||
remove_first_tackle();
|
remove_first_tackle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user