summaryrefslogtreecommitdiffstats
path: root/tests/017/mmap.tl
diff options
context:
space:
mode:
Diffstat (limited to 'tests/017/mmap.tl')
-rw-r--r--tests/017/mmap.tl52
1 files changed, 52 insertions, 0 deletions
diff --git a/tests/017/mmap.tl b/tests/017/mmap.tl
new file mode 100644
index 00000000..aab86a0e
--- /dev/null
+++ b/tests/017/mmap.tl
@@ -0,0 +1,52 @@
+(load "../common")
+
+(defun parent (wp mm)
+ (with-stream (s (open-fileno wp "w"))
+ (each ((i 0..1024))
+ (set [mm i] i))
+ (put-char #\X s)))
+
+(defun child (rp mm)
+ (let ((s (open-fileno rp "r")))
+ (assert (eq (get-char s) #\X))
+ (each ((i 0..1024))
+ (assert (eql [mm i] i)))))
+
+(let ((mm (mmap (ffi uint32) 4096
+ (logior prot-read prot-write)
+ (logior map-anon map-shared))))
+ (tree-bind (rp . wp) (pipe)
+ (match-ecase (fork)
+ (0 (child rp mm)
+ (exit t))
+ (-1 (error "fork failed"))
+ (@pid (parent wp mm)
+ (tree-bind (p . s) (wait pid)
+ (unless (zerop s)
+ (error "child failed")))))))
+
+(assert (plusp page-size))
+
+(let* ((mk-rnd-buf (opip (expt 256 page-size) rand buf-uint))
+ (rndbuf0 [mk-rnd-buf])
+ (rndbuf1 [mk-rnd-buf])
+ (fname "rand.bin"))
+ (unwind-protect
+ (progn
+ (file-put-buf fname rndbuf0)
+ (let* ((mm (mmap (ffi uchar) page-size
+ (logior prot-read prot-write)
+ (logior map-shared)
+ fname)))
+ (each ((i 0..page-size))
+ (assert (eq [rndbuf0 i] [mm i]))
+ (set [mm i] [rndbuf1 i]))
+ (msync mm ms-sync)
+ (assert (equal (file-get-buf fname) rndbuf1))
+ (each ((i 0..page-size))
+ (set [mm i] [rndbuf0 i]))
+ (munmap mm))
+ (assert (equal (file-get-buf fname) rndbuf0)))
+ (remove-path fname)))
+
+(assert (null (ignerr (mmap (ffi char) 4096 prot-read map-anon))))