|
@@ -138,6 +138,16 @@ channel_outbuf_length(channel_t *chan)
|
|
|
return len;
|
|
|
}
|
|
|
|
|
|
+static int
|
|
|
+each_channel_update_outbuf(outbuf_table_ent_t *ent, void *data)
|
|
|
+{
|
|
|
+ (void) data;
|
|
|
+ connection_t *conn = TO_CONN(BASE_CHAN_TO_TLS(ent->chan)->conn);
|
|
|
+ tor_assert(conn->safe_conn != NULL);
|
|
|
+ safe_connection_start_caring_about_modified(conn->safe_conn);
|
|
|
+ safe_connection_outbuf_modified(conn->safe_conn);
|
|
|
+}
|
|
|
+
|
|
|
/* Little helper function for HT_FOREACH_FN. */
|
|
|
static int
|
|
|
each_channel_write_to_kernel(outbuf_table_ent_t *ent, void *data)
|
|
@@ -622,16 +632,20 @@ kist_scheduler_run(void)
|
|
|
}
|
|
|
outbuf_table_add(&outbuf_table, chan);
|
|
|
|
|
|
+ connection_t *conn = TO_CONN(BASE_CHAN_TO_TLS(chan)->conn);
|
|
|
+ tor_assert(conn->safe_conn != NULL);
|
|
|
+ safe_connection_stop_caring_about_modified(conn->safe_conn);
|
|
|
+
|
|
|
/* if we have switched to a new channel, consider writing the previous
|
|
|
* channel's outbuf to the kernel. */
|
|
|
if (!prev_chan) {
|
|
|
prev_chan = chan;
|
|
|
}
|
|
|
if (prev_chan != chan) {
|
|
|
- if (channel_should_write_to_kernel(&outbuf_table, prev_chan)) {
|
|
|
- //channel_write_to_kernel(prev_chan);
|
|
|
- outbuf_table_remove(&outbuf_table, prev_chan);
|
|
|
- }
|
|
|
+ //if (channel_should_write_to_kernel(&outbuf_table, prev_chan)) {
|
|
|
+ // channel_write_to_kernel(prev_chan);
|
|
|
+ // outbuf_table_remove(&outbuf_table, prev_chan);
|
|
|
+ //}
|
|
|
prev_chan = chan;
|
|
|
}
|
|
|
|
|
@@ -732,6 +746,8 @@ kist_scheduler_run(void)
|
|
|
/* Write the outbuf of any channels that still have data */
|
|
|
//HT_FOREACH_FN(outbuf_table_s, &outbuf_table, each_channel_write_to_kernel,
|
|
|
// NULL);
|
|
|
+ HT_FOREACH_FN(outbuf_table_s, &outbuf_table, each_channel_update_outbuf,
|
|
|
+ NULL);
|
|
|
/* We are done with it. */
|
|
|
HT_FOREACH_FN(outbuf_table_s, &outbuf_table, free_outbuf_info_by_ent, NULL);
|
|
|
HT_CLEAR(outbuf_table_s, &outbuf_table);
|