Repository navigation
Memory leak when Puppy is used inside a thread #123
Copy link
Copy link
Open
Description
Description
I use Puppy inside a thread to keep the GUI responsive. For every request a new thread is created. This leads to huge increase of the Resident set size (RSS).
Notes:
getOccupiedMem() returns zero. (ORC seems to work fine.)
With -d:useMalloc RSS increase is almost gone. (Is it a bug in the Nim allocator?)
I was unable to reproduce the issue without calling Puppy.
Reproducer:
import std / strutils
import std / os
import puppy
type ThreadParams = object
url: string
responseBody: string
success: bool
errorMsg: string
proc requestThreadFunc(params: ptr ThreadParams) {.thread.} =
try:
params.responseBody = puppy.fetch(params.url)
params.success = true
except:
params.errorMsg = getCurrentExceptionMsg()
params.success = false
proc requestBody*(url: string): string =
template cleanup() =
`=destroy`(params[])
deallocShared(params)
var params = createShared(ThreadParams)
params.url = url
var thread: Thread[ptr ThreadParams]
createThread(thread, requestThreadFunc, params)
# while thread.running():
# process UI events
joinThreads(thread)
if not params.success:
let errorMsg = params.errorMsg
cleanup()
raise newException(CatchableError, errorMsg)
result = move(params.responseBody)
cleanup()
proc showMemoryUsage() =
var rss: string
for line in lines("/proc/self/status"):
if line.startsWith("VmRSS:"):
rss = line.splitWhitespace()[1]
break
echo "RSS: ", rss, " kB, getOccupiedMem: ", getOccupiedMem() div 1000, " kB"
proc main() =
while true:
discard requestBody("https://google.com")
showMemoryUsage()
os.sleep(200)
main()Puppy Version
Current head (584b2e9)
Nim Version
Nim Compiler Version 2.2.10 [Linux: amd64]
Compiled at 2026-04-24
Copyright (c) 2006-2026 by Andreas Rumpf
git hash: bfeb3146d1638b39f69007a4ae5a23e23ae4e5ef
active boot switches: -d:release
Current Output
Without -d:useMalloc:
RSS: 13776 kB, getOccupiedMem: 0 kB
RSS: 14292 kB, getOccupiedMem: 0 kB
RSS: 14720 kB, getOccupiedMem: 0 kB
RSS: 15152 kB, getOccupiedMem: 0 kB
RSS: 15580 kB, getOccupiedMem: 0 kB
RSS: 16012 kB, getOccupiedMem: 0 kB
RSS: 16440 kB, getOccupiedMem: 0 kB
RSS: 16872 kB, getOccupiedMem: 0 kB
RSS: 17300 kB, getOccupiedMem: 0 kB
RSS: 17728 kB, getOccupiedMem: 0 kB
With -d:useMalloc:
RSS: 13428 kB, getOccupiedMem: 0 kB
RSS: 13492 kB, getOccupiedMem: 0 kB
RSS: 13496 kB, getOccupiedMem: 0 kB
RSS: 13496 kB, getOccupiedMem: 0 kB
RSS: 13500 kB, getOccupiedMem: 0 kB
RSS: 13500 kB, getOccupiedMem: 0 kB
RSS: 13500 kB, getOccupiedMem: 0 kB
RSS: 13500 kB, getOccupiedMem: 0 kB
RSS: 13504 kB, getOccupiedMem: 0 kB
RSS: 13500 kB, getOccupiedMem: 0 kB
Expected Output
No increasing memory usage.
Metadata
Metadata
Assignees
Labels
No labels
Activity