From nobody Sat Oct 4 17:29:45 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1601988449; cv=none; d=zohomail.com; s=zohoarc; b=F+PJwmpfGdR1SdClhBsCc0BPMQM1b280AADIDmwtDmbXVujlv0KdZ3HjqsR9y79gCPxswqVOX2HQeZRQKVKOmOhHu+bznf7jTiGOD/gPGKZszEv/xy1a+b5HBJWIgPXDWJL1QwGusLqM/1sDx2DMGEIJHecE1+6yBNEYlvWindA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1601988449; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=bQdeGvKE5QG55F6Xtw09rPiX6SnmTi4pe0o6fJxeX8o=; b=K+vyMrew2nEofAq1EyegOAtl5NoAyQqXImPFvWbZAm5QOBLiqp43b5YZekCMA8ILOOYnn8S90IonQRD47J9RgRKjW1FqirLqra57DtTxw7RyICggUL/9Ayd1ZrcaPBXDjM+qRFuiY5zjw6/Oa+76jFghsCGnkizKMRsdEVDODLg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1601988449738637.7833331985979; Tue, 6 Oct 2020 05:47:29 -0700 (PDT) Received: from localhost ([::1]:34640 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kPmNM-0000tM-Cd for importer@patchew.org; Tue, 06 Oct 2020 08:47:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:55964) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kPmFb-000148-Sh for qemu-devel@nongnu.org; Tue, 06 Oct 2020 08:39:28 -0400 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:20667) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kPmFZ-0007u6-SC for qemu-devel@nongnu.org; Tue, 06 Oct 2020 08:39:27 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-574-Q4D3K7nbMiy0n4hCEMihxA-1; Tue, 06 Oct 2020 08:39:23 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 1FC02801FCC; Tue, 6 Oct 2020 12:39:22 +0000 (UTC) Received: from localhost.localdomain (unknown [10.35.206.84]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3F4A255767; Tue, 6 Oct 2020 12:39:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1601987965; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bQdeGvKE5QG55F6Xtw09rPiX6SnmTi4pe0o6fJxeX8o=; b=JiwUpukynTEKfz09onlopS2lMwr945NrQdhxBGX74gpt/h35p8W80uiNDEvsadV/EvzRab GgDA8py8I7lOEsilxrJaAePjJAtctQqiYWHUQzZMHWCRToy4KC/Q6rsy6WsRDRH7vrK+y9 fFLzc5m1Nbdod1WE+UeuMzJspfCZh4U= X-MC-Unique: Q4D3K7nbMiy0n4hCEMihxA-1 From: Maxim Levitsky To: qemu-devel@nongnu.org Subject: [PATCH v7 02/13] qtest: Reintroduce qtest_qmp_receive Date: Tue, 6 Oct 2020 15:38:53 +0300 Message-Id: <20201006123904.610658-3-mlevitsk@redhat.com> In-Reply-To: <20201006123904.610658-1-mlevitsk@redhat.com> References: <20201006123904.610658-1-mlevitsk@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=mlevitsk@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=mlevitsk@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/10/06 01:55:55 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.733, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Fam Zheng , Laurent Vivier , Thomas Huth , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Eduardo Habkost , qemu-block@nongnu.org, "Michael S. Tsirkin" , Jason Wang , Markus Armbruster , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Paolo Bonzini , Maxim Levitsky , John Snow , Stefan Berger Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" The new qtest_qmp_receive buffers all the received qmp events, allowing qtest_qmp_eventwait_ref to return them. This is intended to solve the race in regard to ordering of qmp events vs qmp responses, as soon as the callers start using the new interface. In addition to that, define qtest_qmp_event_ref a function which only scans the buffer that qtest_qmp_receive stores the events to. This is intended for callers that are only interested in events that were received during the last call to the qtest_qmp_receive. Suggested-by: Paolo Bonzini Signed-off-by: Maxim Levitsky --- tests/qtest/libqos/libqtest.h | 23 ++++++++++++++++ tests/qtest/libqtest.c | 49 ++++++++++++++++++++++++++++++++++- 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/tests/qtest/libqos/libqtest.h b/tests/qtest/libqos/libqtest.h index a41135fc92..19429a536d 100644 --- a/tests/qtest/libqos/libqtest.h +++ b/tests/qtest/libqos/libqtest.h @@ -198,6 +198,16 @@ void qtest_qmp_vsend(QTestState *s, const char *fmt, v= a_list ap) */ QDict *qtest_qmp_receive_dict(QTestState *s); =20 +/** + * qtest_qmp_receive: + * @s: #QTestState instance to operate on. + * + * Reads a QMP message from QEMU and returns the response. + * Buffers all the events received meanwhile, until a + * call to qtest_qmp_eventwait + */ +QDict *qtest_qmp_receive(QTestState *s); + /** * qtest_qmp_eventwait: * @s: #QTestState instance to operate on. @@ -217,6 +227,19 @@ void qtest_qmp_eventwait(QTestState *s, const char *ev= ent); */ QDict *qtest_qmp_eventwait_ref(QTestState *s, const char *event); =20 +/** + * qtest_qmp_event_ref: + * @s: #QTestState instance to operate on. + * @s: #event event to return. + * + * Removes non-matching events from the buffer that was set by + * qtest_qmp_receive, until an event bearing the given name is found, + * and returns it. + * If no event matches, clears the buffer and returns NULL. + * + */ +QDict *qtest_qmp_event_ref(QTestState *s, const char *event); + /** * qtest_qmp_receive_success: * @s: #QTestState instance to operate on diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c index dadc465825..d4c49a52ff 100644 --- a/tests/qtest/libqtest.c +++ b/tests/qtest/libqtest.c @@ -63,6 +63,7 @@ struct QTestState bool irq_level[MAX_IRQ]; GString *rx; QTestTransportOps ops; + GList *pending_events; }; =20 static GHookList abrt_hooks; @@ -279,6 +280,7 @@ QTestState *qtest_init_without_qmp_handshake(const char= *extra_args) =20 g_test_message("starting QEMU: %s", command); =20 + s->pending_events =3D NULL; s->wstatus =3D 0; s->expected_status =3D 0; s->qemu_pid =3D fork(); @@ -386,6 +388,13 @@ void qtest_quit(QTestState *s) close(s->fd); close(s->qmp_fd); g_string_free(s->rx, true); + + for (GList *it =3D s->pending_events; it !=3D NULL; it =3D it->next) { + qobject_unref((QDict *)it->data); + } + + g_list_free(s->pending_events); + g_free(s); } =20 @@ -603,6 +612,19 @@ QDict *qmp_fd_receive(int fd) return qmp.response; } =20 +QDict *qtest_qmp_receive(QTestState *s) +{ + while (true) { + QDict *response =3D qtest_qmp_receive_dict(s); + + if (!qdict_get_try_str(response, "event")) { + return response; + } + /* Stash the event for a later consumption */ + s->pending_events =3D g_list_prepend(s->pending_events, response); + } +} + QDict *qtest_qmp_receive_dict(QTestState *s) { return qmp_fd_receive(s->qmp_fd); @@ -771,10 +793,34 @@ void qtest_qmp_send_raw(QTestState *s, const char *fm= t, ...) va_end(ap); } =20 -QDict *qtest_qmp_eventwait_ref(QTestState *s, const char *event) +QDict *qtest_qmp_event_ref(QTestState *s, const char *event) { + GList *next =3D NULL; QDict *response; =20 + for (GList *it =3D s->pending_events; it !=3D NULL; it =3D next) { + + next =3D it->next; + response =3D (QDict *)it->data; + + s->pending_events =3D g_list_remove_link(s->pending_events, it); + + if (!strcmp(qdict_get_str(response, "event"), event)) { + return response; + } + qobject_unref(response); + } + return NULL; +} + +QDict *qtest_qmp_eventwait_ref(QTestState *s, const char *event) +{ + QDict *response =3D qtest_qmp_event_ref(s, event); + + if (response) { + return response; + } + for (;;) { response =3D qtest_qmp_receive_dict(s); if ((qdict_haskey(response, "event")) && @@ -1403,6 +1449,7 @@ QTestState *qtest_inproc_init(QTestState **s, bool lo= g, const char* arch, { QTestState *qts; qts =3D g_new0(QTestState, 1); + qts->pending_events =3D NULL; *s =3D qts; /* Expose qts early on, since the query endianness relies = on it */ qts->wstatus =3D 0; for (int i =3D 0; i < MAX_IRQ; i++) { --=20 2.26.2