With the introduction of atom garbage collection in version 3.3.0, atoms no longer live as long as the process. Instead, their lifetime is guaranteed only as long as they are referenced. In the single-threaded version, atom garbage collections are only invoked at the call-port. In the multithreaded version (see chapter 9), they appear asynchronously, except for the invoking thread.
For dealing with atom garbage collection, two additional functions are provided:
- void PL_register_atom(atom_t atom)
- Increment the reference count of the atom by one. PL_new_atom() performs this automatically, returning an atom with a reference count of at least one.170Otherwise asynchronous atom garbage collection might destroy the atom before it is used.
- void PL_unregister_atom(atom_t atom)
- Decrement the reference count of the atom. If the reference count drops below zero, an assertion error is raised.
Please note that the following two calls are different with respect to atom garbage collection:
PL_unify_atom_chars(t, "text"); PL_unify_atom(t, PL_new_atom("text"));
The latter increments the reference count of the atom
which effectively ensures the atom will never be collected. It is
advised to use the *_chars() or *_nchars() functions whenever