(* $Id: netmcore_ref.mli 1668 2011-09-09 13:28:26Z gerd $ *) (** Shared mutable variables *) type 't sref type 't sref_descr (** The marshallable descriptor of a reference *) val sref : Netmcore.res_id -> 't -> 't sref (** The shared version of [ref]: Creates a mutable shared variable in the given memory pool *) val assign : 't sref -> 't -> unit (** [assign sr x]: Sets the contents of [sr] to a deep copy of [x]. While performing the assignment the heap is write-locked, and no other [assign] can run. *) val deref_ro : 't sref -> 't (** Dereferences the variable and returns the contents, comparable to [!]. Note that this returns a value that lives in shared memory, and there is no guarantee that this value still exists if [assign] operations are done in parallel, and old version are garbage-collected. If such values are accessed the program may crash! *) val deref_p : 't sref -> ('t -> 'a) -> 'a (** [deref_p sr f]: Runs [f] with the contents of [sr], and returns the result of [f]. While [f] is being executed, the current contents are specially protected so that they cannot be garbage collected, even if a parallel [assign] changes the current value of the variable. (Suffix "_p" = pinning version.) *) val deref_c : 't sref -> 't (** [deref_c sr]: Returns a copy of the contents of [sr]. The copy is created in normal memory. (Suffix "_c" = copying version.) *) val heap : 't sref -> Obj.t Netmcore_heap.heap (** Returns the backing heap structure *) val descr_of_sref : 't sref -> 't sref_descr (** Returns the descriptor *) val sref_of_descr : Netmcore.res_id -> 't sref_descr -> 't sref (** Look up the reference for this descriptor *)