qtest: add qtest_server_send abstraction
qtest_server_send is a function pointer specifying the handler used to transmit data to the qtest client. In the standard configuration, this calls the CharBackend handler, but now it is possible for other types of handlers, e.g direct-function calls if the qtest client and server exist within the same process (inproc) Signed-off-by: Alexander Bulekov <alxndr@bu.edu> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Darren Kenny <darren.kenny@oracle.com> Acked-by: Thomas Huth <thuth@redhat.com> Message-id: 20200220041118.23264-6-alxndr@bu.edu Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
e785e50a5e
commit
e731d083e3
@ -26,4 +26,7 @@ bool qtest_driver(void);
|
|||||||
|
|
||||||
void qtest_server_init(const char *qtest_chrdev, const char *qtest_log, Error **errp);
|
void qtest_server_init(const char *qtest_chrdev, const char *qtest_log, Error **errp);
|
||||||
|
|
||||||
|
void qtest_server_set_send_handler(void (*send)(void *, const char *),
|
||||||
|
void *opaque);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
18
qtest.c
18
qtest.c
@ -43,6 +43,8 @@ static GString *inbuf;
|
|||||||
static int irq_levels[MAX_IRQ];
|
static int irq_levels[MAX_IRQ];
|
||||||
static qemu_timeval start_time;
|
static qemu_timeval start_time;
|
||||||
static bool qtest_opened;
|
static bool qtest_opened;
|
||||||
|
static void (*qtest_server_send)(void*, const char*);
|
||||||
|
static void *qtest_server_send_opaque;
|
||||||
|
|
||||||
#define FMT_timeval "%ld.%06ld"
|
#define FMT_timeval "%ld.%06ld"
|
||||||
|
|
||||||
@ -229,8 +231,10 @@ static void GCC_FMT_ATTR(1, 2) qtest_log_send(const char *fmt, ...)
|
|||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_qtest_send(CharBackend *chr, const char *str, size_t len)
|
static void qtest_server_char_be_send(void *opaque, const char *str)
|
||||||
{
|
{
|
||||||
|
size_t len = strlen(str);
|
||||||
|
CharBackend* chr = (CharBackend *)opaque;
|
||||||
qemu_chr_fe_write_all(chr, (uint8_t *)str, len);
|
qemu_chr_fe_write_all(chr, (uint8_t *)str, len);
|
||||||
if (qtest_log_fp && qtest_opened) {
|
if (qtest_log_fp && qtest_opened) {
|
||||||
fprintf(qtest_log_fp, "%s", str);
|
fprintf(qtest_log_fp, "%s", str);
|
||||||
@ -239,7 +243,7 @@ static void do_qtest_send(CharBackend *chr, const char *str, size_t len)
|
|||||||
|
|
||||||
static void qtest_send(CharBackend *chr, const char *str)
|
static void qtest_send(CharBackend *chr, const char *str)
|
||||||
{
|
{
|
||||||
do_qtest_send(chr, str, strlen(str));
|
qtest_server_send(qtest_server_send_opaque, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void GCC_FMT_ATTR(2, 3) qtest_sendf(CharBackend *chr,
|
static void GCC_FMT_ATTR(2, 3) qtest_sendf(CharBackend *chr,
|
||||||
@ -784,6 +788,16 @@ void qtest_server_init(const char *qtest_chrdev, const char *qtest_log, Error **
|
|||||||
qemu_chr_fe_set_echo(&qtest_chr, true);
|
qemu_chr_fe_set_echo(&qtest_chr, true);
|
||||||
|
|
||||||
inbuf = g_string_new("");
|
inbuf = g_string_new("");
|
||||||
|
|
||||||
|
if (!qtest_server_send) {
|
||||||
|
qtest_server_set_send_handler(qtest_server_char_be_send, &qtest_chr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void qtest_server_set_send_handler(void (*send)(void*, const char*), void *opaque)
|
||||||
|
{
|
||||||
|
qtest_server_send = send;
|
||||||
|
qtest_server_send_opaque = opaque;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool qtest_driver(void)
|
bool qtest_driver(void)
|
||||||
|
Loading…
Reference in New Issue
Block a user