replay-events.c (60618e2d77691e44bb78e23b2b0cf07b5c405e56) | replay-events.c (3e21408b0596aa2babe1e26996a15e7ad5eee71a) |
---|---|
1/* 2 * replay-events.c 3 * 4 * Copyright (c) 2010-2015 Institute for System Programming 5 * of the Russian Academy of Sciences. 6 * 7 * This work is licensed under the terms of the GNU GPL, version 2 or later. 8 * See the COPYING file in the top-level directory. --- 160 unchanged lines hidden (view full) --- 169 qemu_bh_schedule(bh); 170 } 171} 172 173static void replay_save_event(Event *event) 174{ 175 if (replay_mode != REPLAY_MODE_PLAY) { 176 /* put the event into the file */ | 1/* 2 * replay-events.c 3 * 4 * Copyright (c) 2010-2015 Institute for System Programming 5 * of the Russian Academy of Sciences. 6 * 7 * This work is licensed under the terms of the GNU GPL, version 2 or later. 8 * See the COPYING file in the top-level directory. --- 160 unchanged lines hidden (view full) --- 169 qemu_bh_schedule(bh); 170 } 171} 172 173static void replay_save_event(Event *event) 174{ 175 if (replay_mode != REPLAY_MODE_PLAY) { 176 /* put the event into the file */ |
177 replay_put_event(EVENT_ASYNC); 178 replay_put_byte(event->event_kind); | 177 g_assert(event->event_kind < REPLAY_ASYNC_COUNT); 178 replay_put_event(EVENT_ASYNC + event->event_kind); |
179 180 /* save event-specific data */ 181 switch (event->event_kind) { 182 case REPLAY_ASYNC_EVENT_BH: 183 case REPLAY_ASYNC_EVENT_BH_ONESHOT: 184 replay_put_qword(event->id); 185 break; 186 case REPLAY_ASYNC_EVENT_INPUT: --- 28 unchanged lines hidden (view full) --- 215 QTAILQ_REMOVE(&events_list, event, events); 216 g_free(event); 217 } 218} 219 220static Event *replay_read_event(void) 221{ 222 Event *event; | 179 180 /* save event-specific data */ 181 switch (event->event_kind) { 182 case REPLAY_ASYNC_EVENT_BH: 183 case REPLAY_ASYNC_EVENT_BH_ONESHOT: 184 replay_put_qword(event->id); 185 break; 186 case REPLAY_ASYNC_EVENT_INPUT: --- 28 unchanged lines hidden (view full) --- 215 QTAILQ_REMOVE(&events_list, event, events); 216 g_free(event); 217 } 218} 219 220static Event *replay_read_event(void) 221{ 222 Event *event; |
223 if (replay_state.read_event_kind == -1) { 224 replay_state.read_event_kind = replay_get_byte(); 225 replay_state.read_event_id = -1; 226 replay_check_error(); 227 } | 223 ReplayAsyncEventKind event_kind = replay_state.data_kind - EVENT_ASYNC; |
228 229 /* Events that has not to be in the queue */ | 224 225 /* Events that has not to be in the queue */ |
230 switch (replay_state.read_event_kind) { | 226 switch (event_kind) { |
231 case REPLAY_ASYNC_EVENT_BH: 232 case REPLAY_ASYNC_EVENT_BH_ONESHOT: 233 if (replay_state.read_event_id == -1) { 234 replay_state.read_event_id = replay_get_qword(); 235 } 236 break; 237 case REPLAY_ASYNC_EVENT_INPUT: 238 event = g_new0(Event, 1); | 227 case REPLAY_ASYNC_EVENT_BH: 228 case REPLAY_ASYNC_EVENT_BH_ONESHOT: 229 if (replay_state.read_event_id == -1) { 230 replay_state.read_event_id = replay_get_qword(); 231 } 232 break; 233 case REPLAY_ASYNC_EVENT_INPUT: 234 event = g_new0(Event, 1); |
239 event->event_kind = replay_state.read_event_kind; | 235 event->event_kind = event_kind; |
240 event->opaque = replay_read_input_event(); 241 return event; 242 case REPLAY_ASYNC_EVENT_INPUT_SYNC: 243 event = g_new0(Event, 1); | 236 event->opaque = replay_read_input_event(); 237 return event; 238 case REPLAY_ASYNC_EVENT_INPUT_SYNC: 239 event = g_new0(Event, 1); |
244 event->event_kind = replay_state.read_event_kind; | 240 event->event_kind = event_kind; |
245 event->opaque = 0; 246 return event; 247 case REPLAY_ASYNC_EVENT_CHAR_READ: 248 event = g_new0(Event, 1); | 241 event->opaque = 0; 242 return event; 243 case REPLAY_ASYNC_EVENT_CHAR_READ: 244 event = g_new0(Event, 1); |
249 event->event_kind = replay_state.read_event_kind; | 245 event->event_kind = event_kind; |
250 event->opaque = replay_event_char_read_load(); 251 return event; 252 case REPLAY_ASYNC_EVENT_BLOCK: 253 if (replay_state.read_event_id == -1) { 254 replay_state.read_event_id = replay_get_qword(); 255 } 256 break; 257 case REPLAY_ASYNC_EVENT_NET: 258 event = g_new0(Event, 1); | 246 event->opaque = replay_event_char_read_load(); 247 return event; 248 case REPLAY_ASYNC_EVENT_BLOCK: 249 if (replay_state.read_event_id == -1) { 250 replay_state.read_event_id = replay_get_qword(); 251 } 252 break; 253 case REPLAY_ASYNC_EVENT_NET: 254 event = g_new0(Event, 1); |
259 event->event_kind = replay_state.read_event_kind; | 255 event->event_kind = event_kind; |
260 event->opaque = replay_event_net_load(); 261 return event; 262 default: | 256 event->opaque = replay_event_net_load(); 257 return event; 258 default: |
263 error_report("Unknown ID %d of replay event", 264 replay_state.read_event_kind); | 259 error_report("Unknown ID %d of replay event", event_kind); |
265 exit(1); 266 break; 267 } 268 269 QTAILQ_FOREACH(event, &events_list, events) { | 260 exit(1); 261 break; 262 } 263 264 QTAILQ_FOREACH(event, &events_list, events) { |
270 if (event->event_kind == replay_state.read_event_kind | 265 if (event->event_kind == event_kind |
271 && (replay_state.read_event_id == -1 272 || replay_state.read_event_id == event->id)) { 273 break; 274 } 275 } 276 277 if (event) { 278 QTAILQ_REMOVE(&events_list, event, events); | 266 && (replay_state.read_event_id == -1 267 || replay_state.read_event_id == event->id)) { 268 break; 269 } 270 } 271 272 if (event) { 273 QTAILQ_REMOVE(&events_list, event, events); |
279 } else { 280 return NULL; | |
281 } 282 | 274 } 275 |
283 /* Read event-specific data */ 284 | |
285 return event; 286} 287 288/* Called with replay mutex locked */ 289void replay_read_events(void) 290{ 291 g_assert(replay_mutex_locked()); | 276 return event; 277} 278 279/* Called with replay mutex locked */ 280void replay_read_events(void) 281{ 282 g_assert(replay_mutex_locked()); |
292 while (replay_state.data_kind == EVENT_ASYNC) { | 283 while (replay_state.data_kind >= EVENT_ASYNC 284 && replay_state.data_kind <= EVENT_ASYNC_LAST) { |
293 Event *event = replay_read_event(); 294 if (!event) { 295 break; 296 } 297 replay_finish_event(); | 285 Event *event = replay_read_event(); 286 if (!event) { 287 break; 288 } 289 replay_finish_event(); |
298 replay_state.read_event_kind = -1; | 290 replay_state.read_event_id = -1; |
299 replay_run_event(event); 300 301 g_free(event); 302 } 303} 304 305void replay_init_events(void) 306{ | 291 replay_run_event(event); 292 293 g_free(event); 294 } 295} 296 297void replay_init_events(void) 298{ |
307 replay_state.read_event_kind = -1; | 299 replay_state.read_event_id = -1; |
308} 309 310void replay_finish_events(void) 311{ 312 events_enabled = false; 313 replay_flush_events(); 314} 315 --- 12 unchanged lines hidden --- | 300} 301 302void replay_finish_events(void) 303{ 304 events_enabled = false; 305 replay_flush_events(); 306} 307 --- 12 unchanged lines hidden --- |