Mercurial > pidgin
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 |