Show
Ignore:
Timestamp:
10/22/06 01:38:03 (2 years ago)
Author:
audreyt
svk:copy_cache_prev:
21625
Message:

* Pugs.Prim.List: MVar-based synchronization is much better

also for hyper operators than Chan-based ones, so implement
them here too.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Prim/List.hs

    r14467 r14478  
    393393        env <- ask 
    394394        liftIO $ do 
    395             chan    <- newChan 
    396             forM ([(0::Int)..] `zip` xs) $ \(n, x) -> forkIO $ do 
    397                 rv  <- runEvalIO env $ doHyper x 
    398                 writeChan chan (n, rv) 
    399             fmap (map snd . sort) (replicateM (length xs) (readChan chan)) 
     395            mvs <- forM xs $ \x -> do 
     396                mv  <- newEmptyMVar 
     397                forkIO $ do 
     398                    val <- runEvalIO env (doHyper x) 
     399                    putMVar mv val 
     400                return mv 
     401            mapM takeMVar mvs 
    400402 
    401403op1HyperPostfix :: VCode -> Val -> Eval Val 
     
    435437        env <- ask 
    436438        liftIO $ do 
    437             chan    <- newChan 
    438             len     <- doHyperLists env chan 0 xs ys 
    439             fmap (map snd . sort) (replicateM len (readChan chan)) 
    440     doHyperLists :: Env -> Chan (Int, Val) -> Int -> [Val] -> [Val] -> IO Int 
    441     doHyperLists _ _    n [] [] = return n 
    442     doHyperLists _ chan n xs [] = do 
    443         forM ([n..] `zip` xs) (writeChan chan) 
    444         return (n + length xs) 
    445     doHyperLists _ chan n [] ys = do 
    446         forM ([n..] `zip` ys) (writeChan chan) 
    447         return (n + length ys) 
    448     doHyperLists env chan n (x:xs) (y:ys) = do 
     439            mvs <- doHyperLists env xs ys 
     440            mapM takeMVar mvs 
     441    doHyperLists _ [] [] = return [] 
     442    doHyperLists _ xs [] = mapM newMVar xs 
     443    doHyperLists _ [] ys = mapM newMVar ys 
     444    doHyperLists env (x:xs) (y:ys) = do 
     445        mv  <- newEmptyMVar 
    449446        forkIO $ do 
    450             rv  <- runEvalIO env $ doHyper x y 
    451             writeChan chan (n, rv) 
    452         doHyperLists env chan (n+1) xs ys 
     447            val <- runEvalIO env $ doHyper x y 
     448            putMVar mv val 
     449        mvs <- doHyperLists env xs ys 
     450        return (mv:mvs)