mirror of
https://github.com/irssi/irssi.git
synced 2025-04-26 13:01:11 -05:00
Lag checking fixes - should work fine again.
git-svn-id: http://svn.irssi.org/repos/irssi/trunk@2016 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
parent
4d771c54d9
commit
c6302cd6e7
@ -33,7 +33,7 @@ unsigned int usermode_away:1;
|
|||||||
unsigned int banned:1; /* not allowed to connect to this server */
|
unsigned int banned:1; /* not allowed to connect to this server */
|
||||||
unsigned int dns_error:1; /* DNS said the host doesn't exist */
|
unsigned int dns_error:1; /* DNS said the host doesn't exist */
|
||||||
|
|
||||||
time_t lag_sent; /* 0 or time when last lag query was sent to server */
|
GTimeVal lag_sent; /* 0 or time when last lag query was sent to server */
|
||||||
time_t lag_last_check; /* last time we checked lag */
|
time_t lag_last_check; /* last time we checked lag */
|
||||||
int lag; /* server lag in milliseconds */
|
int lag; /* server lag in milliseconds */
|
||||||
|
|
||||||
|
@ -287,7 +287,8 @@ static void sig_server_lag_disconnected(SERVER_REC *server)
|
|||||||
g_return_if_fail(server != NULL);
|
g_return_if_fail(server != NULL);
|
||||||
|
|
||||||
printformat(server, NULL, MSGLEVEL_CLIENTNOTICE,
|
printformat(server, NULL, MSGLEVEL_CLIENTNOTICE,
|
||||||
TXT_LAG_DISCONNECTED, server->connrec->address, time(NULL)-server->lag_sent);
|
TXT_LAG_DISCONNECTED, server->connrec->address,
|
||||||
|
time(NULL)-server->lag_sent.tv_sec);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sig_server_reconnect_removed(RECONNECT_REC *reconnect)
|
static void sig_server_reconnect_removed(RECONNECT_REC *reconnect)
|
||||||
|
@ -89,7 +89,7 @@ static void item_lag(SBAR_ITEM_REC *item, int get_size_only)
|
|||||||
str = g_string_new(NULL);
|
str = g_string_new(NULL);
|
||||||
|
|
||||||
/* FIXME: ugly ugly.. */
|
/* FIXME: ugly ugly.. */
|
||||||
if (server->lag_sent == 0 || now-server->lag_sent < 5) {
|
if (server->lag_sent.tv_sec == 0 || now-server->lag_sent.tv_sec < 5) {
|
||||||
lag_unknown = now-server->lag_last_check >
|
lag_unknown = now-server->lag_last_check >
|
||||||
MAX_LAG_UNKNOWN_TIME+settings_get_int("lag_check_time");
|
MAX_LAG_UNKNOWN_TIME+settings_get_int("lag_check_time");
|
||||||
lag_min_show = settings_get_int("lag_min_show")*10;
|
lag_min_show = settings_get_int("lag_min_show")*10;
|
||||||
@ -105,7 +105,7 @@ static void item_lag(SBAR_ITEM_REC *item, int get_size_only)
|
|||||||
} else {
|
} else {
|
||||||
/* big lag, still waiting .. */
|
/* big lag, still waiting .. */
|
||||||
g_string_sprintfa(str, "%ld (?""?)",
|
g_string_sprintfa(str, "%ld (?""?)",
|
||||||
(long) (now-server->lag_sent));
|
(long) (now-server->lag_sent.tv_sec));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (str->len != 0) {
|
if (str->len != 0) {
|
||||||
|
@ -26,94 +26,42 @@
|
|||||||
#include "irc-servers.h"
|
#include "irc-servers.h"
|
||||||
#include "servers-redirect.h"
|
#include "servers-redirect.h"
|
||||||
|
|
||||||
typedef struct {
|
static int timeout_tag;
|
||||||
IRC_SERVER_REC *server;
|
|
||||||
GTimeVal time;
|
|
||||||
} LAG_REC;
|
|
||||||
|
|
||||||
static gint timeout_tag;
|
static void lag_get(IRC_SERVER_REC *server)
|
||||||
static GSList *lags;
|
|
||||||
|
|
||||||
static LAG_REC *lag_find(IRC_SERVER_REC *server)
|
|
||||||
{
|
{
|
||||||
GSList *tmp;
|
g_get_current_time(&server->lag_sent);
|
||||||
|
server->lag_last_check = time(NULL);
|
||||||
|
|
||||||
for (tmp = lags; tmp != NULL; tmp = tmp->next) {
|
|
||||||
LAG_REC *lag = tmp->data;
|
|
||||||
|
|
||||||
if (lag->server == server)
|
|
||||||
return lag;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void lag_free(LAG_REC *rec)
|
|
||||||
{
|
|
||||||
lags = g_slist_remove(lags, rec);
|
|
||||||
g_free(rec);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void lag_send(LAG_REC *lag)
|
|
||||||
{
|
|
||||||
IRC_SERVER_REC *server;
|
|
||||||
|
|
||||||
g_get_current_time(&lag->time);
|
|
||||||
|
|
||||||
server = lag->server;
|
|
||||||
server->lag_sent = server->lag_last_check = time(NULL);
|
|
||||||
server_redirect_event(server, "ping", 1, NULL, FALSE,
|
server_redirect_event(server, "ping", 1, NULL, FALSE,
|
||||||
"lag ping error",
|
"lag ping error",
|
||||||
"event pong", "lag pong", NULL);
|
"event pong", "lag pong", NULL);
|
||||||
irc_send_cmdv(server, "PING %s", server->real_address);
|
irc_send_cmdv(server, "PING %s", server->real_address);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void lag_get(IRC_SERVER_REC *server)
|
|
||||||
{
|
|
||||||
LAG_REC *lag;
|
|
||||||
|
|
||||||
g_return_if_fail(server != NULL);
|
|
||||||
|
|
||||||
/* nick changes may fail this check, so we should never do this
|
|
||||||
while there's nick change request waiting for reply in server.. */
|
|
||||||
lag = g_new0(LAG_REC, 1);
|
|
||||||
lags = g_slist_append(lags, lag);
|
|
||||||
lag->server = server;
|
|
||||||
|
|
||||||
lag_send(lag);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* we didn't receive PONG for some reason .. try again */
|
/* we didn't receive PONG for some reason .. try again */
|
||||||
static void lag_ping_error(IRC_SERVER_REC *server)
|
static void lag_ping_error(IRC_SERVER_REC *server)
|
||||||
{
|
{
|
||||||
LAG_REC *lag;
|
lag_get(server);
|
||||||
|
|
||||||
lag = lag_find(server);
|
|
||||||
if (lag != NULL)
|
|
||||||
lag_send(lag);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void lag_event_pong(IRC_SERVER_REC *server, const char *data,
|
static void lag_event_pong(IRC_SERVER_REC *server, const char *data,
|
||||||
const char *nick, const char *addr)
|
const char *nick, const char *addr)
|
||||||
{
|
{
|
||||||
GTimeVal now;
|
GTimeVal now;
|
||||||
LAG_REC *lag;
|
|
||||||
|
|
||||||
g_return_if_fail(data != NULL);
|
g_return_if_fail(data != NULL);
|
||||||
|
|
||||||
lag = lag_find(server);
|
if (server->lag_sent.tv_sec == 0) {
|
||||||
if (lag == NULL) {
|
|
||||||
/* not expecting lag reply.. */
|
/* not expecting lag reply.. */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
server->lag_sent = 0;
|
|
||||||
|
|
||||||
g_get_current_time(&now);
|
g_get_current_time(&now);
|
||||||
server->lag = (int) get_timeval_diff(&now, &lag->time);
|
server->lag = (int) get_timeval_diff(&now, &server->lag_sent);
|
||||||
signal_emit("server lag", 1, server);
|
memset(&server->lag_sent, 0, sizeof(server->lag_sent));
|
||||||
|
|
||||||
lag_free(lag);
|
signal_emit("server lag", 1, server);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sig_check_lag(void)
|
static int sig_check_lag(void)
|
||||||
@ -136,9 +84,9 @@ static int sig_check_lag(void)
|
|||||||
if (!IS_IRC_SERVER(rec))
|
if (!IS_IRC_SERVER(rec))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (rec->lag_sent != 0) {
|
if (rec->lag_sent.tv_sec != 0) {
|
||||||
/* waiting for lag reply */
|
/* waiting for lag reply */
|
||||||
if (max_lag > 1 && now-rec->lag_sent > max_lag) {
|
if (max_lag > 1 && now-rec->lag_sent.tv_sec > max_lag) {
|
||||||
/* too much lag, disconnect */
|
/* too much lag, disconnect */
|
||||||
signal_emit("server lag disconnect", 1, rec);
|
signal_emit("server lag disconnect", 1, rec);
|
||||||
rec->connection_lost = TRUE;
|
rec->connection_lost = TRUE;
|
||||||
@ -159,7 +107,6 @@ void lag_init(void)
|
|||||||
settings_add_int("misc", "lag_check_time", 30);
|
settings_add_int("misc", "lag_check_time", 30);
|
||||||
settings_add_int("misc", "lag_max_before_disconnect", 300);
|
settings_add_int("misc", "lag_max_before_disconnect", 300);
|
||||||
|
|
||||||
lags = NULL;
|
|
||||||
timeout_tag = g_timeout_add(1000, (GSourceFunc) sig_check_lag, NULL);
|
timeout_tag = g_timeout_add(1000, (GSourceFunc) sig_check_lag, NULL);
|
||||||
signal_add_first("lag pong", (SIGNAL_FUNC) lag_event_pong);
|
signal_add_first("lag pong", (SIGNAL_FUNC) lag_event_pong);
|
||||||
signal_add("lag ping error", (SIGNAL_FUNC) lag_ping_error);
|
signal_add("lag ping error", (SIGNAL_FUNC) lag_ping_error);
|
||||||
@ -168,8 +115,6 @@ void lag_init(void)
|
|||||||
void lag_deinit(void)
|
void lag_deinit(void)
|
||||||
{
|
{
|
||||||
g_source_remove(timeout_tag);
|
g_source_remove(timeout_tag);
|
||||||
while (lags != NULL)
|
|
||||||
lag_free(lags->data);
|
|
||||||
signal_remove("lag pong", (SIGNAL_FUNC) lag_event_pong);
|
signal_remove("lag pong", (SIGNAL_FUNC) lag_event_pong);
|
||||||
signal_remove("lag ping error", (SIGNAL_FUNC) lag_ping_error);
|
signal_remove("lag ping error", (SIGNAL_FUNC) lag_ping_error);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user