
On Tue, Aug 01, 2006 at 07:05:49PM +0200, Philippe Berthault wrote:
unsigned char *cpuMaps[]; /* 1st dimension = per virtual cpu, 2nd dimension = per physical cpu */ ...
virDomainGetVcpus(pDomain, pVcpuInfos, domInfo.nrVirtCpu, cpuMaps, oneCpuMapLen); for (vcpu = 0; vcpu < domInfo.nrVirtCpu; vcpu++) { for (cpu = 0; cpu < nbPhysCpus; cpu++) { int byteCpu = cpu / 8; int bitCpu = cpu % 8; int mask = 1 >> bitCpu; /* lowest CPU number is least significant bit as M.Ponceau said */
int cpuUsable = cpuMaps[vcpu][byteCpu] & mask; ... /* or */ int cpuUsable = CPU_USABLE(cpuMaps, vcpu, cpu); ...
both are wrong IMHO :-) one need to compute the index based on domInfo.nrVirtCpu
I don't understand why you think both are wrong. The first 'for' loop index is based on domInfo.nrVirtCpu.
Just a C implem nitpick, but that can lead to interesting debugging sessions (I think I got beaten by that a couple of time). Nowhere the compiler can guess that you're accessing a 2 dimentional array with a row of length domInfo.nrVirtCpu, it's a one dimension array so I think cpuMaps[vcpu][byteCpu] is equivalent to cpuMaps[vcpu + byteCpu] there and unless I misunderstood both case that won't work as expected. This is also why I suggested a macro this can of code is easy to get wrong. Daniel -- Daniel Veillard | Red Hat http://redhat.com/ veillard@redhat.com | libxml GNOME XML XSLT toolkit http://xmlsoft.org/ http://veillard.com/ | Rpmfind RPM search engine http://rpmfind.net/