Signed-off-by: Jonathan Haws jhaws@sdl.usu.edu
ALFRED_INTERVAL is now externalized via the -p option (synchronization period). If specified as option, user supplied interval is used, otherwise the default interval of ALFRED_INTERVAL is used. --- alfred.h | 1 + main.c | 14 +++++++++++++- man/alfred.8 | 5 +++++ server.c | 4 ++-- 4 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/alfred.h b/alfred.h index a9906c8..5b7e965 100644 --- a/alfred.h +++ b/alfred.h @@ -131,6 +131,7 @@ struct globals { uint16_t changed_data_type_count; /* maximum is 256 */
struct timespec if_check; + struct timespec sync_period;
struct hashtable_t *data_hash; struct hashtable_t *transaction_hash; diff --git a/main.c b/main.c index 9cab705..3aa89fd 100644 --- a/main.c +++ b/main.c @@ -59,6 +59,8 @@ static void alfred_usage(void) printf(" -m, --master start up the daemon in master mode, which\n"); printf(" accepts data from slaves and syncs it with\n"); printf(" other masters\n"); + printf(" -p, --sync-period [period] set synchronization period, in seconds\n"); + printf(" fractional seconds are supported (i.e. 0.2 = 5 Hz)\n"); printf("\n"); printf(" -u, --unix-path [path] path to unix socket used for client-server\n"); printf(" communication (default: ""ALFRED_SOCK_PATH_DEFAULT"")\n"); @@ -156,6 +158,7 @@ out: static struct globals *alfred_init(int argc, char *argv[]) { int opt, opt_ind, i, ret; + double sync_period = 0.0; struct globals *globals; struct option long_options[] = { {"set-data", required_argument, NULL, 's'}, @@ -170,6 +173,7 @@ static struct globals *alfred_init(int argc, char *argv[]) {"update-command", required_argument, NULL, 'c'}, {"version", no_argument, NULL, 'v'}, {"verbose", no_argument, NULL, 'd'}, + {"sync-period", required_argument, NULL, 'p'}, {NULL, 0, NULL, 0}, };
@@ -193,12 +197,14 @@ static struct globals *alfred_init(int argc, char *argv[]) globals->unix_path = ALFRED_SOCK_PATH_DEFAULT; globals->verbose = 0; globals->update_command = NULL; + globals->sync_period.tv_sec = ALFRED_INTERVAL; + globals->sync_period.tv_nsec = 0; INIT_LIST_HEAD(&globals->changed_data_types); globals->changed_data_type_count = 0;
time_random_seed();
- while ((opt = getopt_long(argc, argv, "ms:r:hi:b:vV:M:I:u:dc:", long_options, + while ((opt = getopt_long(argc, argv, "ms:r:hi:b:vV:M:I:u:dc:p:", long_options, &opt_ind)) != -1) { switch (opt) { case 'r': @@ -265,6 +271,12 @@ static struct globals *alfred_init(int argc, char *argv[]) printf("%s %s\n", argv[0], SOURCE_VERSION); printf("A.L.F.R.E.D. - Almighty Lightweight Remote Fact Exchange Daemon\n"); return NULL; + case 'p': + sync_period = strtod(optarg, NULL); + globals->sync_period.tv_sec = (int) sync_period; + globals->sync_period.tv_nsec = (double)(sync_period - (int)sync_period) * 1e9; + printf(" ** Setting sync interval to: %.9f seconds (%ld.%09ld)\n", sync_period, globals->sync_period.tv_sec, globals->sync_period.tv_nsec); + break; case 'h': default: alfred_usage(); diff --git a/man/alfred.8 b/man/alfred.8 index 49d42bc..df37040 100644 --- a/man/alfred.8 +++ b/man/alfred.8 @@ -118,6 +118,11 @@ overhead). \fB-c\fP, \fB--update-command\fP \fIcommand\fP Specify command to execute on data change. It will be called with data-type list as arguments. +.TP +\fB-p\fP, \fB--sync-period\fP \fIperiod\fP +Specify alfred synchronization period, in seconds. If not specified, the default +ALFRED_INTERVAL setting of 10 seconds will be used. Fractional seconds are +supported. . .SH EXAMPLES Start an alfred server listening on bridge br0 (assuming that this bridge diff --git a/server.c b/server.c index 47aee4f..c5df945 100644 --- a/server.c +++ b/server.c @@ -372,7 +372,7 @@ int alfred_server(struct globals *globals)
while (1) { clock_gettime(CLOCK_MONOTONIC, &now); - now.tv_sec -= ALFRED_INTERVAL; + time_diff(&now, &globals->sync_period, &now); if (!time_diff(&last_check, &now, &tv)) { tv.tv_sec = 0; tv.tv_nsec = 0; @@ -409,7 +409,7 @@ int alfred_server(struct globals *globals)
if (globals->opmode == OPMODE_MASTER) { /* we are a master */ - printf("announce master ...\n"); + printf("[%ld.%09ld] announce master ...\n", last_check.tv_sec, last_check.tv_nsec); announce_master(globals); sync_data(globals); } else {
On Donnerstag, 28. Juli 2016 14:43:16 CEST Jonathan Haws wrote: [...]
printf(" ** Setting sync interval to: %.9f seconds (%ld.%09ld)\n", sync_period, globals->sync_period.tv_sec, globals->sync_period.tv_nsec);
[...]
printf("announce master ...\n");
printf("[%ld.%09ld] announce master ...\n", last_check.tv_sec, last_check.tv_nsec);
[...]
Are these two things just relicts from your testing code?
Kind regards, Sven
printf(" ** Setting sync interval to: %.9f seconds (%ld.%09ld)\n", sync_period, globals->sync_period.tv_sec, globals->sync_period.tv_nsec);
[...]
printf("announce master ...\n");
printf("[%ld.%09ld] announce master ...\n", last_check.tv_sec, last_check.tv_nsec);
[...]
Are these two things just relicts from your testing code?
Yes and no. I left them in because I figured they were useful additions to the main code.
On Wednesday, August 10, 2016 7:59:12 PM CEST Jonathan Haws wrote:
printf(" ** Setting sync interval to: %.9f seconds (%ld.
%09ld)\n",
sync_period, globals->sync_period.tv_sec, globals->sync_period.tv_nsec);
[...]
printf("announce master ...\n");
printf("[%ld.%09ld] announce master ...\n",
last_check.tv_sec,
last_check.tv_nsec);
[...]
Are these two things just relicts from your testing code?
Yes and no. I left them in because I figured they were useful additions to the main code.
Hmm, I'm not sure if I like the format, but I guess we can keep it for now. :)
Cheers, Simon
On Thursday, July 28, 2016 2:43:16 PM CEST Jonathan Haws wrote:
Signed-off-by: Jonathan Haws jhaws@sdl.usu.edu
ALFRED_INTERVAL is now externalized via the -p option (synchronization period). If specified as option, user supplied interval is used, otherwise the default interval of ALFRED_INTERVAL is used.
[...]
--- a/server.c +++ b/server.c @@ -372,7 +372,7 @@ int alfred_server(struct globals *globals)
while (1) { clock_gettime(CLOCK_MONOTONIC, &now);
now.tv_sec -= ALFRED_INTERVAL;
time_diff(&now, &globals->sync_period, &now);
I believe this at least deserves a comment, or must be made more clear in the code.
ALFRED_INTERVAL is now externalized via the -p option (synchronization period). If specified as option, user supplied interval is used, otherwise the default interval of ALFRED_INTERVAL is used.
[...]
--- a/server.c +++ b/server.c @@ -372,7 +372,7 @@ int alfred_server(struct globals *globals)
while (1) { clock_gettime(CLOCK_MONOTONIC, &now);
now.tv_sec -= ALFRED_INTERVAL;
time_diff(&now, &globals->sync_period, &now);
I believe this at least deserves a comment, or must be made more clear in the code.
This change simply does exactly what the previous code did - subtracts the interval from the current time. It utilizes the existing time_diff() routine to account for nanoseconds.
If you need me to resubmit with that language in the commit text or in a C comment, I can do that.
Thanks!
On Monday, August 15, 2016 2:59:05 PM CEST Jonathan Haws wrote:
ALFRED_INTERVAL is now externalized via the -p option (synchronization period). If specified as option, user supplied interval is used, otherwise the default interval of ALFRED_INTERVAL is used.
[...]
--- a/server.c +++ b/server.c @@ -372,7 +372,7 @@ int alfred_server(struct globals *globals)
while (1) {
clock_gettime(CLOCK_MONOTONIC, &now);
now.tv_sec -= ALFRED_INTERVAL;
time_diff(&now, &globals->sync_period, &now);
I believe this at least deserves a comment, or must be made more clear in the
code.
This change simply does exactly what the previous code did - subtracts the interval from the current time. It utilizes the existing time_diff() routine to account for nanoseconds.
If you need me to resubmit with that language in the commit text or in a C comment, I can do that.
Thanks!
I was staring at your code and time_diff() which was implemented for an entirely different purpose, and concluded that you could be doing the right thing ... ;)
But yes, please re-submit with a comment explaining that, or restructure otherwise to make it more clear. time_diff() was written to get a difference of two timestamps, not to subtracts times from each other, and that confused me.
Thanks, Simon
b.a.t.m.a.n@lists.open-mesh.org