Techniques for transparently registering non-memory resources used by a
program with a garbage collector so that the non-memory resources can be
freed when the program is finished using them. The techniques
automatically determine from the program that the execution will use a
resource and then automatically modify the program's behavior so that the
resource is registered. When the program is finished with the resource, it
can be determined from the registry whether the resource must be freed. In
one embodiment, the technique is employed in a garbage collector for doing
resource garbage collection with legacy C and C++ programs. The garbage
collector locates invocations that allocate such resources in the code and
modifies the code so that when it is executed, the resources are
registered. The techniques can also be used to ensure that finalizers
associated with objects are executed before the object is freed. In this
use, the invocation of the constructor for the object is modified so that
the object and its finalizer are registered. When the object is no longer
in use, the garbage collector uses the registry to obtain the object's
finalizer, which it executes before it frees the object. Where the object
represents a resource, execution of the finalizer will free the resource.
Tecniche per trasparente il registro delle risorse non-memory usate da un programma con un collettore dell'immondizia in modo da che le risorse non-memory possono essere liberate quando il programma è rifinito usando. Le tecniche determinano automaticamente a partire dal programma che l'esecuzione usi una risorsa ed allora automaticamente modifichi il comportamento del programma in moda da registrare la risorsa. Quando il programma è rifinito con la risorsa, può essere determinato a partire dalla registrazione se la risorsa debba essere liberata. In un incorporamento, la tecnica è impiegata in un collettore dell'immondizia per fare l'accumulazione dell'immondizia delle risorse con l'eredità C ed i programmi di C++. Il collettore dell'immondizia individua i invocations che stanziano tali risorse nel codice e modifica il codice in moda da quando è eseguito, registrare le risorse. Le tecniche possono anche essere usate per accertarsi che i finalizers connessi con gli oggetti siano eseguiti prima che l'oggetto sia liberato. In questo uso, il invocation del costruttore per l'oggetto è modificato in moda da registrare l'oggetto ed il relativo finalizer. Quando l'oggetto non è più in uso, il collettore dell'immondizia usa la registrazione per ottenere il finalizer dell'oggetto, che esegue prima che liberi l'oggetto. Dove l'oggetto rappresenta una risorsa, l'esecuzione del finalizer libererà la risorsa.