Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

`unsafeReleaseAll` throws `ResourceRegistryUsedFromUntrackedThread` when called from an untracked thread

Abierto Apto para principiantes
#26 0 comentarios 0 reacciones 0 asignados Ver en GitHub

@dnadales ya está trabajando en esto.

Desde el 27/10/2026.

  • #27 de @dnadales — abierto

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
80/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
haskell
Área
backend

Línea de trabajo

Empieza en resource-registry/src/Control/ResourceRegistry.hs y lee unsafeReleaseAllBy alrededor de las líneas 681 y 697, junto con unsafeRelease, release y releaseAllBy. Comprueba cómo gestionan las dos rutas de liberación a los llamadores desconocidos para el registro y, después, ejecuta las pruebas pertinentes del registro de recursos o la reproducción proporcionada. El trabajo estará terminado cuando unsafeReleaseAll, llamado desde un hilo no registrado, libere los recursos sin lanzar una excepción, mientras que releaseAll conserva la comprobación del llamador.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

The docs of unsafeReleaseAll (resource-registry/src/Control/ResourceRegistry.hs:1226) say:

This is to 'releaseAll' what 'unsafeRelease' is to 'release': we do not insist that this funciton is called from a thread that is known to the registry.

But if a thread that the registry does not know calls unsafeReleaseAll, it throws ResourceRegistryUsedFromUntrackedThread and releases nothing.

Cause

unsafeReleaseAll does not check the caller, but unsafeReleaseAllBy calls the checked release in two places:

mapM_ releaseThread ts               -- :681, each entry is `release k`
...
releaseResources rr keys release     -- :697

release calls ensureKnownThread (:1187), which throws for an unknown caller.

Reproduction

import Control.Concurrent
import Control.Exception
import Control.ResourceRegistry

main :: IO ()
main = withRegistry $ \rr -> do
  _ <- allocate rr (\_ -> pure ()) (\_ -> putStrLn "resource released")
  done <- newEmptyMVar
  -- forkIO, so this thread is not known to the registry
  _ <- forkIO $ try (unsafeReleaseAll rr) >>= putMVar done
  r <- takeMVar done
  case r of
    Left e -> putStrLn $ "unsafeReleaseAll threw: " <> takeWhile (/= ' ') (show (e :: SomeException))
    Right () -> putStrLn "unsafeReleaseAll returned"
  n <- countResources rr
  putStrLn $ "resources left: " <> show n

Output with GHC 9.10.3:

unsafeReleaseAll threw: ResourceRegistryUsedFromUntrackedThread
resources left: 1
resource released

The last line comes from closeRegistry at the end of withRegistry, not from unsafeReleaseAll.

Possible fix

Pass unsafeRelease instead of release in both places.
closeRegistry and releaseAll keep their check, because releaseAllBy checks the caller before it calls unsafeReleaseAllBy (:663).

Lenguaje dominante
Haskell
Estrellas
2
Forks
0
Métricas de merge de PR
Sin PR fusionados en 30 d

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de IntersectMBO/io-classes-extra

Todos los issues de IntersectMBO/io-classes-extra

Issues similares

Más issues de Haskell

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.