Show
Ignore:
Timestamp:
10/22/06 01:37:44 (2 years ago)
Author:
audreyt
Message:

* Pugs.Prim.List: All Hyper operators, including @foo.>>method,

are autothreaded similar to junctions. With GHCRTS=-N2 and
above, that means the order of evaluation is impredictable.
although the return values will still be ordered as usual.

* Pugs.Internals: Move replicateM to it because

we use it all over the place now for parallelization...

Files:
1 modified

Legend:

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

    r14140 r14467  
    390390        | otherwise 
    391391        = enterEvalContext cxtItemAny $ App (Val $ VCode sub) Nothing [Val x] 
    392     hyperList []     = return [] 
    393     hyperList (x:xs) = do 
    394         val  <- doHyper x 
    395         rest <- hyperList xs 
    396         return (val:rest) 
     392    hyperList xs = do 
     393        env <- ask 
     394        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)) 
    397400 
    398401op1HyperPostfix :: VCode -> Val -> Eval Val 
     
    429432        | otherwise 
    430433        = enterEvalContext cxtItemAny $ App (Val $ VCode sub) Nothing [Val x, Val y] 
    431     hyperLists [] [] = return [] 
    432     hyperLists xs [] = return xs 
    433     hyperLists [] ys = return ys 
    434     hyperLists (x:xs) (y:ys) = do 
    435         val  <- doHyper x y 
    436         rest <- hyperLists xs ys 
    437         return (val:rest) 
    438  
     434    hyperLists xs ys = do 
     435        env <- ask 
     436        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 
     449        forkIO $ do 
     450            rv  <- runEvalIO env $ doHyper x y 
     451            writeChan chan (n, rv) 
     452        doHyperLists env chan (n+1) xs ys