comparison libpurple/ft.c @ 28911:a41724547756

ft: Fix ui_ops->ui_read being called too often (when it's not ready). Also fix a deadlock case stemming from that, where ui_read() returns 0, but when it next calls purple_xfer_ui_ready(), libpurple doesn't think the prpl is ready.
author Paul Aurich <paul@darkrain42.org>
date Tue, 26 Jan 2010 19:26:36 +0000
parents 07ec4a569da1
children 422889fb57e0
comparison
equal deleted inserted replaced
28910:708e89126ba1 28911:a41724547756
1088 } 1088 }
1089 1089
1090 if (ui_ops && ui_ops->ui_read) { 1090 if (ui_ops && ui_ops->ui_read) {
1091 gssize tmp = ui_ops->ui_read(xfer, &buffer, s); 1091 gssize tmp = ui_ops->ui_read(xfer, &buffer, s);
1092 if (tmp == 0) { 1092 if (tmp == 0) {
1093 PurpleXferPrivData *priv = g_hash_table_lookup(xfers_data, xfer);
1094
1093 /* 1095 /*
1094 * UI isn't ready to send data. It will call 1096 * The UI claimed it was ready, but didn't have any data for
1095 * purple_xfer_ui_ready when ready, which sets back up this 1097 * us... It will call purple_xfer_ui_ready when ready, which
1096 * watcher. 1098 * sets back up this watcher.
1097 */ 1099 */
1098 if (xfer->watcher != 0) { 1100 if (xfer->watcher != 0) {
1099 purple_input_remove(xfer->watcher); 1101 purple_input_remove(xfer->watcher);
1100 xfer->watcher = 0; 1102 xfer->watcher = 0;
1101 } 1103 }
1102 1104
1103 return; 1105 /* Need to indicate the prpl is still ready... */
1106 priv->ready |= PURPLE_XFER_READY_PRPL;
1107
1108 g_return_if_reached();
1104 } else if (tmp < 0) { 1109 } else if (tmp < 0) {
1105 purple_debug_error("filetransfer", "Unable to read whole buffer.\n"); 1110 purple_debug_error("filetransfer", "Unable to read whole buffer.\n");
1106 purple_xfer_cancel_local(xfer); 1111 purple_xfer_cancel_local(xfer);
1107 return; 1112 return;
1108 } 1113 }
1179 xfer->watcher = 0; 1184 xfer->watcher = 0;
1180 1185
1181 purple_debug_misc("xfer", "prpl is ready on ft %p, waiting for UI\n", xfer); 1186 purple_debug_misc("xfer", "prpl is ready on ft %p, waiting for UI\n", xfer);
1182 return; 1187 return;
1183 } 1188 }
1189
1190 priv->ready = PURPLE_XFER_READY_NONE;
1184 } 1191 }
1185 1192
1186 do_transfer(xfer); 1193 do_transfer(xfer);
1187 } 1194 }
1188 1195