`unsafeReleaseAll` throws `ResourceRegistryUsedFromUntrackedThread` when called from an untracked thread
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 80/100
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
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de IntersectMBO/io-classes-extra
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 78/100
-
`closeRegistry` does not cancel a thread forked during close before it marks the registry closedPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 46/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 35/100
-
Dificultad 3/5 1-2 días Aptitud para principiantes 45/100
IntersectMBO/io-classes-extra#6 · 2 reacciones ·
Todos los issues de IntersectMBO/io-classes-extra
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
haskell/blog.haskell.org#48 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
-
Under the `C` locale a non-ASCII argument such as `--hide Φ.bar` is garbled, and the error about it crashes on stderrPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 85/100
objectionary/phino#2222 ·
Los mantenedores suelen responder en 1 día
-
area:stack expires:card-driven gap
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
Los mantenedores suelen responder en 1 día