cachet/lib-lwt/cachet_lwt.ml

97 lines
3 KiB
OCaml

open Lwt
let load t ?len logical_address =
let cached = Cachet.is_cached t logical_address in
let res = Cachet.load t ?len logical_address in
if not cached then Lwt.pause () >|= fun () -> res else Lwt.return res
let get_uint8 t logical_address =
let res = Cachet.get_uint8 t logical_address in
Lwt.pause () >|= fun () -> res
let get_int8 t logical_address =
let res = Cachet.get_int8 t logical_address in
Lwt.pause () >|= fun () -> res
let is_aligned x = x land ((1 lsl 2) - 1) == 0
let[@inline never] out_of_bounds offset = raise (Cachet.Out_of_bounds offset)
let blit_to_bytes t ~src_off:logical_address buf ~dst_off ~len =
if len < 0 || dst_off < 0 || dst_off > Bytes.length buf - len then
invalid_arg "Cachet_lwt.blit_to_bytes";
let pagesize = Cachet.pagesize t in
let off = logical_address land (pagesize - 1) in
if is_aligned off && pagesize - off >= len then
load t ~len logical_address >|= function
| None -> out_of_bounds logical_address
| Some slice ->
Cachet.Bstr.blit_to_bytes slice.payload ~src_off:off buf ~dst_off:0 ~len
else
let rec go idx =
if idx >= len then Lwt.return_unit
else begin
get_uint8 t (logical_address + idx) >>= fun v ->
Bytes.set_uint8 buf (dst_off + idx) v;
go (succ idx)
end
in
go 0
let get_string t ~len logical_address =
let buf = Bytes.create len in
blit_to_bytes t ~src_off:logical_address buf ~dst_off:0 ~len >|= fun () ->
Bytes.unsafe_to_string buf
open Lwt.Syntax
let get_uint16_ne t logical_address =
let+ str = get_string t ~len:2 logical_address in
String.get_uint16_ne str 0
let get_uint16_le t logical_address =
let+ str = get_string t ~len:2 logical_address in
String.get_uint16_le str 0
let get_uint16_be t logical_address =
let+ str = get_string t ~len:2 logical_address in
String.get_uint16_be str 0
let get_int16_ne t logical_address =
let+ str = get_string t ~len:2 logical_address in
String.get_int16_ne str 0
let get_int16_le t logical_address =
let+ str = get_string t ~len:2 logical_address in
String.get_int16_le str 0
let get_int16_be t logical_address =
let+ str = get_string t ~len:2 logical_address in
String.get_int16_be str 0
let get_int32_ne t logical_address =
let+ str = get_string t ~len:4 logical_address in
String.get_int32_ne str 0
let get_int32_le t logical_address =
let+ str = get_string t ~len:4 logical_address in
String.get_int32_le str 0
let get_int32_be t logical_address =
let+ str = get_string t ~len:4 logical_address in
String.get_int32_be str 0
let get_int64_ne t logical_address =
let+ str = get_string t ~len:8 logical_address in
String.get_int64_ne str 0
let get_int64_le t logical_address =
let+ str = get_string t ~len:8 logical_address in
String.get_int64_le str 0
let get_int64_be t logical_address =
let+ str = get_string t ~len:8 logical_address in
String.get_int64_be str 0
let next t slice =
let pagesize = Cachet.pagesize t in
load t (slice.Cachet.offset + (1 lsl pagesize))