typedef struct _virDomainInfo virDomainInfo;
struct _virDomainInfo {
- unsigned char state; /* the running state, a virDomainFlags */
- unsigned long maxMem; /* the maximum number of bytes allowed */
- unsigned long memory; /* the number of bytes used by the domain */
+ unsigned char state; /* the running state, one of virDomainFlags */
+ unsigned long maxMem; /* the maximum memory in bytes allowed */
+ unsigned long memory; /* the memory in bytes used by the domain */
+ unsigned short nrVirtCpu; /* the number of virtual CPUs for the domain */
/*
* Informations below are only available to clients with a connection
return(NULL);
}
+#if 0
+/* Not used ATM */
/**
* virConnectDoStoreQuery:
* @conn: pointer to the hypervisor connection
ret = xs_read(conn->xshandle, t, path, &len);
+done:
+ if (t != NULL)
+ xs_transaction_end(conn->xshandle, t, 0);
+ return(ret);
+}
+#endif
+
+/**
+ * virConnectDoStoreList:
+ * @conn: pointer to the hypervisor connection
+ * @path: the absolute path of the directory in the store to list
+ * @nb: OUT pointer to the number of items found
+ *
+ * Internal API querying the Xenstore for a list
+ *
+ * Returns a string which must be freed by the caller or NULL in case of error
+ */
+static char **
+virConnectDoStoreList(virConnectPtr conn, const char *path, unsigned int *nb) {
+ struct xs_transaction_handle* t;
+ char **ret = NULL;
+
+ t = xs_transaction_start(conn->xshandle);
+ if (t == NULL)
+ goto done;
+
+ ret = xs_directory(conn->xshandle, t, path, nb);
+
done:
if (t != NULL)
xs_transaction_end(conn->xshandle, t, 0);
return(-1);
memset(info, 0, sizeof(virDomainInfo));
if (domain->conn->flags & VIR_CONNECT_RO) {
- char *tmp;
+ char *tmp, **tmp2;
+ unsigned int nb_vcpus;
+ char request[200];
tmp = virDomainDoStoreQuery(domain, "running");
if (tmp != NULL) {
info->memory = 0;
info->maxMem = 0;
}
+#if 0
+ /* doesn't seems to work */
tmp = virDomainDoStoreQuery(domain, "cpu_time");
if (tmp != NULL) {
info->cpuTime = atol(tmp);
} else {
info->cpuTime = 0;
}
+#endif
+ snprintf(request, 199, "/local/domain/%d/cpu", domain->handle);
+ request[199] = 0;
+ tmp2 = virConnectDoStoreList(domain->conn, request, &nb_vcpus);
+ if (tmp2 != NULL) {
+ info->nrVirtCpu = nb_vcpus;
+ free(tmp2);
+ }
+
} else {
xc_domaininfo_t dominfo;
info->cpuTime = dominfo.cpu_time;
info->memory = dominfo.tot_pages * 4096;
info->maxMem = dominfo.max_pages * 4096;
+ info->nrVirtCpu = dominfo.nr_online_vcpus;
}
return(0);
}
default:
break;
}
+ printf("%d vCPU, ", info.nrVirtCpu);
if (info.cpuTime != 0) {
float cpuUsed = info.cpuTime;
cpuUsed /= 1000000000;
- printf("%.1f s CPU time, ", cpuUsed);
+ printf("%.1fs time, ", cpuUsed);
}
mem = info.memory;
mem /= 1024 * 1024;