[libvirt] [PATCH 1/3] vz: simplify getting strings from vzsdk

Maxim Nestratov mnestratov at virtuozzo.com
Tue Apr 12 08:37:00 UTC 2016


06.04.2016 14:42, Nikolay Shirokovskiy пишет:
> SDK does not allocate memory when getting strings thus we
> need to call every function that returns string twice.
> First to obtain string length, second to obtain string
> itself. It is tedious. Let's move this logic into macro
> that generates wrapper. Luckily all functions we need
> to wrap have 3 parameters: some handle, pointer to
> string and string length.
>
> Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy at virtuozzo.com>
> ---
>   src/vz/vz_sdk.c | 167 +++++++++++++++++++-------------------------------------
>   1 file changed, 56 insertions(+), 111 deletions(-)
>
> diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
> index 8691887..0d853d0 100644
> --- a/src/vz/vz_sdk.c
> +++ b/src/vz/vz_sdk.c
> @@ -201,6 +201,44 @@ waitJobHelper(PRL_HANDLE job, unsigned int timeout,
>       waitJobHelper(job, JOB_INFINIT_WAIT_TIMEOUT, __FILE__,  \
>                     __FUNCTION__, __LINE__)
>   
> +#define PRLSDK_GENERATE_STRING_GETTER(FUN)          \
> +static char*                                        \
> +FUN ## _Alloc(PRL_HANDLE handle)                    \
> +{                                                   \
> +    PRL_RESULT pret;                                \
> +    PRL_UINT32 buflen = 0;                          \
> +    char *str = NULL;                               \
> +                                                    \
> +    pret = FUN(handle, NULL, &buflen);              \
> +    prlsdkCheckRetGoto(pret, error);                \
> +                                                    \
> +    if (VIR_ALLOC_N(str, buflen) < 0)               \
> +        goto error;                                 \
> +                                                    \
> +    pret = FUN(handle, str, &buflen);               \
> +    prlsdkCheckRetGoto(pret, error);                \
> +                                                    \
> +    return str;                                     \
> +                                                    \
> + error:                                             \
> +    VIR_FREE(str);                                  \
> +    return NULL;                                    \
> +}

I'd prefer to see a real function, not a macro with a pointer to 
necessary Prlxxx  function as a parameter
like:

static char * prlsdkGetStringParam(PRL_HANDLE sdkdom, 
prlsdkGetStringFunc func)

...
     pret = func(sdkdom, src, &buflen);
...

> +
> +PRLSDK_GENERATE_STRING_GETTER(PrlResult_GetParamAsString)
> +
> +PRLSDK_GENERATE_STRING_GETTER(PrlVmCfg_GetName)
> +PRLSDK_GENERATE_STRING_GETTER(PrlVmCfg_GetVNCHostName)
> +PRLSDK_GENERATE_STRING_GETTER(PrlVmCfg_GetCpuMask)
> +PRLSDK_GENERATE_STRING_GETTER(PrlVmCfg_GetHomePath)
> +
> +PRLSDK_GENERATE_STRING_GETTER(PrlVmDev_GetFriendlyName)
> +PRLSDK_GENERATE_STRING_GETTER(PrlVmDev_GetImagePath)
> +
> +PRLSDK_GENERATE_STRING_GETTER(PrlVmDevHd_GetMountPoint)
> +
> +PRLSDK_GENERATE_STRING_GETTER(PrlVmDevNet_GetHostInterfaceName)
> +PRLSDK_GENERATE_STRING_GETTER(PrlVmDevNet_GetVirtualNetworkId)
>   
>   int
>   prlsdkInit(void)
> @@ -346,19 +384,8 @@ prlsdkGetDomainIds(PRL_HANDLE sdkdom,
>       PRL_UINT32 len;
>       PRL_RESULT pret;
>   
> -    if (name) {
> -        len = 0;
> -        *name = NULL;
> -        /* get name length */
> -        pret = PrlVmCfg_GetName(sdkdom, NULL, &len);
> -        prlsdkCheckRetGoto(pret, error);
> -
> -        if (VIR_ALLOC_N(*name, len) < 0)
> -            goto error;
> -
> -        pret = PrlVmCfg_GetName(sdkdom, *name, &len);
> -        prlsdkCheckRetGoto(pret, error);
> -    }
> +    if (name && !(*name = PrlVmCfg_GetName_Alloc(sdkdom)))
> +        goto error;
>   
>       if (uuid) {
>           len = sizeof(uuidstr);
> @@ -465,7 +492,6 @@ prlsdkGetDiskInfo(vzConnPtr privconn,
>                     bool isCt)
>   {
>       char *buf = NULL;
> -    PRL_UINT32 buflen = 0;
>       PRL_RESULT pret;
>       PRL_UINT32 emulatedType;
>       PRL_UINT32 ifType;
> @@ -497,15 +523,9 @@ prlsdkGetDiskInfo(vzConnPtr privconn,
>           disk->device = VIR_DOMAIN_DISK_DEVICE_DISK;
>       }
>   
> -    pret = PrlVmDev_GetFriendlyName(prldisk, NULL, &buflen);
> -    prlsdkCheckRetGoto(pret, cleanup);
> -
> -    if (VIR_ALLOC_N(buf, buflen) < 0)
> +    if (!(buf = PrlVmDev_GetFriendlyName_Alloc(prldisk)))
>           goto cleanup;
>   
> -    pret = PrlVmDev_GetFriendlyName(prldisk, buf, &buflen);
> -    prlsdkCheckRetGoto(pret, cleanup);
> -
>       if (virDomainDiskSetSource(disk, buf) < 0)
>           goto cleanup;
>   
> @@ -567,8 +587,6 @@ prlsdkGetFSInfo(PRL_HANDLE prldisk,
>                   virDomainFSDefPtr fs)
>   {
>       char *buf = NULL;
> -    PRL_UINT32 buflen = 0;
> -    PRL_RESULT pret;
>       int ret = -1;
>   
>       fs->type = VIR_DOMAIN_FS_TYPE_FILE;
> @@ -580,27 +598,15 @@ prlsdkGetFSInfo(PRL_HANDLE prldisk,
>       fs->readonly = false;
>       fs->symlinksResolved = false;
>   
> -    pret = PrlVmDev_GetImagePath(prldisk, NULL, &buflen);
> -    prlsdkCheckRetGoto(pret, cleanup);
> -
> -    if (VIR_ALLOC_N(buf, buflen) < 0)
> +    if (!(buf = PrlVmDev_GetImagePath_Alloc(prldisk)))
>           goto cleanup;
>   
> -    pret = PrlVmDev_GetImagePath(prldisk, buf, &buflen);
> -    prlsdkCheckRetGoto(pret, cleanup);
> -
>       fs->src = buf;
>       buf = NULL;
>   
> -    pret = PrlVmDevHd_GetMountPoint(prldisk, NULL, &buflen);
> -    prlsdkCheckRetGoto(pret, cleanup);
> -
> -    if (VIR_ALLOC_N(buf, buflen) < 0)
> +    if (!(buf = PrlVmDevHd_GetMountPoint_Alloc(prldisk)))
>           goto cleanup;
>   
> -    pret = PrlVmDevHd_GetMountPoint(prldisk, buf, &buflen);
> -    prlsdkCheckRetGoto(pret, cleanup);
> -
>       fs->dst = buf;
>       buf = NULL;
>   
> @@ -726,15 +732,9 @@ prlsdkGetNetInfo(PRL_HANDLE netAdapter, virDomainNetDefPtr net, bool isCt)
>   
>       /* use device name, shown by prlctl as target device
>        * for identifying network adapter in virDomainDefineXML */
> -    pret = PrlVmDevNet_GetHostInterfaceName(netAdapter, NULL, &buflen);
> -    prlsdkCheckRetGoto(pret, cleanup);
> -
> -    if (VIR_ALLOC_N(net->ifname, buflen) < 0)
> +    if (!(net->ifname = PrlVmDevNet_GetHostInterfaceName_Alloc(netAdapter)))
>           goto cleanup;
>   
> -    pret = PrlVmDevNet_GetHostInterfaceName(netAdapter, net->ifname, &buflen);
> -    prlsdkCheckRetGoto(pret, cleanup);
> -
>       pret = PrlVmDev_GetIndex(netAdapter, &netAdapterIndex);
>       prlsdkCheckRetGoto(pret, cleanup);
>   
> @@ -765,17 +765,10 @@ prlsdkGetNetInfo(PRL_HANDLE netAdapter, virDomainNetDefPtr net, bool isCt)
>                          PARALLELS_DOMAIN_ROUTED_NETWORK_NAME) < 0)
>               goto cleanup;
>       } else {
> -        pret = PrlVmDevNet_GetVirtualNetworkId(netAdapter, NULL, &buflen);
> -        prlsdkCheckRetGoto(pret, cleanup);
> -
> -        if (VIR_ALLOC_N(net->data.network.name, buflen) < 0)
> +        if (!(net->data.network.name =
> +              PrlVmDevNet_GetVirtualNetworkId_Alloc(netAdapter)))
>               goto cleanup;
>   
> -        pret = PrlVmDevNet_GetVirtualNetworkId(netAdapter,
> -                                               net->data.network.name,
> -                                               &buflen);
> -        prlsdkCheckRetGoto(pret, cleanup);
> -
>           /*
>            * We use VIR_DOMAIN_NET_TYPE_NETWORK for all network adapters
>            * except those whose Virtual Network Id differ from Parallels
> @@ -868,7 +861,6 @@ prlsdkGetSerialInfo(PRL_HANDLE serialPort, virDomainChrDefPtr chr)
>       PRL_UINT32 serialPortIndex;
>       PRL_UINT32 emulatedType;
>       char *friendlyName = NULL;
> -    PRL_UINT32 buflen;
>   
>       chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL;
>       chr->targetTypeAttr = false;
> @@ -879,15 +871,9 @@ prlsdkGetSerialInfo(PRL_HANDLE serialPort, virDomainChrDefPtr chr)
>       pret = PrlVmDev_GetEmulatedType(serialPort, &emulatedType);
>       prlsdkCheckRetGoto(pret, error);
>   
> -    pret = PrlVmDev_GetFriendlyName(serialPort, NULL, &buflen);
> -    prlsdkCheckRetGoto(pret, error);
> -
> -    if (VIR_ALLOC_N(friendlyName, buflen) < 0)
> +    if (!(friendlyName = PrlVmDev_GetFriendlyName_Alloc(serialPort)))
>           goto error;
>   
> -    pret = PrlVmDev_GetFriendlyName(serialPort, friendlyName, &buflen);
> -    prlsdkCheckRetGoto(pret, error);
> -
>       switch (emulatedType) {
>       case PDT_USE_OUTPUT_FILE:
>           chr->source.type = VIR_DOMAIN_CHR_TYPE_FILE;
> @@ -987,7 +973,6 @@ prlsdkAddVNCInfo(PRL_HANDLE sdkdom, virDomainDefPtr def)
>       virDomainGraphicsDefPtr gr = NULL;
>       PRL_VM_REMOTE_DISPLAY_MODE vncMode;
>       PRL_UINT32 port;
> -    PRL_UINT32 buflen = 0;
>       PRL_RESULT pret;
>   
>       pret = PrlVmCfg_GetVNCMode(sdkdom, &vncMode);
> @@ -1016,15 +1001,9 @@ prlsdkAddVNCInfo(PRL_HANDLE sdkdom, virDomainDefPtr def)
>   
>       gr->nListens = 1;
>   
> -    pret = PrlVmCfg_GetVNCHostName(sdkdom, NULL, &buflen);
> -    prlsdkCheckRetGoto(pret, error);
> -
> -    if (VIR_ALLOC_N(gr->listens[0].address, buflen) < 0)
> +    if (!(gr->listens[0].address = PrlVmCfg_GetVNCHostName_Alloc(sdkdom)))
>           goto error;
>   
> -    pret = PrlVmCfg_GetVNCHostName(sdkdom, gr->listens[0].address, &buflen);
> -    prlsdkCheckRetGoto(pret, error);
> -
>       gr->listens[0].type = VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS;
>   
>       if (VIR_APPEND_ELEMENT(def->graphics, def->ngraphics, gr) < 0)
> @@ -1139,7 +1118,6 @@ prlsdkConvertCpuInfo(PRL_HANDLE sdkdom,
>                        virDomainDefPtr def)
>   {
>       char *buf;
> -    PRL_UINT32 buflen = 0;
>       int hostcpus;
>       PRL_UINT32 cpuCount;
>       PRL_RESULT pret;
> @@ -1161,14 +1139,9 @@ prlsdkConvertCpuInfo(PRL_HANDLE sdkdom,
>       if (virDomainDefSetVcpus(def, cpuCount) < 0)
>           goto cleanup;
>   
> -    pret = PrlVmCfg_GetCpuMask(sdkdom, NULL, &buflen);
> -    prlsdkCheckRetGoto(pret, cleanup);
> -
> -    if (VIR_ALLOC_N(buf, buflen) < 0)
> +    if (!(buf = PrlVmCfg_GetCpuMask_Alloc(sdkdom)))
>           goto cleanup;
>   
> -    pret = PrlVmCfg_GetCpuMask(sdkdom, buf, &buflen);
> -
>       if (strlen(buf) == 0) {
>           if (!(def->cpumask = virBitmapNew(hostcpus)))
>               goto cleanup;
> @@ -1273,7 +1246,6 @@ prlsdkLoadDomain(vzConnPtr privconn, virDomainObjPtr dom)
>       VIRTUAL_MACHINE_STATE domainState;
>       char *home = NULL;
>   
> -    PRL_UINT32 buflen = 0;
>       PRL_RESULT pret;
>       PRL_UINT32 ram;
>       PRL_UINT32 envId;
> @@ -1326,16 +1298,9 @@ prlsdkLoadDomain(vzConnPtr privconn, virDomainObjPtr dom)
>       pret = PrlVmCfg_GetEnvId(sdkdom, &envId);
>       prlsdkCheckRetGoto(pret, error);
>   
> -    buflen = 0;
> -    pret = PrlVmCfg_GetHomePath(sdkdom, NULL, &buflen);
> -    prlsdkCheckRetGoto(pret, error);
> -
> -    if (VIR_ALLOC_N(home, buflen) < 0)
> +    if (!(home = PrlVmCfg_GetHomePath_Alloc(sdkdom)))
>           goto error;
>   
> -    pret = PrlVmCfg_GetHomePath(sdkdom, home, &buflen);
> -    prlsdkCheckRetGoto(pret, error);
> -
>       /* For VMs home is actually /directory/config.pvs */
>       if (!IS_CT(def)) {
>           /* Get rid of /config.pvs in path string */
> @@ -3190,7 +3155,6 @@ prlsdkGetDiskIndex(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk)
>   {
>       int idx = -1;
>       char *buf = NULL;
> -    PRL_UINT32 buflen = 0;
>       PRL_RESULT pret;
>       PRL_UINT32 hddCount;
>       PRL_UINT32 i;
> @@ -3204,16 +3168,9 @@ prlsdkGetDiskIndex(PRL_HANDLE sdkdom, virDomainDiskDefPtr disk)
>           pret = PrlVmCfg_GetHardDisk(sdkdom, i, &hdd);
>           prlsdkCheckRetGoto(pret, cleanup);
>   
> -        buflen = 0;
> -        pret = PrlVmDev_GetFriendlyName(hdd, 0, &buflen);
> -        prlsdkCheckRetGoto(pret, cleanup);
> -
> -        if (VIR_ALLOC_N(buf, buflen) < 0)
> +        if (!(buf = PrlVmDev_GetFriendlyName_Alloc(hdd)))
>               goto cleanup;
>   
> -        pret = PrlVmDev_GetFriendlyName(hdd, buf, &buflen);
> -        prlsdkCheckRetGoto(pret, cleanup);
> -
>           if (STRNEQ(disk->src->path, buf)) {
>   
>               PrlHandle_Free(hdd);
> @@ -3613,7 +3570,7 @@ prlsdkDomainHasSnapshots(PRL_HANDLE sdkdom, int* found)
>       PRL_HANDLE job;
>       PRL_HANDLE result;
>       char *snapshotxml = NULL;
> -    unsigned int len, paramsCount;
> +    unsigned int paramsCount;
>       xmlDocPtr xml = NULL;
>       xmlXPathContextPtr ctxt = NULL;
>   
> @@ -3630,16 +3587,10 @@ prlsdkDomainHasSnapshots(PRL_HANDLE sdkdom, int* found)
>       if (!paramsCount)
>           goto cleanup;
>   
> -    pret = PrlResult_GetParamAsString(result, 0, &len);
> -    prlsdkCheckRetGoto(pret, cleanup);
> -
> -    if (VIR_ALLOC_N(snapshotxml, len+1) < 0)
> +    if (!(snapshotxml = PrlResult_GetParamAsString_Alloc(result)))
>           goto cleanup;
>   
> -    pret = PrlResult_GetParamAsString(result, snapshotxml, &len);
> -    prlsdkCheckRetGoto(pret, cleanup);
> -
> -    if (len <= 1) {
> +    if (*snapshotxml == '\0') {
>           /* The document is empty that means no snapshots */
>           *found = 0;
>           ret = 0;
> @@ -3848,12 +3799,12 @@ prlsdkGetBlockStats(virDomainObjPtr dom, virDomainDiskDefPtr disk, virDomainBloc
>       return ret;
>   }
>   
> +
>   static PRL_HANDLE
>   prlsdkFindNetByPath(virDomainObjPtr dom, const char *path)
>   {
>       PRL_UINT32 count = 0;
>       vzDomObjPtr privdom = dom->privateData;
> -    PRL_UINT32 buflen = 0;
>       PRL_RESULT pret;
>       size_t i;
>       char *name = NULL;
> @@ -3866,15 +3817,9 @@ prlsdkFindNetByPath(virDomainObjPtr dom, const char *path)
>           pret = PrlVmCfg_GetNetAdapter(privdom->sdkdom, i, &net);
>           prlsdkCheckRetGoto(pret, error);
>   
> -        pret = PrlVmDevNet_GetHostInterfaceName(net, NULL, &buflen);
> -        prlsdkCheckRetGoto(pret, error);
> -
> -        if (VIR_ALLOC_N(name, buflen) < 0)
> +        if (!(name = PrlVmDevNet_GetHostInterfaceName_Alloc(net)))
>               goto error;
>   
> -        pret = PrlVmDevNet_GetHostInterfaceName(net, name, &buflen);
> -        prlsdkCheckRetGoto(pret, error);
> -
>           if (STREQ(name, path))
>               break;
>   




More information about the libvir-list mailing list