When compiling the following code against the windows wrapper library, I seem to have an memory leak. After ~1500 reverts is has consumed about 170 MB of RAM. It starts as about ~7MB. After ~50 the memory use has increased to about 12 MB.
When trying the same code staticly linked against the VIServer-2.0.0 vix.lib. The VixJob_Wait call after VixVM_RevertToSnapshot never returns so I do not know if the same problem persist when linking directly. Anyone know what is wrong?
Compiler:
Microsoft Visual Studio 2008
Version 9.0.30729.1 SP
Microsoft .NET Framework
Version 3.5 SP1
Compiler options:
/OUT:"C:\Users\Tyriel\Documents\Visual Studio 2008\Projects\RevertTest\Release\RevertTest.exe" /NOLOGO /MANIFEST /MANIFESTFILE:"Release\RevertTest.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /NODEFAULTLIB:"libcmt.lib" /DEBUG /PDB:"c:\Users\Tyriel\Documents\Visual Studio 2008\Projects\RevertTest\Release\RevertTest.pdb" /OPT:REF /OPT:ICF /LTCG /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:PROMPT VixAllProducts.lib kernel32.lib user32.lib advapi32.lib ole32.lib oleaut32.lib ws2_32.lib shell32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
VIX API:
VMware-vix-1.11.0-471780
Code:
#include <vix.h> #include <iostream> #define NULL 0 void main() { VixError err = VIX_OK; VixHandle hostHandle = VIX_INVALID_HANDLE; VixHandle jobHandle = VIX_INVALID_HANDLE; VixHandle vmHandle = VIX_INVALID_HANDLE; VixHandle snapshotHandle = VIX_INVALID_HANDLE; int i = 0; jobHandle = VixHost_Connect(VIX_API_VERSION, VIX_SERVICEPROVIDER_VMWARE_VI_SERVER, "https://192.168.0.140/sdk", // hostName 0, // hostPort "user", // userName "password", // password 0, // options VIX_INVALID_HANDLE, // propertyListHandle NULL, // callbackProc NULL); // clientData err = VixJob_Wait(jobHandle, VIX_PROPERTY_JOB_RESULT_HANDLE, &hostHandle, VIX_PROPERTY_NONE); if (VIX_OK != err) { goto abort; } Vix_ReleaseHandle(jobHandle); jobHandle = VixVM_Open(hostHandle, "[datastore1] vm/vm.vmx", NULL, // callbackProc NULL); // clientData err = VixJob_Wait(jobHandle, VIX_PROPERTY_JOB_RESULT_HANDLE, &vmHandle, VIX_PROPERTY_NONE); if (VIX_OK != err) { goto abort; } Vix_ReleaseHandle(jobHandle); err = VixVM_GetNamedSnapshot(vmHandle, "snapshot", &snapshotHandle); if(err != 0) { std::cout << Vix_GetErrorText(err, 0) << std::endl; } else { while(true) { jobHandle = VixVM_RevertToSnapshot(vmHandle, snapshotHandle, VIX_VMPOWEROP_LAUNCH_GUI, // options VIX_INVALID_HANDLE, // propertyListHandle NULL, // callbackProc NULL); // clientData err = VixJob_Wait(jobHandle, VIX_PROPERTY_NONE); if (VIX_OK != err) { goto abort; } Vix_ReleaseHandle(jobHandle); std::cout << ++i << std::endl; } } abort: Vix_ReleaseHandle(jobHandle); Vix_ReleaseHandle(snapshotHandle); Vix_ReleaseHandle(vmHandle); VixHost_Disconnect(hostHandle); }