Skip to content

Memory leak when Puppy is used inside a thread #123

Open

Description

@simonkrauter

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions