module Database.Perdure.ReplicatedFile (
ReplicatedFile(..)
) where
import Control.Applicative
import Database.Perdure.StoreFile
import Database.Perdure.LocalStoreFile
import Cgm.Control.Concurrent.NotificationCount
newtype ReplicatedFile = ReplicatedFile [LocalStoreFile]
instance StoreFile ReplicatedFile where
type StoreRef ReplicatedFile = BasicRef
storeFileWrite (ReplicatedFile fs) addr e bufs = do
sequence_ $ fmap (\f -> storeFileWrite1 f addr e bufs) fs
return (BasicRef addr $ narrowBufsLen bufs)
storeFileRead (ReplicatedFile fs) (BasicRef addr size) e v k =
foldr (\f retry -> await1 (storeFileRead1 f addr size e v) >>= maybe retry (k . Just)) (k Nothing) fs
instance SyncableStoreFile ReplicatedFile where
storeFileSync (ReplicatedFile fs) = withNotificationCount $ \n -> sequence_ $ (notifying n . storeFileSync) <$> fs
storeFileFullBarrier (ReplicatedFile fs) = sequence_ $ storeFileFullBarrier <$> fs