Skip to content

Commit 9490bb1

Browse files
committed
updated spit to use async io
1 parent 249463e commit 9490bb1

2 files changed

Lines changed: 54 additions & 14 deletions

File tree

pixie/io.pxi

Lines changed: 52 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
(defuvfsfn fs_open [path flags mode] :result)
2525
(defuvfsfn fs_read [file bufs nbufs offset] :result)
26+
(defuvfsfn fs_write [file bufs nbufs offset] :result)
2627
(defuvfsfn fs_close [file] :result)
2728

2829

@@ -59,13 +60,15 @@
5960
@result))
6061
acc))))))
6162

63+
6264
(defn open-read
6365
{:doc "Open a file for reading, returning a IInputStream"
6466
:added "0.1"}
6567
[filename]
6668
(assert (string? filename) "Filename must be a string")
6769
(->FileStream (fs_open filename uv/O_RDONLY 0) 0 (uv/uv_buf_t)))
6870

71+
6972
(defn read-line
7073
"Read one line from input-stream for each invocation.
7174
nil when all lines have been read"
@@ -89,27 +92,65 @@
8992
(when-let [line (read-line input-stream)]
9093
(cons line (lazy-seq (line-seq input-stream)))))
9194

92-
(deftype FileOutputStream [fp]
95+
(deftype FileOutputStream [fp offset uvbuf]
9396
IOutputStream
9497
(write-byte [this val]
95-
(assert (integer? val) "Value must be a int")
96-
(fputc val fp))
98+
(assert false))
9799
(write [this buffer]
98-
(fwrite buffer 1 (count buffer) fp))
100+
(let [_ (pixie.ffi/set! uvbuf :base buffer)
101+
_ (pixie.ffi/set! uvbuf :len (count buffer))
102+
write-count (fs_write fp uvbuf 1 offset)]
103+
(when (neg? write-count)
104+
(throw (uv/uv_err_name read-count)))
105+
(assert (= write-count (count buffer)) (str "Write error!" write-count " " (count buffer)))
106+
(set-field! this :offset (+ offset write-count))
107+
(set-buffer-count! buffer write-count)
108+
write-count))
99109
IClosable
100110
(close [this]
101111
(fclose fp)))
102112

113+
(deftype BufferedOutputStream [downstream idx buffer]
114+
IOutputStream
115+
(write-byte [this val]
116+
(pixie.ffi/pack! buffer idx CUInt8 val)
117+
(set-field! this :idx (inc idx))
118+
(when (= idx (buffer-capacity buffer))
119+
(write downstream buffer)
120+
(set-field this :idx 0)))
121+
IClosable
122+
(close [this]
123+
(set-buffer-count! buffer idx)
124+
(write downstream buffer)))
125+
126+
(defn buffered-output-stream [downstream size]
127+
(->BufferedOutputStream downstream 0 (buffer size)))
128+
129+
130+
(defn throw-on-error [result]
131+
(when (neg? result)
132+
(throw (uv/uv_err_name result)))
133+
result)
134+
135+
(defn open-write
136+
{:doc "Open a file for reading, returning a IInputStream"
137+
:added "0.1"}
138+
[filename]
139+
(assert (string? filename) "Filename must be a string")
140+
(->FileOutputStream (throw-on-error (fs_open filename uv/O_WRONLY 0))
141+
0
142+
(uv/uv_buf_t)))
143+
144+
103145
(defn file-output-rf [filename]
104-
(let [fp (->FileOutputStream (fopen filename "w"))]
146+
(let [fp (buffered-output-stream (open-write filename)
147+
DEFAULT-BUFFER-SIZE)]
105148
(fn ([] 0)
106-
([cnt] (close fp) cnt)
107-
([cnt chr]
149+
([_] (close fp) nil)
150+
([_ chr]
108151
(assert (integer? chr))
109-
(let [written (write-byte fp chr)]
110-
(if (= written 0)
111-
(reduced cnt)
112-
(+ cnt written)))))))
152+
(write-byte fp chr)
153+
nil))))
113154

114155

115156
(defn spit [filename val]

tests/pixie/tests/test-io.pxi

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
(ns pixie.tests.test-io
22
(require pixie.test :as t)
3-
(require pixie.io-blocking :as io))
3+
(require pixie.io :as io))
44

55
(t/deftest test-file-reduction
66
(let [f (io/open-read "tests/pixie/tests/test-io.txt")]
@@ -24,8 +24,7 @@
2424
s (io/line-seq f)]
2525
(t/assert= (last s) "Second line.")))
2626

27-
(comment
27+
2828
(t/deftest test-slurp-spit
2929
(let [val (vec (range 128))]
3030
(t/assert= val (read-string (io/slurp "test.tmp" (io/spit "test.tmp" val))))))
31-
)

0 commit comments

Comments
 (0)