Revision 188a4285 buffered_file.c
b/buffered_file.c | ||
---|---|---|
25 | 25 |
{ |
26 | 26 |
MigrationState *migration_state; |
27 | 27 |
QEMUFile *file; |
28 |
int freeze_output; |
|
29 | 28 |
size_t bytes_xfer; |
30 | 29 |
size_t xfer_limit; |
31 | 30 |
uint8_t *buffer; |
... | ... | |
69 | 68 |
size_t to_send = MIN(s->buffer_size - offset, s->xfer_limit - s->bytes_xfer); |
70 | 69 |
ret = migrate_fd_put_buffer(s->migration_state, s->buffer + offset, |
71 | 70 |
to_send); |
72 |
if (ret == -EAGAIN) { |
|
73 |
DPRINTF("backend not ready, freezing\n"); |
|
74 |
ret = 0; |
|
75 |
s->freeze_output = 1; |
|
76 |
break; |
|
77 |
} |
|
78 |
|
|
79 | 71 |
if (ret <= 0) { |
80 | 72 |
DPRINTF("error flushing data, %zd\n", ret); |
81 | 73 |
break; |
... | ... | |
109 | 101 |
return error; |
110 | 102 |
} |
111 | 103 |
|
112 |
DPRINTF("unfreezing output\n"); |
|
113 |
s->freeze_output = 0; |
|
114 |
|
|
115 | 104 |
if (size > 0) { |
116 | 105 |
DPRINTF("buffering %d bytes\n", size - offset); |
117 | 106 |
buffered_append(s, buf, size); |
... | ... | |
125 | 114 |
|
126 | 115 |
if (pos == 0 && size == 0) { |
127 | 116 |
DPRINTF("file is ready\n"); |
128 |
if (!s->freeze_output && s->bytes_xfer < s->xfer_limit) {
|
|
117 |
if (s->bytes_xfer < s->xfer_limit) { |
|
129 | 118 |
DPRINTF("notifying client\n"); |
130 | 119 |
migrate_fd_put_ready(s->migration_state); |
131 | 120 |
} |
... | ... | |
148 | 137 |
if (ret < 0) { |
149 | 138 |
break; |
150 | 139 |
} |
151 |
if (s->freeze_output) { |
|
152 |
ret = migrate_fd_wait_for_unfreeze(s->migration_state); |
|
153 |
if (ret < 0) { |
|
154 |
break; |
|
155 |
} |
|
156 |
} |
|
157 | 140 |
} |
158 | 141 |
|
159 | 142 |
ret2 = migrate_fd_close(s->migration_state); |
... | ... | |
187 | 170 |
if (ret) { |
188 | 171 |
return ret; |
189 | 172 |
} |
190 |
if (s->freeze_output) |
|
191 |
return 1; |
|
192 | 173 |
|
193 | 174 |
if (s->bytes_xfer > s->xfer_limit) |
194 | 175 |
return 1; |
... | ... | |
233 | 214 |
if (s->migration_state->complete) { |
234 | 215 |
break; |
235 | 216 |
} |
236 |
if (s->freeze_output) { |
|
237 |
continue; |
|
238 |
} |
|
239 | 217 |
if (current_time >= expire_time) { |
240 | 218 |
s->bytes_xfer = 0; |
241 | 219 |
expire_time = current_time + BUFFER_DELAY; |
Also available in: Unified diff