Mercurial > pidgin
changeset 259:e159ba2486fc
[gaim-migrate @ 269]
Got rid of aim_select but it still uses 100% of the CPU.
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Wed, 24 May 2000 19:12:50 +0000 |
parents | 1eeece1c7b7b |
children | 325d9804df10 |
files | libfaim/CHANGES.gaim src/oscar.c |
diffstat | 2 files changed, 35 insertions(+), 31 deletions(-) [+] |
line wrap: on
line diff
--- a/libfaim/CHANGES.gaim Wed May 24 10:07:01 2000 +0000 +++ b/libfaim/CHANGES.gaim Wed May 24 19:12:50 2000 +0000 @@ -1,3 +1,9 @@ + +Wed May 24 19:10:19 UTC 2000 EWarmenhoven + - Got rid of aim_select. Good. But it still uses 100% of the CPU. Bad. + The reason is because oscar_callback gets called whenever there's + data waiting on the file descriptor, and it always thinks there's + data waiting, even when we've already dealt with the data. Wed May 24 05:20:31 UTC 2000 EWarmenhoven - Inviting someone is possible now (I hope - I haven't been able to get
--- a/src/oscar.c Wed May 24 10:07:01 2000 +0000 +++ b/src/oscar.c Wed May 24 19:12:50 2000 +0000 @@ -58,47 +58,45 @@ static int gaim_chat_info_update (struct aim_session_t *, struct command_rx_struct *, ...); static int gaim_chat_incoming_msg(struct aim_session_t *, struct command_rx_struct *, ...); -/* FIXME ! This uses 100% of the CPU, guaranteed. We shouldn't be using - * aim_select at all. we should be using the gtk/gdk watcher functions */ +/* FIXME ! This uses 100% of the CPU, guaranteed. It's not using aim_select + * anymore, which is a good thing, but gdk still thinks there's always data + * to be read, even though aim_get_command and aim_rxdispatch have already + * taken care of the data that there was. So, it constantly calls this, and + * it acts basically like an infinite loop that actually does some work, and + * eats all of your CPU. + */ static void oscar_callback(gpointer data, gint source, GdkInputCondition condition) { struct aim_session_t *sess = (struct aim_session_t *)data; - struct aim_conn_t *conn = NULL; - struct timeval tv; - int selstat; - tv.tv_sec = 0; tv.tv_usec = 0; - conn = aim_select(sess, &tv, &selstat); - - switch(selstat) { - case -1: /* error */ + if (condition & GDK_INPUT_EXCEPTION) { + signoff(); + hide_login_progress("Disconnected."); + aim_logoff(sess); + gdk_input_remove(inpa); + return; + } + if (condition & GDK_INPUT_WRITE) { + aim_tx_flushqueue(sess); + } + if (condition & GDK_INPUT_READ) { + if (aim_get_command(sess, gaim_conn) < 0) { + debug_print("connection error!\n"); signoff(); hide_login_progress("Disconnected."); aim_logoff(sess); gdk_input_remove(inpa); - break; - case 0: + } else { + aim_rxdispatch(sess); + /* the rest of this is a bad hack to try and get it to + * update the display at least occasionally */ gdk_input_remove(inpa); while (gtk_events_pending()) gtk_main_iteration(); inpa = gdk_input_add(gaim_conn->fd, - GDK_INPUT_READ | GDK_INPUT_WRITE | - GDK_INPUT_EXCEPTION, - oscar_callback, sess); - break; - case 1: /* outgoing data pending */ - aim_tx_flushqueue(sess); - break; - case 2: /* incoming data pending */ - if (aim_get_command(sess, conn) < 0) { - debug_print("connection error!\n"); - signoff(); - hide_login_progress("Disconnected."); - aim_logoff(sess); - gdk_input_remove(inpa); - } else - aim_rxdispatch(sess); - break; + GDK_INPUT_READ | GDK_INPUT_WRITE | GDK_INPUT_EXCEPTION, + oscar_callback, sess); + } } } @@ -153,8 +151,8 @@ gaim_conn = conn; inpa = gdk_input_add(conn->fd, - GDK_INPUT_READ | GDK_INPUT_EXCEPTION, - oscar_callback, sess); + GDK_INPUT_READ | GDK_INPUT_WRITE | GDK_INPUT_EXCEPTION, + oscar_callback, sess); u = find_user(username);