1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-10 14:00:21 +02:00

*** empty log message ***

This commit is contained in:
Marius Vollmer 2005-07-31 23:16:59 +00:00
parent eb074bfc5a
commit 930888e8e8
4 changed files with 63 additions and 36 deletions

11
NEWS
View file

@ -195,6 +195,17 @@ be used with '-e'. For example, you can now write a script like
* Changes to Scheme functions and syntax
** Guardians have changed back to their original semantics
Guardians now behave like described in the paper by Dybvig et al. In
particular, they no longer make guarantees about the order in which
they return objects, and they can no longer be greedy.
They no longer drop cyclic data structures.
The C function scm_make_guardian has been changed incompatibly and no
longer takes the 'greedy_p' argument.
** New function hashx-remove!
This function completes the set of 'hashx' functions.

View file

@ -392,50 +392,56 @@ weak hashes are also weak vectors.
@node Guardians
@subsection Guardians
@deffn {Scheme Procedure} make-guardian [greedy?]
@deffnx {C Function} scm_make_guardian (greedy_p)
Create a new guardian.
A guardian protects a set of objects from garbage collection,
allowing a program to apply cleanup or other actions.
Guardians provide a way to be notified about objects that would
otherwise be collected as garbage. Guarding them prevents the objects
from being collected and cleanup actions can be performed on them, for
example.
See R. Kent Dybvig, Carl Bruggeman, and David Eby (1993) "Guardians in
a Generation-Based Garbage Collector". ACM SIGPLAN Conference on
Programming Language Design and Implementation, June 1993.
@deffn {Scheme Procedure} make-guardian
@deffnx {C Function} scm_make_guardian ()
Create a new guardian. A guardian protects a set of objects from
garbage collection, allowing a program to apply cleanup or other
actions.
@code{make-guardian} returns a procedure representing the guardian.
Calling the guardian procedure with an argument adds the
argument to the guardian's set of protected objects.
Calling the guardian procedure without an argument returns
one of the protected objects which are ready for garbage
collection, or @code{#f} if no such object is available.
Objects which are returned in this way are removed from
Calling the guardian procedure with an argument adds the argument to
the guardian's set of protected objects. Calling the guardian
procedure without an argument returns one of the protected objects
which are ready for garbage collection, or @code{#f} if no such object
is available. Objects which are returned in this way are removed from
the guardian.
@code{make-guardian} takes one optional argument that says whether the
new guardian should be greedy or sharing. If there is any chance
that any object protected by the guardian may be resurrected,
then you should make the guardian greedy (this is the default).
You can put a single object into a guardian more than once and you can
put a single object into more than one guardian. The object will then
be returned multiple times by the guardian procedures.
See R. Kent Dybvig, Carl Bruggeman, and David Eby (1993)
"Guardians in a Generation-Based Garbage Collector".
ACM SIGPLAN Conference on Programming Language Design
and Implementation, June 1993.
An object is eligible to be returned from a guardian when it is no
longer referenced from outside any guardian.
(the semantics are slightly different at this point, but the
paper still (mostly) accurately describes the interface).
@end deffn
There is no guarantee about the order in which objects are returned
from a guardian. If you want to impose an order on finalization
actions, for example, you can do that by keeping objects alive in some
global data structure until they are no longer needed for finalizing
other objects.
@deffn {Scheme Procedure} destroy-guardian! guardian
@deffnx {C Function} scm_destroy_guardian_x (guardian)
Destroys @var{guardian}, by making it impossible to put any more
objects in it or get any objects from it. It also unguards any
objects guarded by @var{guardian}.
@end deffn
Being an element in a weak vector, a key in a hash table with weak
keys, or a value in a hash table with weak value does not prevent an
object from being returned by a guardian. But as long as an object
can be returned from a guardian it will not be removed from such a
weak vector or hash table. In other words, a weak link does not
prevent an object from being considered collectable, but being inside
a guardian prevents a weak link from being broken.
@deffn {Scheme Procedure} guardian-greedy? guardian
@deffnx {C Function} scm_guardian_greedy_p (guardian)
Return @code{#t} if @var{guardian} is a greedy guardian, otherwise @code{#f}.
@end deffn
@deffn {Scheme Procedure} guardian-destroyed? guardian
@deffnx {C Function} scm_guardian_destroyed_p (guardian)
Return @code{#t} if @var{guardian} has been destroyed, otherwise @code{#f}.
A key in a weak key hash table can be though of as having a strong
reference to its associated value as long as the key is accessible.
Consequently, when the key only accessible from within a guardian, the
reference from the key to the value is also considered to be coming
from within a guardian. Thus, if there is no other reference to the
value, it is eligible to be returned from a guardian.
@end deffn

View file

@ -20,6 +20,7 @@
(scm_i_init_guardians_for_gc,
scm_i_identify_inaccessible_guardeds,
scm_i_mark_inaccessible_guardeds): New.
(scm_make_guardian): Removed greedy_p argument.
* weaks.h, weaks.c (SCM_I_WVECT_TYPE, SCM_I_SET_WVECT_TYPE): New.
(SCM_I_WVECT_N_ITEMS, SCM_I_SET_WVECT_N_ITEMS): New.

View file

@ -1,3 +1,12 @@
2005-08-01 Marius Vollmer <mvo@zagadka.de>
* tests/weaks.test: Do not fail when the GC does not collect an
object, report it as 'unresolved'.
* tests/guardians.test: Adapted to new (original) semantics. test
guardingobjects multiple times.
2005-06-12 Marius Vollmer <mvo@zagadka.de>
* standalone/test-gh.c: Do nothing when deprecated things are