Availability:C-language interface function
int PL_cleanup(int 
status_and_flags)This function may be called instead of PL_halt() 
to cleanup Prolog without exiting the process. It performs the reverse 
of
PL_initialise(). 
It runs the PL_on_halt() 
and at_halt/1 
handlers, closes all streams (except for the standard I/O 
streams, which are flushed only), restores all signal handlers and 
reclaims all memory unless asked not to. status_and_flags 
accepts the following flags:
- PL_CLEANUP_NO_RECLAIM_MEMORY
- Do not reclaim memory. This is the default when called from PL_halt() 
for the release versions because the OS will do so anyway.
- PL_CLEANUP_NO_CANCEL
- Do not allow Prolog and foreign halt hooks to cancel the 
cleanup.
The return value of PL_cleanup() 
is one of the following:
- PL_CLEANUP_CANCELED
- A Prolog or foreign halt hook cancelled the cleanup. Note that 
some of the halt hooks may have been executed.
- PL_CLEANUP_SUCCESS
- Cleanup completed successfully. Unless PL_CLEANUP_NO_RECLAIM_MEMORYwas specified this implies most of the memory was reclaimed and Prolog 
may be reinitialized in the same process using PL_initialise().
- PL_CLEANUP_FAILED
- Cleanup failed. This happens if the user requested to reclaim all memory 
but this failed because the system was not able to
join all Prolog threads and could therefore not reclaim the 
memory.
- PL_CLEANUP_RECURSIVE
- PL_cleanup() 
was called from a hook called by the cleanup process.
PL_cleanup() 
allows deleting and restarting the Prolog system in the same process. In 
versions older than 8.5.9 this did not work. As of version 8.5.9, it 
works for the basic Prolog engine. Many of the plugins that contain 
foreign code do not implement a suitable uninstall handler and 
will leak memory and possibly other resources. Note that shutting Prolog 
down and renitializing it is slow. For almost all scenarios there are 
faster alternatives such as reloading modified code, using temporary 
modules, using threads, etc.