Last active
September 25, 2020 19:36
-
-
Save bbarker/6cd3c9fe8dbbcb63ad21ec4fda80e70d to your computer and use it in GitHub Desktop.
Attempt to use MVar to prevent memory leaks, but get a deadlock
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
protoReceiver :: RIO FdsEnv () | |
protoReceiver = retryForever $ do | |
logItS Info ["Entering FarmPCMessage protoReceiver"] | |
tMap <- liftIO $ newThreadMap | |
fdsEnv <- ask | |
let lgr = fdsLogger fdsEnv | |
loopBody <- pure $ bracketOnError | |
(runResourceT $ do | |
swTup <- protoServe fdsEnv tMap readFarmPCMessage | |
serverMVar <- newMVar $ fst swTup | |
pure (serverMVar, snd swTup) | |
) | |
(\(_, worker) -> do | |
logLogItS Debug lgr ["Entering cleanup for protoReceiver"] | |
killChildThreads tMap | |
cancel worker | |
) | |
(\(serverMVar, _) -> do | |
logLogItS Debug lgr ["Entering FarmPCMessage protoReceiver bracket"] | |
server <- takeMVar serverMVar | |
logLogItS Debug lgr ["FarmPCMessage protoReceiver bracket: got server"] | |
server | |
.| mapMC (liftIO . traverse_ (persistFarmEntry fdsEnv)) | |
.| mapMC ((logLogIt Info lgr) . pure) | |
.| sinkUnits & runConduitRes | |
) | |
liftIO $ retryForever $ loopBody | |
where | |
killChildThreads = liftIO . killThreadHierarchy |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Another way of doing it that doesn't leak or mutate and MVar, but has slightly less safety (still a lot, since
protoServe
itself catches a lot of exceptions internally) than some alternatives: