Esperaba usar System.INotify y System.IO.MMap juntos para ver las modificaciones de los archivos y luego realizar rápidamente diffs para enviar parches a través de una red. Sin embargo, en la documentación de System.IO.MMap hay un par de advertencias sobre transparencia referencial:Transparencia referencial y mmap en Haskell
La documentación indica
Sólo es seguro para mmap un archivo si sabe que es el único usuario. De lo contrario, la transparencia referencial puede o no verse comprometida. Lamentablemente, la semántica difiere mucho entre los sistemas operativos.
Los valores que los retornos son Mmap IO ByteString
, seguramente cuando se utiliza este valor con putStr
Estoy esperando un resultado diferente cada vez? Supongo que el autor quiere decir que el valor podría cambiar durante una operación IO como putStr
y bloquearse?
COMIENZO DE LA EDICIÓN: Ahora que lo pienso, supongo que la respuesta a esta parte de la pregunta es algo obvio ... Si el valor cambia en cualquier momento después de que se haya desagrupado, sería problemático.
do
v <- mappedValue :: IO ByteString
putStr v
putStr v -- Expects the same value of v everywhere
FIN-DE-EDIT
¿No debería ser posible adquirir algún tipo de bloqueo en la región asignada o en el archivo?
Como alternativa, ¿sería posible escribir una función copy :: IO ByteString -> IO ByteString
que tome una instantánea del archivo en su estado actual de forma segura?
Me parece que lo que quiere también se puede hacer con un simple par de tubos. – leftaroundabout
Estoy "mirando" los archivos en un directorio de una manera un tanto genérica. Si alguna herramienta los toca, los clientes se actualizan automáticamente. –
¿Realmente no hay una biblioteca mmap que ofrezca algo de tipo 'IO (Ptr Word8)' o similar? –