Buggy version - can't find the segfault right now.
[ocaml-ancient.git] / ancient.mli
index 8740706..50d6c8a 100644 (file)
@@ -1,5 +1,5 @@
 (** Mark objects as 'ancient' so they are taken out of the OCaml heap.
-  * $Id: ancient.mli,v 1.2 2006-09-27 15:36:18 rich Exp $
+  * $Id: ancient.mli,v 1.3 2006-09-27 18:39:44 rich Exp $
   *)
 
 type 'a ancient
@@ -32,39 +32,59 @@ val delete : 'a ancient -> unit
 
 (** {6 Shared memory mappings} *)
 
-val share : Unix.file_descr -> 'a -> 'a ancient
-  (** [share fd obj] does the same as {!Ancient.mark} except
+type md
+  (** Memory descriptor handle. *)
+
+val attach : Unix.file_descr -> md
+  (** [attach fd] attaches to a new or existing file which may contain
+    * shared objects.
+    *
+    * Initially [fd] should be a read/writable, zero-length file
+    * (see {!Unix.openfile}).  One or more objects can then be
+    * shared in this file using {!Unix.share}.
+    *)
+
+val detach : md -> unit
+  (** [detach md] detaches from an existing file, and closes it.
+    *)
+
+val share : md -> int -> 'a -> 'a ancient
+  (** [share md key obj] does the same as {!Ancient.mark} except
     * that instead of copying the object into local memory, it
-    * writes it into memory which is backed by the file [fd].
-    * [fd] should be a writable, zero-length file (see
-    * {!Unix.openfile}).
+    * writes it into memory which is backed by the attached file.
     *
     * Shared mappings created this way may be shared between
     * other OCaml processes which can access the underlying
     * file.  See {!Ancient.attach}, {!Ancient.detach}.
     *
+    * More than one object can be stored in a file.  They are
+    * indexed using integers in the range [0..1023] (the limit
+    * is hard-coded in [mmalloc/mmprivate.h]).  The [key] parameter
+    * controls which object is written/overwritten by [share].
+    * If you do not wish to use this feature, just pass [0]
+    * as the key.
+    *
     * Do not call {!Ancient.delete} on a mapping created like this.
     * Instead, call {!Ancient.detach} and, if necessary, delete the
     * underlying file.
+    *
+    * Caution when sharing files/objects between processes:
+    * The underlying [mmalloc] library does not do any sort of
+    * locking, so all calls to [share] must ensure that they have
+    * exclusive access to the underlying file while in progress.
     *)
 
-val attach : Unix.file_descr -> 'a ancient
-  (** [attach fd] takes an existing file which was created by
-    * {!Ancient.share} and accesses the object contained
-    * in it.
+val get : md -> int -> 'a ancient
+  (** [get md key] returns the object indexed by [key] in the
+    * attached file.
     *
-    * You need to force the return type to be the correct type
-    * for the object contained in the file.  As with Marshal,
-    * the type is not checked, and if it is wrong a segfault
-    * is likely.
+    * The key is in the range [0..1023] (the limit is hard-coded in
+    * [mmalloc/mmprivate.h]).
     *
-    * Do not call {!Ancient.delete} on a mapping created like this.
-    * Instead, call {!Ancient.detach} and, if necessary, delete the
-    * underlying file.
-    *)
-
-val detach : 'a ancient -> unit
-  (** [detach obj] detaches from a shared mapping.
+    * You need to annotate the returned object with the correct
+    * type.  As with the Marshal module, there is no type checking,
+    * and setting the wrong type will likely cause a segfault
+    * or undefined behaviour.
     *
-    * @raise [Invalid_argument "detached"] if the object has been detached.
+    * @raises [Not_found] if no object is associated with the key.
     *)