From 622da992f894ece03a2f9502c572f8a0d55410de Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 16 Dec 2015 13:52:43 -0400 Subject: [PATCH] reorder database shutdown to be concurrency safe If a DbHandle is in use by another thread, it could be queueing changes while shutdown is running. So, wait for the worker to finish before flushing the queue, so that any last-minute writes are included. Before this fix, they would be silently dropped. Of course, if the other thread continues to try to use a DbHandle once it's closed, it will block forever as the worker is no longer reading from the jobs MVar. So, that would crash with "thread blocked indefinitely in an MVar operation". --- Database/Handle.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Database/Handle.hs b/Database/Handle.hs index 6d312df685..67f7592657 100644 --- a/Database/Handle.hs +++ b/Database/Handle.hs @@ -142,9 +142,9 @@ queryDb (DbHandle _ jobs _) a = do closeDb :: DbHandle -> IO () closeDb h@(DbHandle worker jobs _) = do - flushQueueDb h putMVar jobs CloseJob wait worker + flushQueueDb h type Size = Int