|
1 | 1 | (ns pixie.io |
2 | 2 | (require pixie.streams :as st :refer :all) |
3 | 3 | (require pixie.uv :as uv) |
4 | | - (require pixie.stacklets :as st)) |
| 4 | + (require pixie.stacklets :as st) |
| 5 | + (require pixie.ffi :as ffi)) |
5 | 6 |
|
6 | 7 | (defmacro defuvfsfn [nm args return] |
7 | 8 | `(defn ~nm ~args |
|
97 | 98 | (write-byte [this val] |
98 | 99 | (assert false)) |
99 | 100 | (write [this buffer] |
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)) |
| 101 | + (loop [buffer-offset 0] |
| 102 | + (let [_ (pixie.ffi/set! uvbuf :base (ffi/ptr-add buffer buffer-offset)) |
| 103 | + _ (pixie.ffi/set! uvbuf :len (- (count buffer) buffer-offset)) |
| 104 | + write-count (fs_write fp uvbuf 1 (get-field this :offset))] |
| 105 | + (println "offset " offset) |
| 106 | + (when (neg? write-count) |
| 107 | + (throw (uv/uv_err_name read-count))) |
| 108 | + (assert (= write-count (count buffer)) (str "Write error!" write-count " " (count buffer))) |
| 109 | + (set-field! this :offset (+ (get-field this :offset) write-count)) |
| 110 | + (if (< (+ buffer-offset write-count) (count buffer)) |
| 111 | + (recur (+ buffer-offset write-count)) |
| 112 | + write-count)))) |
109 | 113 | IClosable |
110 | 114 | (close [this] |
111 | 115 | (fclose fp))) |
|
117 | 121 | (set-field! this :idx (inc idx)) |
118 | 122 | (when (= idx (buffer-capacity buffer)) |
119 | 123 | (write downstream buffer) |
120 | | - (set-field this :idx 0))) |
| 124 | + (set-field! this :idx 0))) |
121 | 125 | IClosable |
122 | 126 | (close [this] |
123 | 127 | (set-buffer-count! buffer idx) |
|
0 commit comments