Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Resource deallocation order within MonadResource

MonadResource is capable to track multiple resources. Sometimes deallocation order of these resources is important. Consider following code:

allocator1 = putStrLn "allocator1"
deallocator1 = putStrLn "deallocator1"

allocator2 = putStrLn "allocator2"
deallocator2 = putStrLn "deallocator2"

accessResource = const $ putStrLn "accessResource"

resourceTest :: MonadResource m => m ()
resourceTest = do
    (_, resource1) <- allocate allocator1 $ const deallocator1
    (_, resource2) <- allocate allocator2 $ const $ accessResource resource1 >> deallocator2
    return ()

main = runResourceT resourceTest 

Here I access resource1 from resource2 clean-up action, so I expect resource1 will always be deallocated after resource1, otherwise the code would be incorrect. And this is true at least in current implementation. If I run the code I will get:

allocator1
allocator2
accessResource
deallocator2
deallocator1

Does MonadResource always quarantine that resource allocated earlier (hence accessible from later clean-up actions) will be deallocated later, or deallocation order is implementation specific? If it implementation specific what is the best way to guarantee particular deallocation order?

like image 626
schernichkin Avatar asked Oct 20 '22 12:10

schernichkin


1 Answers

Since version 0.3.2.1, deallocation is always in LIFO order. This was changed in respond to issue #46, which has more information. In other words, you can rely on deallocator2 always running before deallocator1.

like image 185
Michael Snoyman Avatar answered Oct 24 '22 11:10

Michael Snoyman