Speravo di utilizzare System.INotify e System.IO.MMap insieme per controllare le modifiche ai file e quindi eseguire rapidamente diff per l'invio di patch su una rete. Tuttavia, nella documentazione per System.IO.MMap ci sono un paio di avvertimenti circa trasparenza referenziale:Trasparenza referenziale e mmap in Haskell
La documentazione
E 'sicuro solo per mmap un file se sai che sei l'unico utente. Altrimenti la trasparenza referenziale potrebbe essere o non essere compromessa. Purtroppo la semantica differisce molto tra i sistemi operativi.
I valori che i rendimenti sono mmap IO ByteString
, sicuramente quando uso questo valore con putStr
mi aspetto un risultato diverso ogni volta? Suppongo che l'autore significhi che il valore potrebbe cambiare durante un'operazione IO come putStr
e crash?
di inizio EDIT: Vieni a pensarci bene, credo risposta a questa parte della domanda è alquanto ovvia ... Se il valore cambia in qualsiasi momento dopo è unboxed sarebbe problematico.
do
v <- mappedValue :: IO ByteString
putStr v
putStr v -- Expects the same value of v everywhere
FINE EDIT
non dovrebbe essere possibile acquisire un qualche tipo di blocco sulla regione mappata o sul file?
In alternativa, sarebbe possibile scrivere una funzione copy :: IO ByteString -> IO ByteString
che acquisisca un'istantanea del file nel suo stato corrente in modo sicuro?
Mi sembra che quello che vuoi possa essere fatto anche con un semplice paio di tubi. – leftaroundabout
Sto "guardando" i file in una directory in un modo un po 'generico. Se qualche strumento li tocca, i client vengono aggiornati automaticamente. –
Non c'è davvero nessuna libreria mmap che offra qualcosa di tipo 'IO (Ptr Word8)' o simile? –