As of SWI-Prolog 8.3.2 the foreign API provides access to the 
internal thread-safe and lock-free hash tables that associate pointers 
or objects that fit in a pointer such as atoms (atom_t). An 
argument against providing these functions is that they have little to 
do with Prolog. The argument in favor is that it is hard to implement 
efficient lock-free tables without low-level access to the underlying 
Prolog threads and exporting this interface has a low cost.
The functions below can only be called if the calling thread is 
associated with a Prolog thread. Failure to do so causes the call to 
be ignored or return the failure code where applicable.
- hash_table_t PL_new_hash_table(int 
size, void (*free_symbol)(void *n, void *v))
 - Create a new table for size key-value pairs. The table is 
resized when needed. If you know the table will hold 10,000 key-value 
pairs, providing a suitable initial size avoids resizing. The free_symbol 
function is called whenever a key-value pair is removed from the table. 
This can be 
NULL. 
- int PL_free_hash_table(hash_table_t 
table)
 - Destroy the hash table. First calls PL_clear_hash_table().
 
- void* PL_lookup_hash_table(hash_table_t 
table, void *key)
 - Return the value matching key or 
NULL if key 
does not appear in the table. 
- void* PL_add_hash_table(hash_table_t 
table, void *key, void *value, int flags)
 - Add key-value to the table. The behaviour if key 
is already in the table depends on flags. If 
0, 
this function returns the existing value without updating the table. If
PL_HT_UPDATE the old value is replaced 
and the function returns the old value. If PL_HT_NEW, a 
message and backtrace are printed and the function returns NULL 
if key is already in the table. 
- void* PL_del_hash_table(hash_table_t 
table, void *key)
 - Delete key from the table, returning the old associated value 
or
NULL 
- int PL_clear_hash_table(hash_table_t 
table)
 - Delete all key-value pairs from the table. Call free_symbol 
for each deleted pair.
 
- hash_table_enum_t PL_new_hash_table_enum(hash_table_t 
table)
 - Return a table enumerator (cursor) that can be used to 
enumerate all key-value pairs using PL_advance_hash_table_enum(). 
The enumerator must be discarded using PL_free_hash_table_enum(). 
It is safe for another thread to add symbols while the table is being 
enumerated, but undefined whether or not these new symbols are visible. 
If another thread deletes a key that is not yet enumerated it will not 
be enumerated.
 
- void PL_free_hash_table_enum(hash_table_enum_t 
e)
 - Discard an enumerator object created using PL_new_hash_table_enum(). 
Failure to do so causes the table to use more and more memory on 
subsequent modifications.
 
- int PL_advance_hash_table_enum(hash_table_enum_t 
e, void **key, void **value)
 - Get the next key-value pair from a cursor.