Add detection of system clock skew, reinitialize all timers when this happens
This commit is contained in:
parent
fcd08f8ee4
commit
12bc7f13e1
6
po/cs.po
6
po/cs.po
@ -6,7 +6,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: WeeChat 0.2.7-dev\n"
|
"Project-Id-Version: WeeChat 0.2.7-dev\n"
|
||||||
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
|
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
|
||||||
"POT-Creation-Date: 2008-11-02 18:48+0100\n"
|
"POT-Creation-Date: 2008-11-03 15:56+0100\n"
|
||||||
"PO-Revision-Date: 2008-09-17 16:19+0200\n"
|
"PO-Revision-Date: 2008-09-17 16:19+0200\n"
|
||||||
"Last-Translator: Jiri Golembiovsky <golemj@gmail.com>\n"
|
"Last-Translator: Jiri Golembiovsky <golemj@gmail.com>\n"
|
||||||
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
|
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
|
||||||
@ -1750,6 +1750,10 @@ msgstr " . hodnoty: mezi %d a %d\n"
|
|||||||
msgid " . description: %s\n"
|
msgid " . description: %s\n"
|
||||||
msgstr " . popis: %s\n"
|
msgstr " . popis: %s\n"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
msgid "System clock skew detected (-%ld seconds), reinitializing all timers"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, fuzzy, c-format
|
#, fuzzy, c-format
|
||||||
msgid "%sError: too much calls to command \"%s\" (looping)"
|
msgid "%sError: too much calls to command \"%s\" (looping)"
|
||||||
msgstr "%s nekorektní hodnota pro volbu \"%s\"\n"
|
msgstr "%s nekorektní hodnota pro volbu \"%s\"\n"
|
||||||
|
6
po/de.po
6
po/de.po
@ -9,7 +9,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: WeeChat 0.2.7-dev\n"
|
"Project-Id-Version: WeeChat 0.2.7-dev\n"
|
||||||
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
|
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
|
||||||
"POT-Creation-Date: 2008-11-02 18:48+0100\n"
|
"POT-Creation-Date: 2008-11-03 15:56+0100\n"
|
||||||
"PO-Revision-Date: 2007-09-06 12:44+0200\n"
|
"PO-Revision-Date: 2007-09-06 12:44+0200\n"
|
||||||
"Last-Translator: Thomas Schuetz <i18n@internet-villa.de>\n"
|
"Last-Translator: Thomas Schuetz <i18n@internet-villa.de>\n"
|
||||||
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
|
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
|
||||||
@ -1767,6 +1767,10 @@ msgstr " . Werte: zwischen %d und %d\n"
|
|||||||
msgid " . description: %s\n"
|
msgid " . description: %s\n"
|
||||||
msgstr " . Beschreibung: %s\n"
|
msgstr " . Beschreibung: %s\n"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
msgid "System clock skew detected (-%ld seconds), reinitializing all timers"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, fuzzy, c-format
|
#, fuzzy, c-format
|
||||||
msgid "%sError: too much calls to command \"%s\" (looping)"
|
msgid "%sError: too much calls to command \"%s\" (looping)"
|
||||||
msgstr "%s ungültiger Wert für die Option \"%s\"\n"
|
msgstr "%s ungültiger Wert für die Option \"%s\"\n"
|
||||||
|
10
po/es.po
10
po/es.po
@ -6,7 +6,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: WeeChat 0.2.7-dev\n"
|
"Project-Id-Version: WeeChat 0.2.7-dev\n"
|
||||||
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
|
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
|
||||||
"POT-Creation-Date: 2008-11-02 18:48+0100\n"
|
"POT-Creation-Date: 2008-11-03 15:56+0100\n"
|
||||||
"PO-Revision-Date: 2007-09-19 12:09+0200\n"
|
"PO-Revision-Date: 2007-09-19 12:09+0200\n"
|
||||||
"Last-Translator: Roberto González Cardenete <robert.glez@gmail.com>\n"
|
"Last-Translator: Roberto González Cardenete <robert.glez@gmail.com>\n"
|
||||||
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
|
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
|
||||||
@ -1257,8 +1257,8 @@ msgstr "la cadena mostrada tras la finalización de los nombres de usuario"
|
|||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "use a marker (line or char) on buffers to show first unread line"
|
msgid "use a marker (line or char) on buffers to show first unread line"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"usar un marcador en los servidores/canales para mostrar la primera lÃnea "
|
"usar un marcador en los servidores/canales para mostrar la primera lÃnea sin "
|
||||||
"sin leer"
|
"leer"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "save configuration file on exit"
|
msgid "save configuration file on exit"
|
||||||
@ -1754,6 +1754,10 @@ msgstr " . valores: entre %d y %d\n"
|
|||||||
msgid " . description: %s\n"
|
msgid " . description: %s\n"
|
||||||
msgstr " . descripción: %s\n"
|
msgstr " . descripción: %s\n"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
msgid "System clock skew detected (-%ld seconds), reinitializing all timers"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, fuzzy, c-format
|
#, fuzzy, c-format
|
||||||
msgid "%sError: too much calls to command \"%s\" (looping)"
|
msgid "%sError: too much calls to command \"%s\" (looping)"
|
||||||
msgstr "%s valor incorrecto para la opción \"%s\"\n"
|
msgstr "%s valor incorrecto para la opción \"%s\"\n"
|
||||||
|
10
po/fr.po
10
po/fr.po
@ -6,8 +6,8 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: WeeChat 0.2.7-dev\n"
|
"Project-Id-Version: WeeChat 0.2.7-dev\n"
|
||||||
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
|
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
|
||||||
"POT-Creation-Date: 2008-11-02 18:48+0100\n"
|
"POT-Creation-Date: 2008-11-03 15:56+0100\n"
|
||||||
"PO-Revision-Date: 2008-11-02 18:49+0100\n"
|
"PO-Revision-Date: 2008-11-03 15:57+0100\n"
|
||||||
"Last-Translator: FlashCode <flashcode@flashtux.org>\n"
|
"Last-Translator: FlashCode <flashcode@flashtux.org>\n"
|
||||||
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
|
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
@ -1777,6 +1777,12 @@ msgstr " . valeurs: couleur (dépend de l'interface utilisée)\n"
|
|||||||
msgid " . description: %s\n"
|
msgid " . description: %s\n"
|
||||||
msgstr " . description: %s\n"
|
msgstr " . description: %s\n"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
msgid "System clock skew detected (-%ld seconds), reinitializing all timers"
|
||||||
|
msgstr ""
|
||||||
|
"Décalage de l'horloge système détecté (-%ld secondes), réinitialisation de "
|
||||||
|
"tous les minuteurs"
|
||||||
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%sError: too much calls to command \"%s\" (looping)"
|
msgid "%sError: too much calls to command \"%s\" (looping)"
|
||||||
msgstr "%sErreur: trop d'appels à la commande \"%s\" (boucle)"
|
msgstr "%sErreur: trop d'appels à la commande \"%s\" (boucle)"
|
||||||
|
6
po/hu.po
6
po/hu.po
@ -12,7 +12,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: WeeChat 0.2.7-dev\n"
|
"Project-Id-Version: WeeChat 0.2.7-dev\n"
|
||||||
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
|
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
|
||||||
"POT-Creation-Date: 2008-11-02 18:48+0100\n"
|
"POT-Creation-Date: 2008-11-03 15:56+0100\n"
|
||||||
"PO-Revision-Date: 2007-10-10 18:07+0200\n"
|
"PO-Revision-Date: 2007-10-10 18:07+0200\n"
|
||||||
"Last-Translator: Andras Voroskoi <voroskoi@frugalware.org>\n"
|
"Last-Translator: Andras Voroskoi <voroskoi@frugalware.org>\n"
|
||||||
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
|
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
|
||||||
@ -1778,6 +1778,10 @@ msgstr " . értékek: %d és %d között\n"
|
|||||||
msgid " . description: %s\n"
|
msgid " . description: %s\n"
|
||||||
msgstr " . leírás : %s\n"
|
msgstr " . leírás : %s\n"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
msgid "System clock skew detected (-%ld seconds), reinitializing all timers"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, fuzzy, c-format
|
#, fuzzy, c-format
|
||||||
msgid "%sError: too much calls to command \"%s\" (looping)"
|
msgid "%sError: too much calls to command \"%s\" (looping)"
|
||||||
msgstr "%s helytelen érték a \"%s\" paraméternek\n"
|
msgstr "%s helytelen érték a \"%s\" paraméternek\n"
|
||||||
|
6
po/ru.po
6
po/ru.po
@ -6,7 +6,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: WeeChat 0.2.7-dev\n"
|
"Project-Id-Version: WeeChat 0.2.7-dev\n"
|
||||||
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
|
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
|
||||||
"POT-Creation-Date: 2008-11-02 18:48+0100\n"
|
"POT-Creation-Date: 2008-11-03 15:56+0100\n"
|
||||||
"PO-Revision-Date: 2007-09-06 12:44+0200\n"
|
"PO-Revision-Date: 2007-09-06 12:44+0200\n"
|
||||||
"Last-Translator: Pavel Shevchuk <stlwrt@gmail.com>\n"
|
"Last-Translator: Pavel Shevchuk <stlwrt@gmail.com>\n"
|
||||||
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
|
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
|
||||||
@ -1780,6 +1780,10 @@ msgstr " . значения: от %d до %d\n"
|
|||||||
msgid " . description: %s\n"
|
msgid " . description: %s\n"
|
||||||
msgstr " . описание: %s\n"
|
msgstr " . описание: %s\n"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
msgid "System clock skew detected (-%ld seconds), reinitializing all timers"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, fuzzy, c-format
|
#, fuzzy, c-format
|
||||||
msgid "%sError: too much calls to command \"%s\" (looping)"
|
msgid "%sError: too much calls to command \"%s\" (looping)"
|
||||||
msgstr "%s некорректное значение параметра \"%s\"\n"
|
msgstr "%s некорректное значение параметра \"%s\"\n"
|
||||||
|
@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
|
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
|
||||||
"POT-Creation-Date: 2008-11-02 18:48+0100\n"
|
"POT-Creation-Date: 2008-11-03 15:56+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@ -1481,6 +1481,10 @@ msgstr ""
|
|||||||
msgid " . description: %s\n"
|
msgid " . description: %s\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
msgid "System clock skew detected (-%ld seconds), reinitializing all timers"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%sError: too much calls to command \"%s\" (looping)"
|
msgid "%sError: too much calls to command \"%s\" (looping)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
#include "wee-string.h"
|
#include "wee-string.h"
|
||||||
#include "wee-util.h"
|
#include "wee-util.h"
|
||||||
#include "../gui/gui-buffer.h"
|
#include "../gui/gui-buffer.h"
|
||||||
|
#include "../gui/gui-chat.h"
|
||||||
#include "../gui/gui-color.h"
|
#include "../gui/gui-color.h"
|
||||||
#include "../gui/gui-completion.h"
|
#include "../gui/gui-completion.h"
|
||||||
#include "../plugins/plugin.h"
|
#include "../plugins/plugin.h"
|
||||||
@ -48,10 +49,11 @@
|
|||||||
char *hook_type_string[HOOK_NUM_TYPES] =
|
char *hook_type_string[HOOK_NUM_TYPES] =
|
||||||
{ "command", "timer", "fd", "connect", "print", "signal", "config",
|
{ "command", "timer", "fd", "connect", "print", "signal", "config",
|
||||||
"completion", "modifier", "info", "infolist" };
|
"completion", "modifier", "info", "infolist" };
|
||||||
struct t_hook *weechat_hooks[HOOK_NUM_TYPES];
|
struct t_hook *weechat_hooks[HOOK_NUM_TYPES]; /* list of hooks */
|
||||||
struct t_hook *last_weechat_hook[HOOK_NUM_TYPES];
|
struct t_hook *last_weechat_hook[HOOK_NUM_TYPES]; /* last hook */
|
||||||
int hook_exec_recursion = 0;
|
int hook_exec_recursion = 0; /* 1 when a hook is executed */
|
||||||
int real_delete_pending = 0;
|
time_t hook_last_system_time = 0; /* used to detect system clock skew */
|
||||||
|
int real_delete_pending = 0; /* 1 if some hooks must be deleted */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -68,6 +70,7 @@ hook_init ()
|
|||||||
weechat_hooks[type] = NULL;
|
weechat_hooks[type] = NULL;
|
||||||
last_weechat_hook[type] = NULL;
|
last_weechat_hook[type] = NULL;
|
||||||
}
|
}
|
||||||
|
hook_last_system_time = time (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -510,41 +513,17 @@ hook_command_exec (struct t_gui_buffer *buffer, int any_plugin,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* hook_timer: hook a timer
|
* hook_timer_init: init a timer hook
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct t_hook *
|
void
|
||||||
hook_timer (struct t_weechat_plugin *plugin, long interval, int align_second,
|
hook_timer_init (struct t_hook *hook)
|
||||||
int max_calls, t_hook_callback_timer *callback,
|
|
||||||
void *callback_data)
|
|
||||||
{
|
{
|
||||||
struct t_hook *new_hook;
|
|
||||||
struct t_hook_timer *new_hook_timer;
|
|
||||||
time_t time_now;
|
time_t time_now;
|
||||||
struct tm *local_time, *gm_time;
|
struct tm *local_time, *gm_time;
|
||||||
int local_hour, gm_hour, diff_hour;
|
int local_hour, gm_hour, diff_hour;
|
||||||
|
|
||||||
if (interval <= 0)
|
gettimeofday (&HOOK_TIMER(hook, last_exec), NULL);
|
||||||
return NULL;
|
|
||||||
|
|
||||||
new_hook = malloc (sizeof (*new_hook));
|
|
||||||
if (!new_hook)
|
|
||||||
return NULL;
|
|
||||||
new_hook_timer = malloc (sizeof (*new_hook_timer));
|
|
||||||
if (!new_hook_timer)
|
|
||||||
{
|
|
||||||
free (new_hook);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
hook_init_data (new_hook, plugin, HOOK_TYPE_TIMER, callback_data);
|
|
||||||
|
|
||||||
new_hook->hook_data = new_hook_timer;
|
|
||||||
new_hook_timer->callback = callback;
|
|
||||||
new_hook_timer->interval = interval;
|
|
||||||
new_hook_timer->remaining_calls = max_calls;
|
|
||||||
|
|
||||||
gettimeofday (&new_hook_timer->last_exec, NULL);
|
|
||||||
time_now = time (NULL);
|
time_now = time (NULL);
|
||||||
local_time = localtime(&time_now);
|
local_time = localtime(&time_now);
|
||||||
local_hour = local_time->tm_hour;
|
local_hour = local_time->tm_hour;
|
||||||
@ -565,34 +544,112 @@ hook_timer (struct t_weechat_plugin *plugin, long interval, int align_second,
|
|||||||
else
|
else
|
||||||
diff_hour = local_hour - gm_hour;
|
diff_hour = local_hour - gm_hour;
|
||||||
|
|
||||||
if ((interval >= 1000) && (align_second > 0))
|
if ((HOOK_TIMER(hook, interval) >= 1000)
|
||||||
|
&& (HOOK_TIMER(hook, align_second) > 0))
|
||||||
{
|
{
|
||||||
/* here we should use 0, but with this value timer is sometimes called
|
/* here we should use 0, but with this value timer is sometimes called
|
||||||
before second has changed, so for displaying time, it may display
|
before second has changed, so for displaying time, it may display
|
||||||
2 times the same second, that's why we use 1000 micro seconds */
|
2 times the same second, that's why we use 1000 micro seconds */
|
||||||
new_hook_timer->last_exec.tv_usec = 1000;
|
HOOK_TIMER(hook, last_exec).tv_usec = 1000;
|
||||||
new_hook_timer->last_exec.tv_sec =
|
HOOK_TIMER(hook, last_exec).tv_sec =
|
||||||
new_hook_timer->last_exec.tv_sec -
|
HOOK_TIMER(hook, last_exec).tv_sec -
|
||||||
((new_hook_timer->last_exec.tv_sec + (diff_hour * 3600)) %
|
((HOOK_TIMER(hook, last_exec).tv_sec + (diff_hour * 3600)) %
|
||||||
align_second);
|
HOOK_TIMER(hook, align_second));
|
||||||
}
|
}
|
||||||
|
|
||||||
new_hook_timer->next_exec.tv_sec = new_hook_timer->last_exec.tv_sec;
|
/* init next call with date of last call */
|
||||||
new_hook_timer->next_exec.tv_usec = new_hook_timer->last_exec.tv_usec;
|
HOOK_TIMER(hook, next_exec).tv_sec = HOOK_TIMER(hook, last_exec).tv_sec;
|
||||||
util_timeval_add (&new_hook_timer->next_exec, interval);
|
HOOK_TIMER(hook, next_exec).tv_usec = HOOK_TIMER(hook, last_exec).tv_usec;
|
||||||
|
|
||||||
|
/* add interval to next call date */
|
||||||
|
util_timeval_add (&HOOK_TIMER(hook, next_exec), HOOK_TIMER(hook, interval));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* hook_timer: hook a timer
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct t_hook *
|
||||||
|
hook_timer (struct t_weechat_plugin *plugin, long interval, int align_second,
|
||||||
|
int max_calls, t_hook_callback_timer *callback,
|
||||||
|
void *callback_data)
|
||||||
|
{
|
||||||
|
struct t_hook *new_hook;
|
||||||
|
struct t_hook_timer *new_hook_timer;
|
||||||
|
|
||||||
|
if (interval <= 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
new_hook = malloc (sizeof (*new_hook));
|
||||||
|
if (!new_hook)
|
||||||
|
return NULL;
|
||||||
|
new_hook_timer = malloc (sizeof (*new_hook_timer));
|
||||||
|
if (!new_hook_timer)
|
||||||
|
{
|
||||||
|
free (new_hook);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
hook_init_data (new_hook, plugin, HOOK_TYPE_TIMER, callback_data);
|
||||||
|
|
||||||
|
new_hook->hook_data = new_hook_timer;
|
||||||
|
new_hook_timer->callback = callback;
|
||||||
|
new_hook_timer->interval = interval;
|
||||||
|
new_hook_timer->align_second = align_second;
|
||||||
|
new_hook_timer->remaining_calls = max_calls;
|
||||||
|
|
||||||
|
hook_timer_init (new_hook);
|
||||||
|
|
||||||
hook_add_to_list (new_hook);
|
hook_add_to_list (new_hook);
|
||||||
|
|
||||||
return new_hook;
|
return new_hook;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* hook_timer_check_system_clock: check if system clock is older than previous
|
||||||
|
* call to this function (that means new time
|
||||||
|
* is lower that in past). If yes, then adjust
|
||||||
|
* all timers to current time
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
hook_timer_check_system_clock ()
|
||||||
|
{
|
||||||
|
time_t now;
|
||||||
|
long diff_time;
|
||||||
|
struct t_hook *ptr_hook;
|
||||||
|
|
||||||
|
now = time (NULL);
|
||||||
|
|
||||||
|
/* check if difference with previous time is more than 10 seconds
|
||||||
|
If it is, then consider it's clock skew and reinitialize all timers */
|
||||||
|
diff_time = now - hook_last_system_time;
|
||||||
|
if ((diff_time <= -10) || (diff_time >= 10))
|
||||||
|
{
|
||||||
|
gui_chat_printf (NULL,
|
||||||
|
_("System clock skew detected (%+ld seconds), "
|
||||||
|
"reinitializing all timers"),
|
||||||
|
diff_time);
|
||||||
|
|
||||||
|
/* reinitialize all timers */
|
||||||
|
for (ptr_hook = weechat_hooks[HOOK_TYPE_TIMER]; ptr_hook;
|
||||||
|
ptr_hook = ptr_hook->next_hook)
|
||||||
|
{
|
||||||
|
if (!ptr_hook->deleted)
|
||||||
|
hook_timer_init (ptr_hook);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hook_last_system_time = now;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* hook_timer_time_to_next: get time to next timeout
|
* hook_timer_time_to_next: get time to next timeout
|
||||||
* return 1 if timeout is set with next timeout
|
* return 1 if timeout is set with next timeout
|
||||||
* 0 if there's no timeout
|
* 0 if there's no timeout
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
void
|
||||||
hook_timer_time_to_next (struct timeval *tv_timeout)
|
hook_timer_time_to_next (struct timeval *tv_timeout)
|
||||||
{
|
{
|
||||||
struct t_hook *ptr_hook;
|
struct t_hook *ptr_hook;
|
||||||
@ -600,6 +657,8 @@ hook_timer_time_to_next (struct timeval *tv_timeout)
|
|||||||
struct timeval tv_now;
|
struct timeval tv_now;
|
||||||
long diff_usec;
|
long diff_usec;
|
||||||
|
|
||||||
|
hook_timer_check_system_clock ();
|
||||||
|
|
||||||
found = 0;
|
found = 0;
|
||||||
tv_timeout->tv_sec = 0;
|
tv_timeout->tv_sec = 0;
|
||||||
tv_timeout->tv_usec = 0;
|
tv_timeout->tv_usec = 0;
|
||||||
@ -617,9 +676,13 @@ hook_timer_time_to_next (struct timeval *tv_timeout)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* no timeout found */
|
/* no timeout found, return 2 seconds by default */
|
||||||
if (!found)
|
if (!found)
|
||||||
return 0;
|
{
|
||||||
|
tv_timeout->tv_sec = 2;
|
||||||
|
tv_timeout->tv_usec = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
gettimeofday (&tv_now, NULL);
|
gettimeofday (&tv_now, NULL);
|
||||||
|
|
||||||
@ -628,7 +691,7 @@ hook_timer_time_to_next (struct timeval *tv_timeout)
|
|||||||
{
|
{
|
||||||
tv_timeout->tv_sec = 0;
|
tv_timeout->tv_sec = 0;
|
||||||
tv_timeout->tv_usec = 0;
|
tv_timeout->tv_usec = 0;
|
||||||
return 1;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
tv_timeout->tv_sec = tv_timeout->tv_sec - tv_now.tv_sec;
|
tv_timeout->tv_sec = tv_timeout->tv_sec - tv_now.tv_sec;
|
||||||
@ -641,7 +704,13 @@ hook_timer_time_to_next (struct timeval *tv_timeout)
|
|||||||
tv_timeout->tv_usec = 1000000 + diff_usec;
|
tv_timeout->tv_usec = 1000000 + diff_usec;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
/* to detect clock skew, we ensure there's a call to timers every
|
||||||
|
2 seconds max */
|
||||||
|
if (tv_timeout->tv_sec > 2)
|
||||||
|
{
|
||||||
|
tv_timeout->tv_sec = 2;
|
||||||
|
tv_timeout->tv_usec = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -654,6 +723,8 @@ hook_timer_exec ()
|
|||||||
struct timeval tv_time;
|
struct timeval tv_time;
|
||||||
struct t_hook *ptr_hook, *next_hook;
|
struct t_hook *ptr_hook, *next_hook;
|
||||||
|
|
||||||
|
hook_timer_check_system_clock ();
|
||||||
|
|
||||||
gettimeofday (&tv_time, NULL);
|
gettimeofday (&tv_time, NULL);
|
||||||
|
|
||||||
hook_exec_start ();
|
hook_exec_start ();
|
||||||
@ -1776,6 +1847,8 @@ hook_add_to_infolist_type (struct t_infolist *infolist,
|
|||||||
snprintf (value, sizeof (value), "%ld", HOOK_TIMER(ptr_hook, interval));
|
snprintf (value, sizeof (value), "%ld", HOOK_TIMER(ptr_hook, interval));
|
||||||
if (!infolist_new_var_string (ptr_item, "interval", value))
|
if (!infolist_new_var_string (ptr_item, "interval", value))
|
||||||
return 0;
|
return 0;
|
||||||
|
if (!infolist_new_var_integer (ptr_item, "align_second", HOOK_TIMER(ptr_hook, align_second)))
|
||||||
|
return 0;
|
||||||
if (!infolist_new_var_integer (ptr_item, "remaining_calls", HOOK_TIMER(ptr_hook, remaining_calls)))
|
if (!infolist_new_var_integer (ptr_item, "remaining_calls", HOOK_TIMER(ptr_hook, remaining_calls)))
|
||||||
return 0;
|
return 0;
|
||||||
if (!infolist_new_var_buffer (ptr_item, "last_exec",
|
if (!infolist_new_var_buffer (ptr_item, "last_exec",
|
||||||
@ -1996,6 +2069,7 @@ hook_print_log ()
|
|||||||
log_printf (" timer data:");
|
log_printf (" timer data:");
|
||||||
log_printf (" callback . . . . . . : 0x%x", HOOK_TIMER(ptr_hook, callback));
|
log_printf (" callback . . . . . . : 0x%x", HOOK_TIMER(ptr_hook, callback));
|
||||||
log_printf (" interval . . . . . . : %ld", HOOK_TIMER(ptr_hook, interval));
|
log_printf (" interval . . . . . . : %ld", HOOK_TIMER(ptr_hook, interval));
|
||||||
|
log_printf (" align_second . . . . : %d", HOOK_TIMER(ptr_hook, align_second));
|
||||||
log_printf (" remaining_calls. . . : %d", HOOK_TIMER(ptr_hook, remaining_calls));
|
log_printf (" remaining_calls. . . : %d", HOOK_TIMER(ptr_hook, remaining_calls));
|
||||||
local_time = localtime (&HOOK_TIMER(ptr_hook, last_exec).tv_sec);
|
local_time = localtime (&HOOK_TIMER(ptr_hook, last_exec).tv_sec);
|
||||||
strftime (text_time, sizeof (text_time),
|
strftime (text_time, sizeof (text_time),
|
||||||
|
@ -106,6 +106,8 @@ struct t_hook_timer
|
|||||||
{
|
{
|
||||||
t_hook_callback_timer *callback; /* timer callback */
|
t_hook_callback_timer *callback; /* timer callback */
|
||||||
long interval; /* timer interval (milliseconds) */
|
long interval; /* timer interval (milliseconds) */
|
||||||
|
int align_second; /* alignment on a second */
|
||||||
|
/* for ex.: 60 = each min. at 0 sec */
|
||||||
int remaining_calls; /* calls remaining (0 = unlimited) */
|
int remaining_calls; /* calls remaining (0 = unlimited) */
|
||||||
struct timeval last_exec; /* last time hook was executed */
|
struct timeval last_exec; /* last time hook was executed */
|
||||||
struct timeval next_exec; /* next scheduled execution */
|
struct timeval next_exec; /* next scheduled execution */
|
||||||
@ -242,7 +244,7 @@ extern struct t_hook *hook_timer (struct t_weechat_plugin *plugin,
|
|||||||
int max_calls,
|
int max_calls,
|
||||||
t_hook_callback_timer *callback,
|
t_hook_callback_timer *callback,
|
||||||
void *callback_data);
|
void *callback_data);
|
||||||
extern int hook_timer_time_to_next (struct timeval *tv_timeout);
|
extern void hook_timer_time_to_next (struct timeval *tv_timeout);
|
||||||
extern void hook_timer_exec ();
|
extern void hook_timer_exec ();
|
||||||
extern struct t_hook *hook_fd (struct t_weechat_plugin *plugin, int fd,
|
extern struct t_hook *hook_fd (struct t_weechat_plugin *plugin, int fd,
|
||||||
int flag_read, int flag_write,
|
int flag_read, int flag_write,
|
||||||
|
@ -294,12 +294,9 @@ gui_main_loop ()
|
|||||||
FD_ZERO (&write_fds);
|
FD_ZERO (&write_fds);
|
||||||
FD_ZERO (&except_fds);
|
FD_ZERO (&except_fds);
|
||||||
max_fd = hook_fd_set (&read_fds, &write_fds, &except_fds);
|
max_fd = hook_fd_set (&read_fds, &write_fds, &except_fds);
|
||||||
if (hook_timer_time_to_next (&tv_timeout))
|
hook_timer_time_to_next (&tv_timeout);
|
||||||
ready = select (max_fd + 1, &read_fds, &write_fds, &except_fds,
|
ready = select (max_fd + 1, &read_fds, &write_fds, &except_fds,
|
||||||
&tv_timeout);
|
&tv_timeout);
|
||||||
else
|
|
||||||
ready = select (max_fd + 1, &read_fds, &write_fds, &except_fds,
|
|
||||||
NULL);
|
|
||||||
if (ready > 0)
|
if (ready > 0)
|
||||||
{
|
{
|
||||||
hook_fd_exec (&read_fds, &write_fds, &except_fds);
|
hook_fd_exec (&read_fds, &write_fds, &except_fds);
|
||||||
|
@ -1117,6 +1117,11 @@ irc_server_outqueue_send (struct t_irc_server *server)
|
|||||||
if (server->outqueue)
|
if (server->outqueue)
|
||||||
{
|
{
|
||||||
time_now = time (NULL);
|
time_now = time (NULL);
|
||||||
|
|
||||||
|
/* detect if system clock has been changed (now lower than before) */
|
||||||
|
if (server->last_user_message > time_now)
|
||||||
|
server->last_user_message = time_now;
|
||||||
|
|
||||||
if (time_now >= server->last_user_message +
|
if (time_now >= server->last_user_message +
|
||||||
weechat_config_integer (irc_config_network_anti_flood))
|
weechat_config_integer (irc_config_network_anti_flood))
|
||||||
{
|
{
|
||||||
@ -1347,6 +1352,11 @@ irc_server_send_one_msg (struct t_irc_server *server, const char *message)
|
|||||||
|
|
||||||
/* anti-flood: look whether we should queue outgoing message or not */
|
/* anti-flood: look whether we should queue outgoing message or not */
|
||||||
time_now = time (NULL);
|
time_now = time (NULL);
|
||||||
|
|
||||||
|
/* detect if system clock has been changed (now lower than before) */
|
||||||
|
if (server->last_user_message > time_now)
|
||||||
|
server->last_user_message = time_now;
|
||||||
|
|
||||||
queue = 0;
|
queue = 0;
|
||||||
if ((server->queue_msg)
|
if ((server->queue_msg)
|
||||||
&& ((server->outqueue)
|
&& ((server->outqueue)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user