@@ -55,15 +55,13 @@ import Control.Concurrent.MVar
55 (tryTakeMVar, MVar, putMVar, takeMVar, newMVar, newEmptyMVar, readMVar, modifyMVar)
55 (tryTakeMVar, MVar, putMVar, takeMVar, newMVar, newEmptyMVar, readMVar, modifyMVar)
57import System.IO.Unsafe (unsafeInterleaveIO)
57import System.IO.Unsafe (unsafeInterleaveIO)
58−import System.Mem.Weak (addFinalizer, mkWeak)
58+import System.Mem.Weak (addFinalizer)
60−import GHC.Int (Int64(..))
61import GHC.Base (IO(..), mkWeak#)
60import GHC.Base (IO(..), mkWeak#)
62import GHC.Conc (ThreadId(..))
61import GHC.Conc (ThreadId(..))
63import Data.Monoid ((<>))
62import Data.Monoid ((<>))
64import qualified Data.Text as T (unpack, pack)
63import qualified Data.Text as T (unpack, pack)
65import qualified Data.Map as M (lookup, delete, insert, empty, size)
64import qualified Data.Map as M (lookup, delete, insert, empty, size)
67import qualified Data.Set as S (empty, member, insert, delete)
65import qualified Data.Set as S (empty, member, insert, delete)
68import Data.UUID.V4 (nextRandom)
66import Data.UUID.V4 (nextRandom)
69import Data.Time.Clock (getCurrentTime,diffUTCTime)
67import Data.Time.Clock (getCurrentTime,diffUTCTime)
@@ -163,7 +161,7 @@ runJavaScript sendBatch entryPoint = do
163 commandChan <- newTChanIO
161 commandChan <- newTChanIO
164 callbacks <- newTVarIO M.empty
162 callbacks <- newTVarIO M.empty
165 nextRef' <- newTVarIO 0
163 nextRef' <- newTVarIO 0
166− finalizerThreads <- newMVar S.empty
164+ finalizerThreads' <- newMVar S.empty
167 loggingEnabled <- newIORef False
165 loggingEnabled <- newIORef False
168 let ctx = JSContextRef {
166 let ctx = JSContextRef {
169 contextId = contextId'
167 contextId = contextId'
@@ -180,7 +178,7 @@ runJavaScript sendBatch entryPoint = do
180 , freeCallback = \(Object (JSVal val)) -> atomically $ modifyTVar' callbacks (M.delete val)
178 , freeCallback = \(Object (JSVal val)) -> atomically $ modifyTVar' callbacks (M.delete val)
181 , nextRef = nextRef'
179 , nextRef = nextRef'
182 , doEnableLogging = atomicWriteIORef loggingEnabled
180 , doEnableLogging = atomicWriteIORef loggingEnabled
183− , finalizerThreads = finalizerThreads
181+ , finalizerThreads = finalizerThreads'
185 let processResults :: Bool -> Results -> IO ()
183 let processResults :: Bool -> Results -> IO ()
186 processResults syncCallbacks = \case
184 processResults syncCallbacks = \case
@@ -238,7 +236,7 @@ runJavaScript sendBatch entryPoint = do
239 numberForeverFromM_ :: (Monad m, Enum n) => n -> (n -> m a) -> m ()
237 numberForeverFromM_ :: (Monad m, Enum n) => n -> (n -> m a) -> m ()
240 numberForeverFromM_ !n f = do
238 numberForeverFromM_ !n f = do
242 numberForeverFromM_ (succ n) f
240 numberForeverFromM_ (succ n) f
243 takeResult recvMVar nBatch =
241 takeResult recvMVar nBatch =
244 takeMVar recvMVar >>= \case
242 takeMVar recvMVar >>= \case
@@ -284,7 +282,7 @@ wrapJSVal (JSValueReceived ref) = do
284 ctx <- JSM ask
282 ctx <- JSM ask
285 liftIO . addFinalizer ref $ do
283 liftIO . addFinalizer ref $ do
286 ft <- takeMVar $ finalizerThreads ctx
284 ft <- takeMVar $ finalizerThreads ctx
287− t@(ThreadId t#) <- myThreadId
285+ t <- myThreadId
288 let tname = T.pack $ show t
286 let tname = T.pack $ show t
289 doSendAsyncCommand ctx $ FreeRef tname $ JSValueForSend ref
287 doSendAsyncCommand ctx $ FreeRef tname $ JSValueForSend ref
290 if tname `S.member` ft
288 if tname `S.member` ft