Did you know ... | Search Documentation: |
Accessing blobs |
The blob access functions are similar to the atom accessing functions. Blobs being atoms, the atom functions operate on blobs and vice versa. For clarity and possible future compatibility issues, however, it is not advised to rely on this.
PL_BLOB_UNIQUE
set, search
the blob database for a blob of the same type with the same content. If
found, unify t with the existing handle.PL_BLOB_UNIQUE
is not set, create a new
blob handle. If PL_BLOB_NOCOPY
is set, associate it to the
given memory; else, copy the memory to a new area owned by the blob.
Call the acquire()
function of the type.It is possible that a blob referencing critial resources is created after which the unification fails. Typically these resources are eventually reclaimed because the new blob is not referenced and reclaimed by the atom garbage collector. As described with the release() function, it can be desirable to reclaim the critical resources after the failing PL_unify_blob() call.
FALSE
) or the blob is a
reference to an existing blob (TRUE
). Reporting
new/existing can be used to deal with external objects having their own
reference counts. If the return is TRUE
this reference
count must be incremented, and it must be decremented on blob
destruction callback. See also
PL_put_atom_nchars().TRUE
. Otherwise return FALSE
. Each result
pointer may be NULL
, in which case the requested
information is ignored.NULL
. During normal
execution it may return the content of a newly allocated blob that
reuses the released handle.PL_BLOB_NOCOPY
flag set and the blob type implements the
release()
callback. It causes the release()
callback to be called, after which the data and size are set to 0 if the release()
returns TRUE
. After this sequence, the release()
for this blob is never called again. The related atom_t
handle remains valid until it is no longer referenced and reclaimed by
the atom garbage collector. If the blob data is accessed using e.g., PL_get_blob()
it returns NULL
for the data and 0 for the size.227This
means that any predicates or callbacks that use the blob must check the
result of PL_blob_data().
If the release()
function is not called, or if it returns FALSE
, FALSE
is returned.
PL_free_blob()
may be called multiple times on the same
atom_t
, provided the handle is still valid. Subsequent
calls after a successful call have no effect and return FALSE
.