Node:Init and Deinit Functions, Next:Creating the Linked Foreign Resource, Previous:The Foreign Resource Linker, Up:Calling C
An init function and/or a deinit function can be declared by
foreign_resource/2
. If this is the case, these functions should
have the prototype:
void
FunctionName (int when)
The init function is called by load_foreign_resource/1
after the
resource has been loaded and the interfaced predicates have been
installed.
If the init function fails (using SP_fail
) or raises an exception
(using SP_raise_exception
), the failure or exception is propagated
by load_foreign_resource/1
and the foreign resource is
unloaded (without calling any deinit
function). However, using
SP_fail
is not recommended, and operations that may require
SP_raise_exception
are probably better done in an initialization
function that is called explicitly after the foreign resource has been
loaded.
The deinit function is called by unload_foreign_resource/1
before
the interfaced predicates have been uninstalled and the resource has
been unloaded.
If the deinit function fails or raises an exception, the failure or
exception is propagated by unload_foreign_resource/1
, but
the foreign resource is still unloaded. However, neither SP_fail
nor SP_raise_exception
should be called in a deinit
function. Complex deinitialization should be done in an explicitly
called deinitialization function instead.
The init and deinit functions may use the C-interface to call Prolog etc.
Foreign resources are unloaded before saving states, and reloaded
afterwards or when the saved state is restored;
see Saving. Foreign resources are also unloaded when
exiting Prolog execution. The parameter when
reflects the context
of the (un)load_foreign_resource/1
and is set as follows for
init functions:
SP_WHEN_EXPLICIT
load_foreign_resource/1
.
SP_WHEN_RESTORE
For deinit functions:
SP_WHEN_EXPLICIT
unload_foreign_resource/1
.
SP_WHEN_SAVE
SP_WHEN_EXIT