From a4fa8950c4c6a01c8ffe8803389821717fae772a Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 25 Sep 2012 11:17:04 +0200 Subject: [PATCH 1/4] Implemented lexer rules for time durations. Fixes #3073 --- docs/icinga2-config.txt | 14 ++ icinga-app/config/icinga2.conf.dist | 2 +- lib/config/config_lexer.cc | 217 +++++++++++++++------------- lib/config/config_lexer.ll | 3 + 4 files changed, 136 insertions(+), 100 deletions(-) diff --git a/docs/icinga2-config.txt b/docs/icinga2-config.txt index e8e24deb4..6f495a8c7 100644 --- a/docs/icinga2-config.txt +++ b/docs/icinga2-config.txt @@ -44,6 +44,20 @@ Example: -27.3 ------------------------------------------------------------------------------- +Duration Literal +^^^^^^^^^^^^^^^^ + +Similar to floating-point numbers except for that fact that they support +suffixes to help with specifying time durations. + +Example: + +------------------------------------------------------------------------------- +2.5m +------------------------------------------------------------------------------- + +Supported suffixes include s (seconds), m (minutes) and h (hours). + String Literals ^^^^^^^^^^^^^^^ diff --git a/icinga-app/config/icinga2.conf.dist b/icinga-app/config/icinga2.conf.dist index d932f6bde..a60477b95 100644 --- a/icinga-app/config/icinga2.conf.dist +++ b/icinga-app/config/icinga2.conf.dist @@ -42,6 +42,6 @@ object Host "localhost" { address = "127.0.0.1" }, - check_interval = 10 + check_interval = 1m } diff --git a/lib/config/config_lexer.cc b/lib/config/config_lexer.cc index d399ba184..d0b6ff9a6 100644 --- a/lib/config/config_lexer.cc +++ b/lib/config/config_lexer.cc @@ -370,8 +370,8 @@ static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner ); *yy_cp = '\0'; \ yyg->yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 22 -#define YY_END_OF_BUFFER 23 +#define YY_NUM_RULES 25 +#define YY_END_OF_BUFFER 26 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -379,16 +379,16 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static yyconst flex_int16_t yy_accept[75] = +static yyconst flex_int16_t yy_accept[78] = { 0, - 0, 0, 0, 0, 23, 21, 20, 20, 21, 21, - 21, 21, 21, 21, 9, 10, 7, 7, 7, 7, - 7, 7, 17, 18, 20, 0, 8, 0, 13, 11, - 9, 12, 15, 0, 14, 0, 7, 7, 7, 7, - 7, 7, 17, 16, 0, 19, 9, 7, 7, 7, - 7, 7, 0, 7, 7, 7, 6, 7, 0, 7, - 7, 2, 7, 0, 7, 7, 3, 0, 7, 7, - 4, 1, 5, 0 + 0, 0, 0, 0, 26, 24, 23, 23, 24, 24, + 24, 24, 24, 24, 12, 13, 7, 7, 7, 7, + 7, 7, 20, 21, 23, 0, 8, 0, 16, 14, + 12, 15, 18, 0, 17, 0, 9, 10, 11, 7, + 7, 7, 7, 7, 7, 20, 19, 0, 22, 12, + 7, 7, 7, 7, 7, 0, 7, 7, 7, 6, + 7, 0, 7, 7, 2, 7, 0, 7, 7, 3, + 0, 7, 7, 4, 1, 5, 0 } ; static yyconst flex_int32_t yy_ec[256] = @@ -404,8 +404,8 @@ static yyconst flex_int32_t yy_ec[256] = 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1, 1, 1, 1, 13, 1, 14, 15, 16, 17, - 18, 13, 13, 19, 20, 21, 13, 22, 13, 23, - 24, 13, 13, 25, 26, 27, 28, 13, 13, 13, + 18, 13, 13, 19, 20, 21, 13, 22, 23, 24, + 25, 13, 13, 26, 27, 28, 29, 13, 13, 13, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -423,78 +423,82 @@ static yyconst flex_int32_t yy_ec[256] = 1, 1, 1, 1, 1 } ; -static yyconst flex_int32_t yy_meta[29] = +static yyconst flex_int32_t yy_meta[30] = { 0, 1, 1, 2, 1, 1, 3, 1, 4, 1, 1, 4, 1, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4 + 4, 4, 4, 4, 4, 4, 4, 4, 4 } ; -static yyconst flex_int16_t yy_base[80] = +static yyconst flex_int16_t yy_base[83] = { 0, - 0, 0, 95, 94, 99, 102, 27, 29, 94, 77, - 84, 83, 22, 29, 27, 102, 0, 79, 70, 68, - 63, 75, 0, 79, 40, 84, 102, 64, 102, 102, - 35, 102, 102, 0, 102, 75, 0, 59, 65, 67, - 60, 60, 0, 102, 64, 0, 68, 51, 59, 62, - 53, 56, 51, 47, 46, 48, 0, 53, 40, 53, - 46, 0, 38, 47, 47, 33, 0, 39, 18, 14, - 102, 0, 0, 102, 46, 50, 33, 54, 58 + 0, 0, 100, 99, 104, 107, 28, 30, 99, 82, + 89, 88, 23, 30, 34, 107, 0, 84, 74, 72, + 67, 80, 0, 84, 35, 89, 107, 68, 107, 107, + 0, 107, 107, 0, 107, 80, 107, 107, 107, 0, + 63, 70, 72, 65, 65, 0, 107, 69, 0, 28, + 56, 65, 68, 59, 62, 57, 52, 49, 50, 0, + 44, 30, 44, 36, 0, 26, 35, 34, 21, 0, + 30, 18, 17, 107, 0, 0, 107, 61, 65, 37, + 69, 73 } ; -static yyconst flex_int16_t yy_def[80] = +static yyconst flex_int16_t yy_def[83] = { 0, - 74, 1, 75, 75, 74, 74, 74, 74, 76, 74, - 74, 74, 74, 74, 74, 74, 77, 77, 77, 77, - 77, 77, 78, 74, 74, 76, 74, 74, 74, 74, - 74, 74, 74, 79, 74, 74, 77, 77, 77, 77, - 77, 77, 78, 74, 74, 79, 74, 77, 77, 77, - 77, 77, 74, 77, 77, 77, 77, 77, 74, 77, - 77, 77, 77, 74, 77, 77, 77, 74, 77, 77, - 74, 77, 77, 0, 74, 74, 74, 74, 74 + 77, 1, 78, 78, 77, 77, 77, 77, 79, 77, + 77, 77, 77, 77, 77, 77, 80, 80, 80, 80, + 80, 80, 81, 77, 77, 79, 77, 77, 77, 77, + 15, 77, 77, 82, 77, 77, 77, 77, 77, 80, + 80, 80, 80, 80, 80, 81, 77, 77, 82, 77, + 80, 80, 80, 80, 80, 77, 80, 80, 80, 80, + 80, 77, 80, 80, 80, 80, 77, 80, 80, 80, + 77, 80, 80, 77, 80, 80, 0, 77, 77, 77, + 77, 77 } ; -static yyconst flex_int16_t yy_nxt[131] = +static yyconst flex_int16_t yy_nxt[137] = { 0, 6, 7, 8, 9, 10, 11, 12, 13, 6, 14, 15, 16, 17, 18, 17, 17, 17, 17, 17, 19, - 17, 20, 21, 22, 17, 17, 17, 17, 25, 25, - 25, 25, 31, 32, 33, 36, 37, 31, 34, 73, - 35, 25, 25, 36, 72, 31, 23, 23, 23, 23, - 26, 26, 26, 26, 43, 43, 71, 43, 46, 70, - 46, 46, 69, 68, 67, 66, 65, 64, 63, 62, - 61, 60, 59, 58, 57, 56, 55, 54, 47, 53, - 52, 51, 50, 49, 48, 47, 45, 27, 44, 42, - 41, 40, 39, 38, 30, 29, 28, 27, 74, 24, + 17, 20, 17, 21, 22, 17, 17, 17, 17, 25, + 25, 25, 25, 31, 32, 33, 25, 25, 50, 34, + 40, 35, 36, 76, 31, 75, 37, 74, 73, 72, + 38, 71, 37, 70, 39, 69, 38, 68, 67, 66, + 39, 23, 23, 23, 23, 26, 26, 26, 26, 46, + 46, 65, 46, 49, 64, 49, 49, 63, 62, 61, + 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, + 50, 48, 27, 47, 45, 44, 43, 42, 41, 30, - 24, 5, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74 + 29, 28, 27, 77, 24, 24, 5, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77 } ; -static yyconst flex_int16_t yy_chk[131] = +static yyconst flex_int16_t yy_chk[137] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 7, 7, - 8, 8, 13, 13, 14, 15, 77, 15, 14, 70, - 14, 25, 25, 31, 69, 31, 75, 75, 75, 75, - 76, 76, 76, 76, 78, 78, 68, 78, 79, 66, - 79, 79, 65, 64, 63, 61, 60, 59, 58, 56, - 55, 54, 53, 52, 51, 50, 49, 48, 47, 45, - 42, 41, 40, 39, 38, 36, 28, 26, 24, 22, - 21, 20, 19, 18, 12, 11, 10, 9, 5, 4, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, + 7, 8, 8, 13, 13, 14, 25, 25, 50, 14, + 80, 14, 15, 73, 15, 72, 50, 71, 69, 68, + 50, 67, 15, 66, 50, 64, 15, 63, 62, 61, + 15, 78, 78, 78, 78, 79, 79, 79, 79, 81, + 81, 59, 81, 82, 58, 82, 82, 57, 56, 55, + 54, 53, 52, 51, 48, 45, 44, 43, 42, 41, + 36, 28, 26, 24, 22, 21, 20, 19, 18, 12, - 3, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74 + 11, 10, 9, 5, 4, 3, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77 } ; /* Table of booleans, true if rule could match eol. */ -static yyconst flex_int32_t yy_rule_can_match_eol[23] = +static yyconst flex_int32_t yy_rule_can_match_eol[26] = { 0, -0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 1, 0, 0, }; +0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 1, 0, 0, }; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. @@ -546,7 +550,7 @@ do { \ } while (0) #define YY_NO_UNISTD_H 1 -#line 550 "config_lexer.cc" +#line 554 "config_lexer.cc" #define INITIAL 0 #define IN_C_COMMENT 1 @@ -795,7 +799,7 @@ YY_DECL #line 49 "config_lexer.ll" -#line 799 "config_lexer.cc" +#line 803 "config_lexer.cc" yylval = yylval_param; @@ -852,13 +856,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 75 ) + if ( yy_current_state >= 78 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } - while ( yy_current_state != 74 ); + while ( yy_current_state != 77 ); yy_cp = yyg->yy_last_accepting_cpos; yy_current_state = yyg->yy_last_accepting_state; @@ -934,80 +938,95 @@ YY_RULE_SETUP case 9: YY_RULE_SETUP #line 58 "config_lexer.ll" -{ yylval->num = strtod(yytext, NULL); return T_NUMBER; } +{ yylval->num = strtod(yytext, NULL) * 60 * 60; return T_NUMBER; } YY_BREAK case 10: YY_RULE_SETUP #line 59 "config_lexer.ll" -{ yylval->op = OperatorSet; return T_EQUAL; } +{ yylval->num = strtod(yytext, NULL) * 60; return T_NUMBER; } YY_BREAK case 11: YY_RULE_SETUP #line 60 "config_lexer.ll" -{ yylval->op = OperatorPlus; return T_PLUS_EQUAL; } +{ yylval->num = strtod(yytext, NULL); return T_NUMBER; } YY_BREAK case 12: YY_RULE_SETUP #line 61 "config_lexer.ll" -{ yylval->op = OperatorMinus; return T_MINUS_EQUAL; } +{ yylval->num = strtod(yytext, NULL); return T_NUMBER; } YY_BREAK case 13: YY_RULE_SETUP #line 62 "config_lexer.ll" -{ yylval->op = OperatorMultiply; return T_MULTIPLY_EQUAL; } +{ yylval->op = OperatorSet; return T_EQUAL; } YY_BREAK case 14: YY_RULE_SETUP #line 63 "config_lexer.ll" +{ yylval->op = OperatorPlus; return T_PLUS_EQUAL; } + YY_BREAK +case 15: +YY_RULE_SETUP +#line 64 "config_lexer.ll" +{ yylval->op = OperatorMinus; return T_MINUS_EQUAL; } + YY_BREAK +case 16: +YY_RULE_SETUP +#line 65 "config_lexer.ll" +{ yylval->op = OperatorMultiply; return T_MULTIPLY_EQUAL; } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 66 "config_lexer.ll" { yylval->op = OperatorDivide; return T_DIVIDE_EQUAL; } YY_BREAK -case 15: +case 18: YY_RULE_SETUP -#line 66 "config_lexer.ll" +#line 69 "config_lexer.ll" BEGIN(IN_C_COMMENT); YY_BREAK -case 16: -YY_RULE_SETUP -#line 70 "config_lexer.ll" -BEGIN(INITIAL); - YY_BREAK -case 17: -/* rule 17 can match eol */ -YY_RULE_SETUP -#line 71 "config_lexer.ll" -/* ignore comment */ - YY_BREAK -case 18: -YY_RULE_SETUP -#line 72 "config_lexer.ll" -/* ignore star */ - YY_BREAK - case 19: YY_RULE_SETUP -#line 75 "config_lexer.ll" -/* ignore C++-style comments */ +#line 73 "config_lexer.ll" +BEGIN(INITIAL); YY_BREAK case 20: /* rule 20 can match eol */ YY_RULE_SETUP -#line 76 "config_lexer.ll" -/* ignore whitespace */ +#line 74 "config_lexer.ll" +/* ignore comment */ YY_BREAK case 21: YY_RULE_SETUP -#line 78 "config_lexer.ll" -return yytext[0]; +#line 75 "config_lexer.ll" +/* ignore star */ YY_BREAK + case 22: YY_RULE_SETUP +#line 78 "config_lexer.ll" +/* ignore C++-style comments */ + YY_BREAK +case 23: +/* rule 23 can match eol */ +YY_RULE_SETUP #line 79 "config_lexer.ll" +/* ignore whitespace */ + YY_BREAK +case 24: +YY_RULE_SETUP +#line 81 "config_lexer.ll" +return yytext[0]; + YY_BREAK +case 25: +YY_RULE_SETUP +#line 82 "config_lexer.ll" ECHO; YY_BREAK -#line 1011 "config_lexer.cc" +#line 1030 "config_lexer.cc" case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(IN_C_COMMENT): yyterminate(); @@ -1303,7 +1322,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 75 ) + if ( yy_current_state >= 78 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -1332,11 +1351,11 @@ static int yy_get_next_buffer (yyscan_t yyscanner) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 75 ) + if ( yy_current_state >= 78 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 74); + yy_is_jam = (yy_current_state == 77); return yy_is_jam ? 0 : yy_current_state; } @@ -2195,7 +2214,7 @@ void yyfree (void * ptr , yyscan_t yyscanner) #define YYTABLES_NAME "yytables" -#line 79 "config_lexer.ll" +#line 82 "config_lexer.ll" diff --git a/lib/config/config_lexer.ll b/lib/config/config_lexer.ll index 95cdb9ec4..619e3cb87 100644 --- a/lib/config/config_lexer.ll +++ b/lib/config/config_lexer.ll @@ -55,6 +55,9 @@ inherits return T_INHERITS; null return T_NULL; [a-zA-Z_][a-zA-Z0-9\-_]* { yylval->text = strdup(yytext); return T_IDENTIFIER; } \"[^\"]*\" { yytext[yyleng-1] = '\0'; yylval->text = strdup(yytext + 1); return T_STRING; } +-?[0-9]+(\.[0-9]+)?h { yylval->num = strtod(yytext, NULL) * 60 * 60; return T_NUMBER; } +-?[0-9]+(\.[0-9]+)?m { yylval->num = strtod(yytext, NULL) * 60; return T_NUMBER; } +-?[0-9]+(\.[0-9]+)?s { yylval->num = strtod(yytext, NULL); return T_NUMBER; } -?[0-9]+(\.[0-9]+)? { yylval->num = strtod(yytext, NULL); return T_NUMBER; } = { yylval->op = OperatorSet; return T_EQUAL; } \+= { yylval->op = OperatorPlus; return T_PLUS_EQUAL; } From b13e14d221517f99ed5eb1097d2a06454f7e8cc7 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 25 Sep 2012 11:38:40 +0200 Subject: [PATCH 2/4] Changed header for the status.dat file. --- components/compat/compatcomponent.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/compat/compatcomponent.cpp b/components/compat/compatcomponent.cpp index 22a9b6b49..a68eb35cc 100644 --- a/components/compat/compatcomponent.cpp +++ b/components/compat/compatcomponent.cpp @@ -207,7 +207,7 @@ void CompatComponent::StatusTimerHandler(void) objectfp << std::fixed; - objectfp << "# Icinga object cache file" << "\n" + objectfp << "# Icinga objects cache file" << "\n" << "# This file is auto-generated. Do not modify this file." << "\n" << "\n"; From 8c491cb54543ea9b94606d9349cd23cc58f45615 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 25 Sep 2012 13:46:28 +0200 Subject: [PATCH 3/4] Added documentation for the example config file. --- icinga-app/config/icinga2.conf.dist | 73 +++++++++++++++++++++-------- 1 file changed, 53 insertions(+), 20 deletions(-) diff --git a/icinga-app/config/icinga2.conf.dist b/icinga-app/config/icinga2.conf.dist index a60477b95..07f1022a6 100644 --- a/icinga-app/config/icinga2.conf.dist +++ b/icinga-app/config/icinga2.conf.dist @@ -1,29 +1,59 @@ +/** + * Icinga 2 configuration file + * - this is where you define settings for the Icinga application including + * which hosts/services to check. + * + * The docs/icinga2-config.txt file in the source tarball has a detailed + * description of what configuration options are available. + */ + +/** + * Global configuration settings + */ local object IcingaApplication "icinga" { - -} - -local object Component "checker" { - -} - -local object Component "delegation" { - -} - -local object Component "compat" { - -} - -abstract object Service "nagios-service" { - methods = { - check = "native::PluginCheck" - }, - macros = { plugindir = "/usr/lib/nagios/plugins" } } +/** + * The checker component takes care of executing service checks. + */ +local object Component "checker" { + +} + +/** + * The delegation component assigns services to checkers. You need to load + * this component even if your Icinga setup only consists of a single instance. + */ +local object Component "delegation" { + +} + +/** + * The compat component periodically updates the status.dat and objects.cache + * files. These are used by the Icinga 1.x CGIs to display the state of + * hosts and services. + */ +local object Component "compat" { + +} + +/** + * This template defines some basic parameters for services that use + * external plugins for their checks. + */ +abstract object Service "nagios-service" { + methods = { + check = "native::PluginCheck" + } +} + +/** + * The service template for ping checks. In an Icinga 1.x environment + * this would be defined as a check command. + */ abstract object Service "ping" inherits "nagios-service" { check_command = "$plugindir$/check_ping -H $address$ -w $wrta$,$wpl$% -c $crta$,$cpl$%", @@ -35,6 +65,9 @@ abstract object Service "ping" inherits "nagios-service" { } } +/** + * And finally we define some host that should be checked. + */ object Host "localhost" { services = { "ping" }, From c81fd071e618740fac9351fdc0e47d654d65a156 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 25 Sep 2012 14:03:41 +0200 Subject: [PATCH 4/4] Detect local time changes. --- lib/base/application.cpp | 16 ++++++++++++++++ lib/base/timer.cpp | 13 +++++++++++++ lib/base/timer.h | 1 + 3 files changed, 30 insertions(+) diff --git a/lib/base/application.cpp b/lib/base/application.cpp index fc36f4605..0838ea918 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -99,6 +99,8 @@ void Application::RunEventLoop(void) double nextProfile = 0; #endif /* _DEBUG */ + double lastLoop = Utility::GetTime(); + while (!m_ShuttingDown) { Object::ClearHeldObjects(); @@ -123,6 +125,20 @@ void Application::RunEventLoop(void) nextProfile = Utility::GetTime() + 15.0; } #endif /* _DEBUG */ + + double now = Utility::GetTime(); + + if (now < lastLoop) { + /* We moved backwards in time - cool. */ + double lostTime = lastLoop - now; + stringstream msgbuf; + msgbuf << "We moved backwards in time: " << lostTime + << " seconds"; + Logger::Write(LogInformation, "base", msgbuf.str()); + Timer::AdjustTimers(-lostTime); + } + + lastLoop = now; } } diff --git a/lib/base/timer.cpp b/lib/base/timer.cpp index ce2436908..faa8cf1eb 100644 --- a/lib/base/timer.cpp +++ b/lib/base/timer.cpp @@ -155,3 +155,16 @@ void Timer::Reschedule(double next) { m_Next = next; } + +/** + * Adjusts all timers by adding the specified amount of time to their + * next scheduled timestamp. + * + * @param adjustment The adjustment. + */ +void Timer::AdjustTimers(double adjustment) +{ + BOOST_FOREACH(Timer::Ptr timer, m_Timers) { + timer->m_Next += adjustment; + } +} diff --git a/lib/base/timer.h b/lib/base/timer.h index 2cde7360e..ab32c624c 100644 --- a/lib/base/timer.h +++ b/lib/base/timer.h @@ -43,6 +43,7 @@ public: double GetInterval(void) const; static double ProcessTimers(void); + static void AdjustTimers(double adjustment); void Start(void); void Stop(void);