From nobody Sun Feb 8 06:05:25 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1531747532917999.3777350553981; Mon, 16 Jul 2018 06:25:32 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7A30D3086267; Mon, 16 Jul 2018 13:25:31 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 3341760BE4; Mon, 16 Jul 2018 13:25:31 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id CBBE03FA54; Mon, 16 Jul 2018 13:25:30 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w6GDOq91028184 for ; Mon, 16 Jul 2018 09:24:52 -0400 Received: by smtp.corp.redhat.com (Postfix) id 8F7C72027047; Mon, 16 Jul 2018 13:24:52 +0000 (UTC) Received: from t460.redhat.com (unknown [10.33.36.75]) by smtp.corp.redhat.com (Postfix) with ESMTP id D3E142026D65; Mon, 16 Jul 2018 13:24:51 +0000 (UTC) From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: libvir-list@redhat.com Date: Mon, 16 Jul 2018 14:24:10 +0100 Message-Id: <20180716132423.10354-25-berrange@redhat.com> In-Reply-To: <20180716132423.10354-1-berrange@redhat.com> References: <20180716132423.10354-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-loop: libvir-list@redhat.com Subject: [libvirt] [go PATCH 24/37] nwfilter: fix error reporting thread safety X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.49]); Mon, 16 Jul 2018 13:25:32 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Create wrapper functions for each nwfilter C API that accepts a virErrorPtr parameter. This avoids accessing a thread local from a goroutine which may race with other goroutines doing native API calls in the same OS thread. Signed-off-by: Daniel P. Berrang=C3=A9 --- nwfilter.go | 35 ++++++++++-------- nwfilter_wrapper.go | 88 +++++++++++++++++++++++++++++++++++++++++++++ nwfilter_wrapper.h | 33 +++++++++++++++++ 3 files changed, 142 insertions(+), 14 deletions(-) diff --git a/nwfilter.go b/nwfilter.go index 441fcca..0b55c41 100644 --- a/nwfilter.go +++ b/nwfilter.go @@ -43,36 +43,40 @@ type NWFilter struct { =20 // See also https://libvirt.org/html/libvirt-libvirt-nwfilter.html#virNWFi= lterFree func (f *NWFilter) Free() error { - ret :=3D C.virNWFilterFree(f.ptr) + var err C.virError + ret :=3D C.virNWFilterFreeWrapper(f.ptr, &err) if ret =3D=3D -1 { - return GetLastError() + return makeError(&err) } return nil } =20 // See also https://libvirt.org/html/libvirt-libvirt-nwfilter.html#virNWFi= lterRef func (c *NWFilter) Ref() error { - ret :=3D C.virNWFilterRef(c.ptr) + var err C.virError + ret :=3D C.virNWFilterRefWrapper(c.ptr, &err) if ret =3D=3D -1 { - return GetLastError() + return makeError(&err) } return nil } =20 // See also https://libvirt.org/html/libvirt-libvirt-nwfilter.html#virNWFi= lterGetName func (f *NWFilter) GetName() (string, error) { - name :=3D C.virNWFilterGetName(f.ptr) + var err C.virError + name :=3D C.virNWFilterGetNameWrapper(f.ptr, &err) if name =3D=3D nil { - return "", GetLastError() + return "", makeError(&err) } return C.GoString(name), nil } =20 // See also https://libvirt.org/html/libvirt-libvirt-nwfilter.html#virNWFi= lterUndefine func (f *NWFilter) Undefine() error { - result :=3D C.virNWFilterUndefine(f.ptr) + var err C.virError + result :=3D C.virNWFilterUndefineWrapper(f.ptr, &err) if result =3D=3D -1 { - return GetLastError() + return makeError(&err) } return nil } @@ -81,9 +85,10 @@ func (f *NWFilter) Undefine() error { func (f *NWFilter) GetUUID() ([]byte, error) { var cUuid [C.VIR_UUID_BUFLEN](byte) cuidPtr :=3D unsafe.Pointer(&cUuid) - result :=3D C.virNWFilterGetUUID(f.ptr, (*C.uchar)(cuidPtr)) + var err C.virError + result :=3D C.virNWFilterGetUUIDWrapper(f.ptr, (*C.uchar)(cuidPtr), &err) if result !=3D 0 { - return []byte{}, GetLastError() + return []byte{}, makeError(&err) } return C.GoBytes(cuidPtr, C.VIR_UUID_BUFLEN), nil } @@ -92,18 +97,20 @@ func (f *NWFilter) GetUUID() ([]byte, error) { func (f *NWFilter) GetUUIDString() (string, error) { var cUuid [C.VIR_UUID_STRING_BUFLEN](C.char) cuidPtr :=3D unsafe.Pointer(&cUuid) - result :=3D C.virNWFilterGetUUIDString(f.ptr, (*C.char)(cuidPtr)) + var err C.virError + result :=3D C.virNWFilterGetUUIDStringWrapper(f.ptr, (*C.char)(cuidPtr), = &err) if result !=3D 0 { - return "", GetLastError() + return "", makeError(&err) } return C.GoString((*C.char)(cuidPtr)), nil } =20 // See also https://libvirt.org/html/libvirt-libvirt-nwfilter.html#virNWFi= lterGetXMLDesc func (f *NWFilter) GetXMLDesc(flags uint32) (string, error) { - result :=3D C.virNWFilterGetXMLDesc(f.ptr, C.uint(flags)) + var err C.virError + result :=3D C.virNWFilterGetXMLDescWrapper(f.ptr, C.uint(flags), &err) if result =3D=3D nil { - return "", GetLastError() + return "", makeError(&err) } xml :=3D C.GoString(result) C.free(unsafe.Pointer(result)) diff --git a/nwfilter_wrapper.go b/nwfilter_wrapper.go index 78d0487..809e527 100644 --- a/nwfilter_wrapper.go +++ b/nwfilter_wrapper.go @@ -30,5 +30,93 @@ package libvirt #include #include "nwfilter_wrapper.h" =20 + +int +virNWFilterFreeWrapper(virNWFilterPtr nwfilter, + virErrorPtr err) +{ + int ret =3D virNWFilterFree(nwfilter); + if (ret < 0) { + virCopyLastError(err); + } + return ret; +} + + +const char * +virNWFilterGetNameWrapper(virNWFilterPtr nwfilter, + virErrorPtr err) +{ + const char * ret =3D virNWFilterGetName(nwfilter); + if (!ret) { + virCopyLastError(err); + } + return ret; +} + + +int +virNWFilterGetUUIDWrapper(virNWFilterPtr nwfilter, + unsigned char *uuid, + virErrorPtr err) +{ + int ret =3D virNWFilterGetUUID(nwfilter, uuid); + if (ret < 0) { + virCopyLastError(err); + } + return ret; +} + + +int +virNWFilterGetUUIDStringWrapper(virNWFilterPtr nwfilter, + char *buf, + virErrorPtr err) +{ + int ret =3D virNWFilterGetUUIDString(nwfilter, buf); + if (ret < 0) { + virCopyLastError(err); + } + return ret; +} + + +char * +virNWFilterGetXMLDescWrapper(virNWFilterPtr nwfilter, + unsigned int flags, + virErrorPtr err) +{ + char * ret =3D virNWFilterGetXMLDesc(nwfilter, flags); + if (!ret) { + virCopyLastError(err); + } + return ret; +} + + +int +virNWFilterRefWrapper(virNWFilterPtr nwfilter, + virErrorPtr err) +{ + int ret =3D virNWFilterRef(nwfilter); + if (ret < 0) { + virCopyLastError(err); + } + return ret; +} + + +int +virNWFilterUndefineWrapper(virNWFilterPtr nwfilter, + virErrorPtr err) +{ + int ret =3D virNWFilterUndefine(nwfilter); + if (ret < 0) { + virCopyLastError(err); + } + return ret; +} + + */ import "C" diff --git a/nwfilter_wrapper.h b/nwfilter_wrapper.h index c470366..9a0651c 100644 --- a/nwfilter_wrapper.h +++ b/nwfilter_wrapper.h @@ -29,4 +29,37 @@ #include #include =20 + +int +virNWFilterFreeWrapper(virNWFilterPtr nwfilter, + virErrorPtr err); + +const char * +virNWFilterGetNameWrapper(virNWFilterPtr nwfilter, + virErrorPtr err); + +int +virNWFilterGetUUIDWrapper(virNWFilterPtr nwfilter, + unsigned char *uuid, + virErrorPtr err); + +int +virNWFilterGetUUIDStringWrapper(virNWFilterPtr nwfilter, + char *buf, + virErrorPtr err); + +char * +virNWFilterGetXMLDescWrapper(virNWFilterPtr nwfilter, + unsigned int flags, + virErrorPtr err); + +int +virNWFilterRefWrapper(virNWFilterPtr nwfilter, + virErrorPtr err); + +int +virNWFilterUndefineWrapper(virNWFilterPtr nwfilter, + virErrorPtr err); + + #endif /* LIBVIRT_GO_NWFILTER_WRAPPER_H__ */ --=20 2.17.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list