[libvirt] virDomainInfo marshalling prolem

arnaud.champion at devatom.fr arnaud.champion at devatom.fr
Fri Oct 29 14:48:44 UTC 2010


There is an unmanaged type to specify when marshaling this : 
UnamanagedType.SysInt or UnmanagedType.SysUInt, which are 64b or 32bits 
aware. But the problem under windows : libvirt is compiled thru mingwin so 
the dll is in 32bits and even if windows is in 64bits, I have to make 
bindings over 32bits (I'm not sure my english make things clear when I 
explain)

Arnaud

--------------------------------------------------
From: <arnaud.champion at devatom.fr>
Sent: Friday, October 29, 2010 4:41 PM
To: "Matthias Bolte" <matthias.bolte at googlemail.com>; "Daniel P. Berrange" 
<berrange at redhat.com>
Cc: <libvir-list at redhat.com>
Subject: Re: [libvirt] virDomainInfo marshalling prolem

> Mouarf, funny thing :)
>
>
> --------------------------------------------------
> From: "Matthias Bolte" <matthias.bolte at googlemail.com>
> Sent: Friday, October 29, 2010 4:36 PM
> To: "Daniel P. Berrange" <berrange at redhat.com>
> Cc: <arnaud.champion at devatom.fr>; <libvir-list at redhat.com>
> Subject: Re: [libvirt] virDomainInfo marshalling prolem
>
>> 2010/10/29 Daniel P. Berrange <berrange at redhat.com>:
>>> On Fri, Oct 29, 2010 at 04:19:22PM +0200, Matthias Bolte wrote:
>>>> 2010/10/29  <arnaud.champion at devatom.fr>:
>>>> > Hi,
>>>> >
>>>> > I am working on the marshaling of the virDomainInfo structure. I have
>>>> > marshalled it in this way :
>>>> >
>>>> >
>>>> > ///
>>>> >
>>>> > <summary>
>>>> >
>>>> > /// Structure to handle domain informations
>>>> >
>>>> > /// </summary>
>>>> >
>>>> > [
>>>> >
>>>> > StructLayout(LayoutKind.Sequential)]
>>>> >
>>>> > public class DomainInfo
>>>> >
>>>> > {
>>>> >
>>>> >     /// <summary>
>>>> >     /// The running state, one of virDomainState.
>>>> >     /// </summary>
>>>> >     private Byte state;
>>>> >     /// <summary>
>>>> >     /// The maximum memory in KBytes allowed.
>>>> >     /// </summary>
>>>> >     public int maxMem;
>>>> >     /// <summary>
>>>> >     /// The memory in KBytes used by the domain.
>>>> >     /// </summary>
>>>> >     public int memory;
>>>> >     /// <summary>
>>>> >     /// The number of virtual CPUs for the domain.
>>>> >     /// </summary>
>>>> >     public short nrVirtCpu;
>>>> >     /// <summary>
>>>> >     /// The CPU time used in nanoseconds.
>>>> >     /// </summary>
>>>> >     public long cpuTime;
>>>> >     /// <summary>
>>>> >     /// The running state, one of virDomainState.
>>>> >     /// </summary>
>>>> >     public DomainState State { get { return (DomainState)state; } }
>>>> >
>>>> > }
>>>> >
>>>> > It work fine in 32 bits, but not in 64 bits, it seems that packing in 
>>>> > 64
>>>> > bits is different so infos are not in order. Am I right ?
>>>> >
>>>>
>>>> In the struct looks like this
>>>>
>>>> struct _virDomainInfo {
>>>>     unsigned char state;        /* the running state, one of 
>>>> virDomainState */
>>>>     unsigned long maxMem;       /* the maximum memory in KBytes allowed 
>>>> */
>>>>     unsigned long memory;       /* the memory in KBytes used by the 
>>>> domain */
>>>>     unsigned short nrVirtCpu;   /* the number of virtual CPUs for the 
>>>> domain */
>>>>     unsigned long long cpuTime; /* the CPU time used in nanoseconds */
>>>> };
>>>>
>>>> but you mapped unsigned long to int. First of all you should map this
>>>> to an unsigned type. You also lost the unsigned for some other
>>>> members.
>>>>
>>>> The problem probably is that long in C is 32bit on a 32bit platform an
>>>> 64bit on a 64bit platform. You mapped it to int that is always 32bit
>>>> in C#, when I looked it up correctly.
>>>
>>> Not quite. Windows just had to do things diffrently on 64-bit and so 
>>> used
>>> the LLP64 model instead of LP64 used by the rest of the world :-(
>>>
>>>  http://technet.microsoft.com/en-us/library/bb496995.aspx
>>>
>>>  In the UNIX/64 data model:
>>>      The size of int is 32 bits and the size of long and pointers is 64 
>>> bits.
>>>
>>>  In the Win64 model:
>>>      The size of int and long is 32 bits; the size of int64 (new type) 
>>> and pointers is 64 bits.
>>>
>>> Regards,
>>> Daniel
>>>
>>
>> Ah yes. I forgot about that one. So this gets even more complicated
>> when you want to get the C# bindings working on 32 and 64 bit Windows
>> and Linux.
>>
>> Matthias
>>
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list 





More information about the libvir-list mailing list