Is there anyway to recover the memory that requesters eat up

Everything else that doesn't fall into one of the other PB categories.
Nituvious
Addict
Addict
Posts: 1030
Joined: Sat Jul 11, 2009 4:57 am
Location: United States

Is there anyway to recover the memory that requesters eat up

Post by Nituvious »

So, I have a program that I thought had a memory leak. I narrowed it down and found that it wasn't actually any of my programs code that was causing the problem but the open and save requesters that I used! Any way to clean up the used memory? It uses a surprisingly large amount of ram.

Code: Select all

Structure PROCESS_MEMORY_COUNTERS
	
  cb.i
  PageFaultCount.i
  PeakWorkingSetSize.i
  WorkingSetSize.i
  QuotaPeakPagedPoolUsage.i
  QuotaPagedPoolUsage.i
  QuotaPeakNonPagedPoolUsage.i
  QuotaNonPagedPoolUsage.i
  PagefileUsage.i
  PeakPagefileUsage.i
	
EndStructure

Prototype.l pGetProcessMemoryInfo(process.l, psmemCounters, cb.l)

Global lPsapi = OpenLibrary(#PB_Any, "Psapi.dll")

If lPsapi

	Global GetProcesMemoryInfo_.pGetProcessMemoryInfo = GetFunction(lPsapi, "GetProcessMemoryInfo")

EndIf

Procedure.f GetMemoryUsage(type.l)
	
	Define pMem.PROCESS_MEMORY_COUNTERS
	Define.f ret
	
	GetProcesMemoryInfo_(GetCurrentProcess_(), @pMem, SizeOf(PROCESS_MEMORY_COUNTERS))
	
	Select type.l

		Case 0 ; in kilobytes
			
			ret = (pMem\WorkingSetSize / 1024)
			
		Default ; in bytes

			ret = pMem\WorkingSetSize

	EndSelect
	
	ProcedureReturn ret
	
EndProcedure

#MAX_PASS = 10

final.s = "Starting Memory: " + Str(GetMemoryUsage(0)) + "KB" + #LF$

For x = 1 To #MAX_PASS
	OpenFileRequester("", "", "", 0)
; 	InputRequester("", "", "")
; 	PathRequester("", "")
; 	SaveFileRequester("", "", "", 0)

	final.s + "Memory @ pass " + Str(x) + ": " +  Str(GetMemoryUsage(0)) + "KB" + #LF$
	
Next x

MessageRequester("", final.s)
[edit] removed an array
▓▓▓▓▓▒▒▒▒▒░░░░░
IdeasVacuum
Always Here
Always Here
Posts: 6426
Joined: Fri Oct 23, 2009 2:33 am
Location: Wales, UK
Contact:

Re: Is there anyway to recover the memory that requesters ea

Post by IdeasVacuum »

...I think the most obvious solution is to DIY - you can have better defined requesters that exactly fit the needs of your app and you have full control of memory usage.
IdeasVacuum
If it sounds simple, you have not grasped the complexity.
Nituvious
Addict
Addict
Posts: 1030
Joined: Sat Jul 11, 2009 4:57 am
Location: United States

Re: Is there anyway to recover the memory that requesters ea

Post by Nituvious »

:evil:
I guess so...
▓▓▓▓▓▒▒▒▒▒░░░░░
Fred
Administrator
Administrator
Posts: 18351
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Re: Is there anyway to recover the memory that requesters ea

Post by Fred »

PB requesters don't allocate extra memory and are thin wrapper to native WinAPI one. Try with the API and you will experience the same, it's because the requester instanciate a whole 'explorer' as a control, with all explorer intergration plugins activated (like TortoiseSVN etc.)
Nituvious
Addict
Addict
Posts: 1030
Joined: Sat Jul 11, 2009 4:57 am
Location: United States

Re: Is there anyway to recover the memory that requesters ea

Post by Nituvious »

Good to know, I suppose. :P
▓▓▓▓▓▒▒▒▒▒░░░░░
User avatar
luis
Addict
Addict
Posts: 3895
Joined: Wed Aug 31, 2005 11:09 pm
Location: Italy

Re: Is there anyway to recover the memory that requesters ea

Post by luis »

"Have you tried turning it off and on again ?"
xorc1zt
Enthusiast
Enthusiast
Posts: 276
Joined: Sat Jul 09, 2011 7:57 am

Re: Is there anyway to recover the memory that requesters ea

Post by xorc1zt »

there is no memory leak. GetOpenFileName (winapi) load a lot a dlls and also create a fair amount a of threads and kernel objects which are not freed. most of them are needed for the thumbnails (ex: load the appropriate codecs for the videos.)

Code: Select all

Import "Kernel32.lib"
    GetProcessHandleCount(a.i, *b)
EndImport
Define handle_count.i
Define handle_process.i = GetCurrentProcess_()
Define handle_tsnap.i = CreateToolhelp32Snapshot_(#TH32CS_SNAPTHREAD, 0)
Define id_process.l = GetCurrentProcessId_()
Define counter_thread.i
te.THREADENTRY32
te\dwSize = SizeOf(te)
Thread32First_(handle_tsnap, @te)
If (te\th32OwnerProcessID = id_process)
        counter_thread = counter_thread + 1
EndIf
While (Thread32Next_(handle_tsnap, @te))
    If (te\th32OwnerProcessID = id_process)
        counter_thread = counter_thread + 1
    EndIf
    
Wend
CloseHandle_(handle_tsnap)
GetProcessHandleCount(handle_process, @handle_count)
Debug "Threads: " + Str(counter_thread)
Debug "kernel objects: " + Str(handle_count)
OpenFileRequester("", "", "", 0)
Debug "-OpenFileRequester-"
counter_thread = 0
handle_tsnap = CreateToolhelp32Snapshot_(#TH32CS_SNAPTHREAD, 0)
Thread32First_(handle_tsnap, @te)
If (te\th32OwnerProcessID = id_process)
        counter_thread = counter_thread + 1
EndIf
While (Thread32Next_(handle_tsnap, @te))
    If (te\th32OwnerProcessID = id_process)
        counter_thread = counter_thread + 1

    EndIf
    
Wend
GetProcessHandleCount(handle_process, @handle_count)
Debug "Threads: " + Str(counter_thread)
Debug "kernel objects: " + Str(handle_count)
output on w8 x64

Code: Select all

Waiting for executable to start...
Executable type: Windows - x64  (64bit, Unicode)
Executable started.
[Debug] Threads: 5
[Debug] kernel objects: 63
[Debug] -OpenFileRequester-
[Debug] Threads: 29
[Debug] kernel objects: 357
The Program execution has finished.
dll loaded on GetOpenFileName call

Code: Select all

ModLoad: 000007fa`8bb40000 000007fa`8bbd6000   C:\Windows\SYSTEM32\clbcatq.dll
ModLoad: 000007fa`89050000 000007fa`89113000   C:\Windows\system32\OLEAUT32.dll
ModLoad: 000007fa`7dc60000 000007fa`7dcf5000   C:\Program Files\Common Files\microsoft shared\ink\tiptsf.dll
ModLoad: 000007fa`819f0000 000007fa`81cca000   C:\Windows\system32\explorerframe.dll
ModLoad: 000007fa`89ed0000 000007fa`89fae000   C:\Windows\system32\ADVAPI32.dll
ModLoad: 000007fa`86350000 000007fa`86407000   C:\Windows\system32\DUser.dll
ModLoad: 000007fa`87040000 000007fa`871f9000   C:\Windows\system32\DUI70.dll
ModLoad: 000007fa`86c00000 000007fa`86d8a000   C:\Windows\SYSTEM32\WindowsCodecs.dll
ModLoad: 000007fa`88b10000 000007fa`88b25000   C:\Windows\SYSTEM32\profapi.dll
ModLoad: 000007fa`7de40000 000007fa`7e0fc000   C:\Windows\SYSTEM32\MsftEdit.dll
ModLoad: 000007fa`7dd50000 000007fa`7de3c000   C:\Windows\System32\Windows.Globalization.dll
ModLoad: 000007fa`86210000 000007fa`86271000   C:\Windows\System32\Bcp47Langs.dll
ModLoad: 000007fa`84060000 000007fa`841ba000   C:\Windows\SYSTEM32\PROPSYS.dll
ModLoad: 000007fa`89bb0000 000007fa`89d80000   C:\Windows\system32\SETUPAPI.dll
ModLoad: 000007fa`88be0000 000007fa`88c2f000   C:\Windows\system32\CFGMGR32.dll
ModLoad: 000007fa`88de0000 000007fa`88e02000   C:\Windows\system32\DEVOBJ.dll
ModLoad: 000007fa`846e0000 000007fa`8471f000   C:\Windows\SYSTEM32\XmlLite.dll
ModLoad: 000007fa`85520000 000007fa`8552b000   C:\Windows\SYSTEM32\LINKINFO.dll
ModLoad: 000007fa`883c0000 000007fa`883da000   C:\Windows\SYSTEM32\CRYPTSP.dll
ModLoad: 000007fa`88040000 000007fa`88089000   C:\Windows\system32\rsaenh.dll
ModLoad: 000007fa`7dae0000 000007fa`7dbc0000   C:\Windows\system32\SearchFolder.dll
ModLoad: 000007fa`7dbc0000 000007fa`7dc52000   C:\Windows\System32\StructuredQuery.dll
ModLoad: 000007fa`7f4f0000 000007fa`7f4fb000   C:\Windows\System32\Secur32.dll
ModLoad: 000007fa`888b0000 000007fa`888dc000   C:\Windows\System32\SSPICLI.DLL
ModLoad: 000007fa`85630000 000007fa`8564c000   C:\Windows\system32\mssprxy.dll
ModLoad: 000007fa`84210000 000007fa`84420000   C:\Windows\System32\actxprxy.dll
ModLoad: 000007fa`7f570000 000007fa`7f5a5000   C:\Windows\System32\thumbcache.dll
ModLoad: 000007fa`83750000 000007fa`837ef000   C:\Windows\SYSTEM32\apphelp.dll
ModLoad: 000007fa`72b70000 000007fa`72c2b000   C:\Windows\SYSTEM32\ntshrui.dll
ModLoad: 000007fa`88810000 000007fa`88834000   C:\Windows\SYSTEM32\srvcli.dll
ModLoad: 000007fa`80280000 000007fa`80291000   C:\Windows\SYSTEM32\cscapi.dll
ModLoad: 000007fa`6f120000 000007fa`6f1da000   C:\Windows\system32\mssvp.dll
ModLoad: 000007fa`70880000 000007fa`7089d000   C:\Windows\system32\MAPI32.dll
ModLoad: 000007fa`85f00000 000007fa`85f39000   C:\Windows\System32\shdocvw.dll
ModLoad: 000007fa`70540000 000007fa`706db000   C:\Windows\system32\NetworkExplorer.dll
ModLoad: 000007fa`80d30000 000007fa`80de0000   C:\Windows\System32\twinapi.dll
ModLoad: 000007fa`82280000 000007fa`82297000   C:\Windows\SYSTEM32\MPR.dll
ModLoad: 000007fa`82d50000 000007fa`82d5a000   C:\Windows\System32\drprov.dll
ModLoad: 000007fa`88910000 000007fa`8895e000   C:\Windows\System32\WINSTA.dll
ModLoad: 000007fa`826c0000 000007fa`826d3000   C:\Windows\System32\ntlanman.dll
ModLoad: 000007fa`80c20000 000007fa`80c3e000   C:\Windows\System32\davclnt.dll
ModLoad: 000007fa`829a0000 000007fa`829ab000   C:\Windows\System32\DAVHLPR.dll
ModLoad: 000007fa`86db0000 000007fa`86dc5000   C:\Windows\SYSTEM32\wkscli.dll
ModLoad: 000007fa`87e20000 000007fa`87e2e000   C:\Windows\SYSTEM32\netutils.dll
ModLoad: 000007fa`829e0000 000007fa`82a55000   C:\Windows\System32\dlnashext.dll
ModLoad: 000007fa`709b0000 000007fa`70af4000   C:\Windows\System32\Windows.Media.Streaming.dll
ModLoad: 000007fa`88980000 000007fa`889c3000   C:\Windows\System32\POWRPROF.dll
ModLoad: 000007fa`89180000 000007fa`891d8000   C:\Windows\system32\WS2_32.dll
ModLoad: 000007fa`89400000 000007fa`89409000   C:\Windows\system32\NSI.dll
ModLoad: 000007fa`841f0000 000007fa`84200000   C:\Windows\System32\DevDispItemProvider.dll
ModLoad: 000007fa`7c6b0000 000007fa`7c6e6000   C:\Windows\System32\EhStorShell.dll
ModLoad: 000007fa`82fc0000 000007fa`8305f000   C:\Windows\System32\cscui.dll
ModLoad: 000007fa`85a50000 000007fa`85a5b000   C:\Windows\System32\CSCDLL.dll
ModLoad: 000007fa`6ef20000 000007fa`6f118000   C:\Windows\system32\wpdshext.dll
ModLoad: 000007fa`8a2d0000 000007fa`8a470000   C:\Windows\WinSxS\amd64_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.9200.16384_none_72771d4ecc1c3a4d\gdiplus.dll
ModLoad: 000007fa`828d0000 000007fa`8296b000   C:\Windows\System32\PortableDeviceApi.dll
ModLoad: 000007fa`88e10000 000007fa`88e65000   C:\Windows\system32\WINTRUST.dll
ModLoad: 000007fa`88e70000 000007fa`89047000   C:\Windows\system32\CRYPT32.dll
ModLoad: 000007fa`88bc0000 000007fa`88bd6000   C:\Windows\system32\MSASN1.dll
ModLoad: 000007fa`809c0000 000007fa`809f6000   C:\Windows\System32\PortableDeviceTypes.dll
ModLoad: 000007fa`80be0000 000007fa`80c05000   C:\Windows\System32\EhStorAPI.dll
ModLoad: 000007fa`888f0000 000007fa`88901000   C:\Windows\System32\WTSAPI32.dll
Last edited by xorc1zt on Sun Jan 06, 2013 9:38 am, edited 1 time in total.
User avatar
electrochrisso
Addict
Addict
Posts: 989
Joined: Mon May 14, 2007 2:13 am
Location: Darling River

Re: Is there anyway to recover the memory that requesters ea

Post by electrochrisso »

xorc1zt wrote:there is no memory leak. GetOpenFileName (winapi) load a lot a dlls and also create a fair amount a of threads and kernel objects which are not freed. most of them are needed for the thumbnails (ex: load the appropriate codecs for the videos.)
If I run the code again, it seems the threads and objects are freed, as it starts back at 5 threads and about 52 objects, every time I run, on the system I am using.
PureBasic! Purely the best 8)
xorc1zt
Enthusiast
Enthusiast
Posts: 276
Joined: Sat Jul 09, 2011 7:57 am

Re: Is there anyway to recover the memory that requesters ea

Post by xorc1zt »

each time your run the code you start a new process. this code get infos from the current process so you cannot keep data from the previous run which was from a another process.

from msdn :
When a process terminates, the system automatically closes handles and deletes objects created by the process. However, when a thread terminates, the system usually does not close handles or delete objects. The only exceptions are window, hook, window position, and dynamic data exchange (DDE) conversation objects; these objects are destroyed when the creating thread terminates.
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Post Reply