Shared arrays
This type of array is to some degree comparable with Array
, but
there are a few extensions:
Arrays where the elements have type 'e
and the header has
type 'h
The marshallable descriptor of a shared array
init pool_id n f h
:
Creates a shared array of the passed number of elements,
and for getting the element at position k
the function
f k
is run, and the copy of the result is written to the
position. The header is set to the copy of h
.
grow sa n x
: Grows the array to n
elements. The new elements
are initialized to a (single) copy of x
.
If n
is smaller than the current length, the function will do
nothing, and keep the length.
set sa k x
: Sets the k-th
element of the array sa
to a
deep copy of x
.
get_ro sa k
: Gets the k
-th element of the shared array sa
.
Note that there is no guarantee that this value still exists if
it is returned, and a parallely running set
changes this element.
If such values are accessed the program may crash!
get_p sa k f
: Gets the k
-th element of the shared array sa
and call f
with this element, and returns the result of f
.
During the execution of f
the requested element cannot be
garbage collected.
get_c sa k
: Gets a copy of the k
-th element of the shared array
sæ
Returns the raw array in shared memory for unprotected access
Look up the buffer for this descriptor
Special care has to be taken when mutating header fields. The header must completely live in the same heap. For adding new values, one has to use Netmcore_heap.modify. Example for a header of type:
type header =
{ mutable n : int;
mutable name : string
}
Here, the field n
can be directly assigned because an int
is always an unboxed value. So,
h.n <- new_value
is legal. However, strings are heap-allocated. For an assignment
to name
we need to use Netmcore_heap.modify, as in
Netmcore_heap.modify
(Netmcore_array.heap sa)
(fun mutator ->
h.name <- Netmcore_heap.add mutator new_value
)
The function Netmcore_heap.add pushes a copy of the new_value
to the heap, and this allows us to do the assignment.
During [root:Netcore_heap].modify certain operations are prohibited because they would cause a deadlock:
grow
set
get_p
get_c
(This may be relaxed in a future version.)