Module Core__.Iobuf
- type nonrec seek- = Core.Iobuf_intf.seek
- val sexp_of_seek : seek -> Ppx_sexp_conv_lib.Sexp.t
- type nonrec no_seek- = Core.Iobuf_intf.no_seek
- val sexp_of_no_seek : no_seek -> Ppx_sexp_conv_lib.Sexp.t
- type (-'data_perm_read_write, +'seek_permission) t
- The first type parameter controls whether the iobuf can be written to. The second type parameter controls whether the window and limits can be changed. - See the - Permsmodule for information on how the first type parameter is used.- To allow - no_seekor- seekaccess, a function's type uses- _rather than- no_seekas the type argument to- t. Using- _allows the function to be directly applied to either permission. Using a specific permission would require code to use coercion- :>.- There is no - t_of_sexp. One should use- Iobuf.Hexdump.t_of_sexpor- sexp_opaqueas desired.
include Core__.Import.Invariant.S2 with type ('rw, 'seek) t := ('rw, 'seek) t
- val invariant : 'a Base__.Invariant_intf.inv -> 'b Base__.Invariant_intf.inv -> ('a, 'b) t Base__.Invariant_intf.inv
- module Window : Core__.Import.Hexdump.S2 with type ('rw, 'seek) t := ('rw, 'seek) t
- Provides a - Window.Hexdumpsubmodule that renders the contents of- t's window.
- module Limits : Core__.Import.Hexdump.S2 with type ('rw, 'seek) t := ('rw, 'seek) t
- Provides a - Limits.Hexdumpsubmodule that renders the contents of- t's limits.
Provides a Hexdump submodule that renders the contents of t's window and limits using indices relative to the limits.
include Core.Iobuf_intf.Compound_hexdump with type ('rw, 'seek) t := ('rw, 'seek) t
module Hexdump : sig ... end- module Debug : Core.Iobuf_intf.Compound_hexdump with type ('rw, 'seek) t := ('rw, 'seek) t
- Provides a - Debug.Hexdumpsubmodule that renders the contents of- t's window, limits, and underlying bigstring using indices relative to the bigstring.
Creation
- val create : len:int -> (_, _) t
- create ~lencreates a new iobuf, backed by a bigstring of length- len, with the limits and window set to the entire bigstring.
- val of_bigstring : ?pos:int -> ?len:int -> Core__.Import.Bigstring.t -> ([< Core__.Import.read_write ], _) t
- of_bigstring bigstring ~pos ~lenreturns an iobuf backed by- bigstring, with the window and limits specified starting at- posand of length- len.- forbid - immutableto prevent aliasing
- val of_string : string -> (_, _) t
- of_string sreturns a new iobuf whose contents are- s.
- sub_shared t ~pos ~lenreturns a new iobuf with limits and window set to the subrange of- t's window specified by- posand- len.- sub_sharedpreserves data permissions, but allows arbitrary seek permissions on the resulting iobuf.
- val set_bounds_and_buffer : src:([> Core__.Import.write ] as data, _) t -> dst:('data, seek) t -> unit
- set_bounds_and_buffer ~src ~dstcopies bounds metadata (i.e., limits and window) and shallowly copies the buffer (data pointer) from- srcto- dst. It does not access data, but does allow access through- dst. This makes- dstan alias of- src.- Because - set_bounds_and_buffercreates an alias, we disallow immutable- srcand- dstusing- [> write]. Otherwise, one of- srcor- dstcould be- read_write :> readand the other- immutable :> read, which would allow you to write the- immutablealias's data through the- read_writealias.- set_bounds_and_bufferis typically used with a frame iobuf that need only be allocated once. This frame can be updated repeatedly and handed to users, without further allocation. Allocation-sensitive applications need this.
- val set_bounds_and_buffer_sub : pos:int -> len:int -> src:([> Core__.Import.write ] as data, _) t -> dst:('data, seek) t -> unit
- set_bounds_and_buffer_sub ~pos ~len ~src ~dstis a more efficient version of- set_bounds_and_buffer ~src:(Iobuf.sub_shared ~pos ~len src) ~dst.- set_bounds_and_buffer ~src ~dstis not the same as- set_bounds_and_buffer_sub ~dst ~src ~len:(Iobuf.length src)because the limits are narrowed in the latter case.- ~lenand- ~posare mandatory for performance reasons, in concert with- @@inline. If they were optional, allocation would be necessary when passing a non-default, non-constant value, which is an important use case.
- val read_only : ([> Core__.Import.read ], 's) t -> (Core__.Import.read, 's) t
- Generalization- One may wonder why you'd want to call - no_seek, given that a cast is already possible, e.g.,- t : (_, seek) t :> (_, no_seek) t. It turns out that if you want to define some- f : (_, _) t -> unitof your own that can be conveniently applied to- seekiobufs without the user having to cast- seekup, you need this- no_seekfunction.- read_onlyis more of a historical convenience now that- read_writeis a polymorphic variant, as one can now explicitly specify the general type for an argument with something like- t : (_ perms, _) t :> (read, _) t.
Accessors
- val capacity : (_, _) t -> int
- capacity treturns the size of- t's limits subrange. The capacity of an iobuf can be reduced via- narrow.
- val length : (_, _) t -> int
- length treturns the size of- t's window.
- val is_empty : (_, _) t -> bool
- is_empty tis- length t = 0.
Changing the limits
Changing the window
module type Bound : Core.Iobuf_intf.Bound with type ('d, 'w) iobuf := ('d, 'w) t- val advance : (_, seek) t -> int -> unit
- advance t amountadvances the lower bound of the window by- amount. It is an error to advance past the upper bound of the window or the lower limit.
- val unsafe_advance : (_, seek) t -> int -> unit
- unsafe_advanceis like- advancebut with no bounds checking, so incorrect usage can easily cause segfaults.
- val resize : (_, seek) t -> len:int -> unit
- resize tsets the length of- t's window, provided it does not exceed limits.
- val unsafe_resize : (_, seek) t -> len:int -> unit
- unsafe_resizeis like- resizebut with no bounds checking, so incorrect usage can easily cause segfaults.
- val flip_lo : (_, seek) t -> unit
- flip_lo tsets the window to range from the lower limit to the lower bound of the old window. This is typically called after a series of- Fills, to reposition the window in preparation to- Consumethe newly written data.- The bounded version narrows the effective limit. This can preserve some data near the limit, such as a hypothetical packet header (in the case of - bounded_flip_lo) or unfilled suffix of a buffer (in- bounded_flip_hi).
- val bounded_flip_lo : (_, seek) t -> Lo_bound.t -> unit
- val compact : (Core__.Import.read_write, seek) t -> unit
- compact tcopies data from the window to the lower limit of the iobuf and sets the window to range from the end of the copied data to the upper limit. This is typically called after a series of- Consumes to save unread data and prepare for the next series of- Fills and- flip_lo.
- val bounded_compact : (Core__.Import.read_write, seek) t -> Lo_bound.t -> Hi_bound.t -> unit
- val flip_hi : (_, seek) t -> unit
- flip_hi tsets the window to range from the the upper bound of the current window to the upper limit. This operation is dual to- flip_loand is typically called when the data in the current (narrowed) window has been processed and the window needs to be positioned over the remaining data in the buffer. For example:- (* ... determine initial_data_len ... *) Iobuf.resize buf ~len:initial_data_len; (* ... and process initial data ... *) Iobuf.flip_hi buf;- Now the window of - bufranges over the remainder of the data.
Getting and setting data
"consume" and "fill" functions access data at the lower bound of the window and advance the lower bound of the window. "peek" and "poke" functions access data but do not advance the window.
- val to_string : ?len:int -> ([> Core__.Import.read ], _) t -> string
- to_string treturns the bytes in- tas a string. It does not alter the window.
- val to_string_hum : ?max_lines:int -> (_, _) t -> string
- Equivalent to - Hexdump.to_string_hum. Renders- t's windows and limits.
- val to_bytes : (_, _) t -> Core__.Import.Bytes.t
- to_bytes treturns the bytes in- tas a bytes. It does not alter the window.
- val of_bytes : Core__.Import.Bytes.t -> (_, _) t
- of_bytes breturns a new iobuf whose contents is- b.
- module Consume : sig ... end
- Consume.string t ~lenreads- lencharacters (all, by default) from- tinto a new string and advances the lower bound of the window accordingly.
- module Fill : sig ... end
- Fill.bin_prot X.bin_write_t t xwrites- xto- tin bin-prot form, advancing past the bytes written.
- module Peek : sig ... end
- Peekand- Pokefunctions access a value at- posfrom the lower bound of the window and do not advance.
- module Poke : sig ... end
- Poke.bin_prot X.bin_write_t t xwrites- xto the beginning of- tin binary form without advancing. You can use- X.bin_size_tto tell how long it was.- X.bin_write_tis only allowed to write that portion of the buffer you have access to.
- module Unsafe : sig ... end
- Unsafehas submodules that are like their corresponding module, except with no range checks. Hence, mistaken uses can cause segfaults. Be careful!
- val bin_prot_length_prefix_bytes : int
- The number of bytes in the length prefix of - consume_bin_protand- fill_bin_prot.
- val fill_bin_prot : ([> Core__.Import.write ], seek) t -> 'a Bin_prot.Type_class.writer -> 'a -> unit Core__.Import.Or_error.t
- fill_bin_protwrites a bin-prot value to the lower bound of the window, prefixed by its length, and advances by the amount written.- fill_bin_protreturns an error if the window is too small to write the value.- consume_bin_prot t readerreads a bin-prot value from the lower bound of the window, which should have been written using- fill_bin_prot, and advances the window by the amount read.- consume_bin_protreturns an error if there is not a complete message in the window and in that case the window is left unchanged.- Don't use these without a good reason, as they are incompatible with similar functions in - Readerand- Writer. They use a 4-byte length rather than an 8-byte length.
- val consume_bin_prot : ([> Core__.Import.read ], seek) t -> 'a Bin_prot.Type_class.reader -> 'a Core__.Import.Or_error.t
- module Blit : sig ... end
- Blitcopies between iobufs and advances neither- srcnor- dst.
- module Blit_consume : sig ... end
- Blit_consumecopies between iobufs and advances- srcbut does not advance- dst.
- module Blit_fill : sig ... end
- Blit_fillcopies between iobufs and advances- dstbut does not advance- src.
- module Blit_consume_and_fill : sig ... end
- Blit_consume_and_fillcopies between iobufs and advances both- srcand- dst.
I/O
- val compare_ok_or_eof : ok_or_eof -> ok_or_eof -> int
- val sexp_of_ok_or_eof : ok_or_eof -> Ppx_sexp_conv_lib.Sexp.t
- val input : ([> Core__.Import.write ], seek) t -> Core__.Import.In_channel.t -> ok_or_eof
- Iobufhas analogs of various- Bigstringfunctions. These analogs advance by the amount written/read.
- val read : ([> Core__.Import.write ], seek) t -> Core.Iobuf_intf.Unix.File_descr.t -> ok_or_eof
- val read_assume_fd_is_nonblocking : ([> Core__.Import.write ], seek) t -> Core.Iobuf_intf.Unix.File_descr.t -> Core__.Syscall_result.Unit.t
- val pread_assume_fd_is_nonblocking : ([> Core__.Import.write ], seek) t -> Core.Iobuf_intf.Unix.File_descr.t -> offset:int -> unit
- val recvfrom_assume_fd_is_nonblocking : ([> Core__.Import.write ], seek) t -> Core.Iobuf_intf.Unix.File_descr.t -> Core.Iobuf_intf.Unix.sockaddr
- module Recvmmsg_context : sig ... end with type ('rw, 'seek) iobuf := ('rw, 'seek) t
- recvmmsg's context comprises data needed by the system call. Setup can be expensive, particularly for many buffers.
- val recvmmsg_assume_fd_is_nonblocking : (Core.Iobuf_intf.Unix.File_descr.t -> Recvmmsg_context.t -> Core.Iobuf_intf.Unix.Syscall_result.Int.t) Core__.Import.Or_error.t
- recvmmsg_assume_fd_is_nonblocking fd contextreturns the number of- contextiobufs read into (or- errno).- fdmust not block.- THREAD_IO_CUTOFFis ignored.- EINVALis returned if an- Iobufpassed to- Recvmmsg_context.createhas its- bufor limits changed.
- val send_nonblocking_no_sigpipe : unit -> (([> Core__.Import.read ], seek) t -> Core.Iobuf_intf.Unix.File_descr.t -> Core.Iobuf_intf.Unix.Syscall_result.Unit.t) Core__.Import.Or_error.t
- val sendto_nonblocking_no_sigpipe : unit -> (([> Core__.Import.read ], seek) t -> Core.Iobuf_intf.Unix.File_descr.t -> Core.Iobuf_intf.Unix.sockaddr -> Core.Iobuf_intf.Unix.Syscall_result.Unit.t) Core__.Import.Or_error.t
- val output : ([> Core__.Import.read ], seek) t -> Core__.Import.Out_channel.t -> unit
- val write : ([> Core__.Import.read ], seek) t -> Core.Iobuf_intf.Unix.File_descr.t -> unit
- val write_assume_fd_is_nonblocking : ([> Core__.Import.read ], seek) t -> Core.Iobuf_intf.Unix.File_descr.t -> unit
- val pwrite_assume_fd_is_nonblocking : ([> Core__.Import.read ], seek) t -> Core.Iobuf_intf.Unix.File_descr.t -> offset:int -> unit
Expert
- module Expert : sig ... end
- The - Expertmodule is for building efficient out-of-module- Iobufabstractions.