Ben Rudiak-Gould writes: > bar :: StreamProc ctx a -> IO (a,a) > bar sp = do > ctx <- start sp > (ptr1,n1) <- ... > (ptr2,n2) <- ... > ctx1 <- feed sp ctx (ptr1,n1) > ctx2 <- feed sp ctx (ptr2,n2) > val1 <- commit sp ctx1 > val2 <- commit sp ctx2 > return (val1,val2)
Ah! Now I understand what you meant with single-threaded versus multi-threaded use of the stream processor. Well, in the general case the result would be undefined, because not every stream processor allows a context to be re-used. The SHA1 implementation I use, for example, has a context of Ptr Sha1Context ..., so both val1 and val2 would be the hash of the concatenation of both buffers. Which is not what you'd expect. A different implementation, on the other hand, might give you the hash of the first and second block respectively. Hmmm. So I have those options: (1) If you want to use _any_ stream processor, you must use it single-threadedly. If you use it multi-threadedly, you have to know what you're doing. (2) Have distinct types (or classes) for stream processors that allow the context to be re-used and for those which do not. So far, I've implicitly used (1). Peter _______________________________________________ Haskell-Cafe mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell-cafe