At 08/19/2016 10:38 PM, Peter Krempa wrote:
The function will gradually add more returned data. Return a struct
for
every vCPU containing the data.
/**
* qemuMonitorGetCPUInfo:
* @mon: monitor
- * @pids: returned array of thread ids corresponding to the vCPUs
+ * @cpus: pointer filled by array of qemuMonitorCPUInfo structures
s/@cpus/@vcpus
+ * @maxvcpus: total possible number of vcpus
+ *
+ * Detects VCPU information. If qemu doesn't support or fails reporting
+ * information this function will return success as other parts of libvirt
+ * are able to cope with that.
*
- * Detects the vCPU thread ids. Returns count of detected vCPUs on success,
- * 0 if qemu didn't report thread ids (does not report libvirt error),
- * -1 on error (reports libvirt error).
+ * Returns 0 on success (including if qemu didn't report any data) and
+ * -1 on error (reports libvirt error).
*/
int
qemuMonitorGetCPUInfo(qemuMonitorPtr mon,
- int **pids)
+ qemuMonitorCPUInfoPtr *vcpus,
+ size_t maxvcpus)
{
+ qemuMonitorCPUInfoPtr info = NULL;
+ int *pids = NULL;
+ size_t i;
+ int ret = -1;
+ int rc;
+
QEMU_CHECK_MONITOR(mon);
+ if (VIR_ALLOC_N(info, maxvcpus) < 0)
+ return -1;
+
if (mon->json)
- return qemuMonitorJSONQueryCPUs(mon, pids);
+ rc = qemuMonitorJSONQueryCPUs(mon, &pids);
else
- return qemuMonitorTextQueryCPUs(mon, pids);
+ rc = qemuMonitorTextQueryCPUs(mon, &pids);
+
+ if (rc < 0) {
+ virResetLastError();
+ VIR_STEAL_PTR(*vcpus, info);
+ ret = 0;
+ goto cleanup;
+ }
+
+ for (i = 0; i < rc; i++)
+ info[i].tid = pids[i];
+
+ VIR_STEAL_PTR(*vcpus, info);
+ ret = 0;
+
+ cleanup:
+ qemuMonitorCPUInfoFree(info, maxvcpus);
+ VIR_FREE(pids);
+ return ret;
}
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 591d3ed..3fa993f 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -390,8 +390,19 @@ int qemuMonitorGetStatus(qemuMonitorPtr mon,
int qemuMonitorSystemReset(qemuMonitorPtr mon);
int qemuMonitorSystemPowerdown(qemuMonitorPtr mon);
+
+struct _qemuMonitorCPUInfo {
+ pid_t tid;
+};
+typedef struct _qemuMonitorCPUInfo qemuMonitorCPUInfo;
+typedef qemuMonitorCPUInfo *qemuMonitorCPUInfoPtr;
+
+void qemuMonitorCPUInfoFree(qemuMonitorCPUInfoPtr list,
+ size_t nitems);
int qemuMonitorGetCPUInfo(qemuMonitorPtr mon,
- int **pids);
+ qemuMonitorCPUInfoPtr *vcpus,
+ size_t maxvcpus);
+
int qemuMonitorGetVirtType(qemuMonitorPtr mon,
virDomainVirtType *virtType);
int qemuMonitorGetBalloonInfo(qemuMonitorPtr mon,