mirror of
https://github.com/irssi/irssi.git
synced 2026-08-11 04:43:34 +02:00
Implemented network transmit buffer. If all data couldn't be sent
immediately, it's sent after a small timeout. This cleans up some code with IRC command sending. git-svn-id: http://svn.irssi.org/repos/irssi/trunk@478 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
parent
c6f949ef6f
commit
ee226421f1
8 changed files with 238 additions and 49 deletions
|
|
@ -21,6 +21,7 @@
|
|||
#include "module.h"
|
||||
|
||||
#include "net-nonblock.h"
|
||||
#include "net-sendbuffer.h"
|
||||
#include "line-split.h"
|
||||
#include "signals.h"
|
||||
#include "modules.h"
|
||||
|
|
@ -208,16 +209,17 @@ static void sig_disconnected(IRC_SERVER_REC *server)
|
|||
g_slist_foreach(server->cmdqueue, (GFunc) g_free, NULL);
|
||||
g_slist_free(server->cmdqueue);
|
||||
|
||||
if (server->handle != -1) {
|
||||
if (server->handle != NULL) {
|
||||
if (!chans || server->connection_lost)
|
||||
net_disconnect(server->handle);
|
||||
net_sendbuffer_destroy(server->handle, TRUE);
|
||||
else {
|
||||
/* we were on some channels, try to let the server
|
||||
disconnect so that our quit message is guaranteed
|
||||
to get displayed */
|
||||
net_disconnect_later(server->handle);
|
||||
net_disconnect_later(net_sendbuffer_handle(server->handle));
|
||||
net_sendbuffer_destroy(server->handle, FALSE);
|
||||
}
|
||||
server->handle = -1;
|
||||
server->handle = NULL;
|
||||
}
|
||||
|
||||
irc_server_connect_free(server->connrec);
|
||||
|
|
@ -239,7 +241,7 @@ static void server_cmd_timeout(IRC_SERVER_REC *server, GTimeVal *now)
|
|||
{
|
||||
long usecs;
|
||||
char *cmd;
|
||||
int len, ret, add_rawlog;
|
||||
int len, add_rawlog;
|
||||
|
||||
if (!irc_server_check(server))
|
||||
return;
|
||||
|
|
@ -262,22 +264,16 @@ static void server_cmd_timeout(IRC_SERVER_REC *server, GTimeVal *now)
|
|||
|
||||
add_rawlog = !server->cmd_last_split;
|
||||
|
||||
ret = net_transmit(server->handle, cmd, len);
|
||||
if (ret != len) {
|
||||
/* we didn't transmit all data, try again a bit later.. */
|
||||
if (ret > 0) {
|
||||
cmd = g_strdup((char *) (server->cmdqueue->data) + ret);
|
||||
g_free(server->cmdqueue->data);
|
||||
server->cmdqueue->data = cmd;
|
||||
}
|
||||
server->cmd_last_split = TRUE;
|
||||
server->cmdcount++;
|
||||
} else {
|
||||
memcpy(&server->last_cmd, now, sizeof(GTimeVal));
|
||||
if (server->cmd_last_split)
|
||||
server->cmd_last_split = FALSE;
|
||||
if (net_sendbuffer_send(server->handle, cmd, len) == -1) {
|
||||
/* something bad happened */
|
||||
g_warning("net_sendbuffer_send() failed: %s", g_strerror(errno));
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy(&server->last_cmd, now, sizeof(GTimeVal));
|
||||
if (server->cmd_last_split)
|
||||
server->cmd_last_split = FALSE;
|
||||
|
||||
if (add_rawlog) {
|
||||
/* add to rawlog without CR+LF */
|
||||
int slen;
|
||||
|
|
@ -288,11 +284,9 @@ static void server_cmd_timeout(IRC_SERVER_REC *server, GTimeVal *now)
|
|||
cmd[slen-2] = '\r';
|
||||
}
|
||||
|
||||
if (ret == len) {
|
||||
/* remove from queue */
|
||||
g_free(cmd);
|
||||
server->cmdqueue = g_slist_remove(server->cmdqueue, cmd);
|
||||
}
|
||||
/* remove from queue */
|
||||
g_free(cmd);
|
||||
server->cmdqueue = g_slist_remove(server->cmdqueue, cmd);
|
||||
}
|
||||
|
||||
/* check every now and then if there's data to be sent in command buffer */
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
#include "module.h"
|
||||
#include "modules.h"
|
||||
#include "network.h"
|
||||
#include "net-sendbuffer.h"
|
||||
#include "line-split.h"
|
||||
#include "rawlog.h"
|
||||
|
||||
|
|
@ -38,7 +39,7 @@ static int signal_server_incoming;
|
|||
static void cmd_send(IRC_SERVER_REC *server, const char *cmd, int send_now, int immediate)
|
||||
{
|
||||
char str[513], *ptr;
|
||||
int len, ret;
|
||||
int len;
|
||||
|
||||
server->cmdcount++;
|
||||
|
||||
|
|
@ -53,25 +54,22 @@ static void cmd_send(IRC_SERVER_REC *server, const char *cmd, int send_now, int
|
|||
|
||||
ptr = str;
|
||||
if (send_now) {
|
||||
ret = net_transmit(server->handle, str, len);
|
||||
if (ret == len) {
|
||||
g_get_current_time(&server->last_cmd);
|
||||
return;
|
||||
if (net_sendbuffer_send(server->handle, str, len) == -1) {
|
||||
/* something bad happened */
|
||||
g_warning("net_sendbuffer_send() failed: %s",
|
||||
g_strerror(errno));
|
||||
}
|
||||
|
||||
/* we didn't transmit all data, try again a bit later.. */
|
||||
ptr += ret;
|
||||
server->cmd_last_split = TRUE;
|
||||
g_get_current_time(&server->last_cmd);
|
||||
return;
|
||||
}
|
||||
|
||||
/* add to queue */
|
||||
ptr = g_strdup(ptr);
|
||||
if (!immediate)
|
||||
server->cmdqueue = g_slist_append(server->cmdqueue, ptr);
|
||||
else if (send_now)
|
||||
server->cmdqueue = g_slist_prepend(server->cmdqueue, ptr);
|
||||
else
|
||||
server->cmdqueue = g_slist_insert(server->cmdqueue, ptr, 1);
|
||||
server->cmdqueue = g_slist_prepend(server->cmdqueue, ptr);
|
||||
}
|
||||
|
||||
/* Send command to IRC server */
|
||||
|
|
@ -280,7 +278,8 @@ static int irc_receive_line(SERVER_REC *server, char **str)
|
|||
g_return_val_if_fail(server != NULL, -1);
|
||||
g_return_val_if_fail(str != NULL, -1);
|
||||
|
||||
recvlen = net_receive(server->handle, tmpbuf, sizeof(tmpbuf));
|
||||
recvlen = net_receive(net_sendbuffer_handle(server->handle),
|
||||
tmpbuf, sizeof(tmpbuf));
|
||||
|
||||
ret = line_split(tmpbuf, recvlen, str, (LINEBUF_REC **) &server->buffer);
|
||||
if (ret == -1) {
|
||||
|
|
@ -346,7 +345,8 @@ static void irc_init_server(IRC_SERVER_REC *server)
|
|||
g_return_if_fail(server != NULL);
|
||||
|
||||
server->readtag =
|
||||
g_input_add(server->handle, G_INPUT_READ,
|
||||
g_input_add(net_sendbuffer_handle(server->handle),
|
||||
G_INPUT_READ,
|
||||
(GInputFunction) irc_parse_incoming, server);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue