on master help sign in
switch to verbose Windows error handling in file locking
19798beAgentM
src/lib/ProjectM36/FileLock.hs+2−10
@@ -49,22 +49,14 @@ lockFile winHandle lock = do
49
49
50 allocaBytes sizeof_OVERLAPPED $ \op -> do
50 allocaBytes sizeof_OVERLAPPED $ \op -> do
51 zeroMemory op $ fromIntegral sizeof_OVERLAPPED
51 zeroMemory op $ fromIntegral sizeof_OVERLAPPED
52− res <- c_lockFileEx winHandle (exFlag .|. blockFlag) 0 1 0 op
52+ failIfFalse_ "LockFileEx" $ c_lockFileEx winHandle (exFlag .|. blockFlag) 0 1 0 op
53− if res then
54− pure ()
55− else
56− error "failed to wait for database lock"
57
53
58unlockFile :: HANDLE -> IO ()
54unlockFile :: HANDLE -> IO ()
59unlockFile winHandle = do
55unlockFile winHandle = do
60 let sizeof_OVERLAPPED = 32
56 let sizeof_OVERLAPPED = 32
61 allocaBytes sizeof_OVERLAPPED $ \op -> do
57 allocaBytes sizeof_OVERLAPPED $ \op -> do
62 zeroMemory op $ fromIntegral sizeof_OVERLAPPED
58 zeroMemory op $ fromIntegral sizeof_OVERLAPPED
63− res <- c_unlockFileEx winHandle 0 1 0 op
59+ failIfFalse_ "UnlockFileEx" $ c_unlockFileEx winHandle 0 1 0 op
64− if res then
65− pure ()
66− else
67− error ("failed to unlock database lock: " ++ show res)
68
60
69#else
61#else
70--all of this complicated nonsense is fixed if we switch to GHC 8.2 which includes native flock support on handles
62--all of this complicated nonsense is fixed if we switch to GHC 8.2 which includes native flock support on handles