qemu-io: New command 'sleep'
There is no easy way to check that a request correctly waits for a different request. With a sleep command we can at least approximate it. Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
		
							parent
							
								
									b35ee7fb23
								
							
						
					
					
						commit
						cd33d02a10
					
				| 
						 | 
				
			
			@ -12,6 +12,7 @@
 | 
			
		|||
#include "block/block_int.h"
 | 
			
		||||
#include "block/qapi.h"
 | 
			
		||||
#include "qemu/main-loop.h"
 | 
			
		||||
#include "qemu/timer.h"
 | 
			
		||||
 | 
			
		||||
#define CMD_NOFILE_OK   0x01
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2053,6 +2054,46 @@ static const cmdinfo_t abort_cmd = {
 | 
			
		|||
       .oneline        = "simulate a program crash using abort(3)",
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void sleep_cb(void *opaque)
 | 
			
		||||
{
 | 
			
		||||
    bool *expired = opaque;
 | 
			
		||||
    *expired = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int sleep_f(BlockDriverState *bs, int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
    char *endptr;
 | 
			
		||||
    long ms;
 | 
			
		||||
    struct QEMUTimer *timer;
 | 
			
		||||
    bool expired = false;
 | 
			
		||||
 | 
			
		||||
    ms = strtol(argv[1], &endptr, 0);
 | 
			
		||||
    if (ms < 0 || *endptr != '\0') {
 | 
			
		||||
        printf("%s is not a valid number\n", argv[1]);
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    timer = timer_new_ns(QEMU_CLOCK_HOST, sleep_cb, &expired);
 | 
			
		||||
    timer_mod(timer, qemu_clock_get_ns(QEMU_CLOCK_HOST) + SCALE_MS * ms);
 | 
			
		||||
 | 
			
		||||
    while (!expired) {
 | 
			
		||||
        main_loop_wait(false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    timer_free(timer);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const cmdinfo_t sleep_cmd = {
 | 
			
		||||
       .name           = "sleep",
 | 
			
		||||
       .argmin         = 1,
 | 
			
		||||
       .argmax         = 1,
 | 
			
		||||
       .cfunc          = sleep_f,
 | 
			
		||||
       .flags          = CMD_NOFILE_OK,
 | 
			
		||||
       .oneline        = "waits for the given value in milliseconds",
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void help_oneline(const char *cmd, const cmdinfo_t *ct)
 | 
			
		||||
{
 | 
			
		||||
    if (cmd) {
 | 
			
		||||
| 
						 | 
				
			
			@ -2166,4 +2207,5 @@ static void __attribute((constructor)) init_qemuio_commands(void)
 | 
			
		|||
    qemuio_add_command(&resume_cmd);
 | 
			
		||||
    qemuio_add_command(&wait_break_cmd);
 | 
			
		||||
    qemuio_add_command(&abort_cmd);
 | 
			
		||||
    qemuio_add_command(&sleep_cmd);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue