"Finalize tree" to break XPCOM cycles and have clean shutdowns -------------------------------------------------------------- XMLterm class embedding hierarchy ================================= mozXMLTermShell (or ../geckoterm/mozGeckoTerm) | | mozXMLTerminal +-----------------+----------------+ | | | mozXMLTermSession mozLineTermAux mozXMLTermListeners | | | | mozXMLTermStream... (lineterm) We would like to have clean shutdowns of an XMLterm, since we are using external resources, e.g., a shell process or an rlogin process. However, the XPCOM reference counting can hinder shutdowns, if there cycles. To avoid that, the XMLterm interfaces have a Finalize or Close method. A shutdown event triggers a call to the Finalize method of the root interface in the "Finalize tree". When the Finalize method of any interface is called, it first calls the Finalize methods of any child nodes in the Finalize tree, then releases all the XPCOM references it owns, de-initializes itself and quietly waits for its reference count to go to zero. In this "closed" state of the interface, any attempts use it result in an error return. The destructor of an object simply checks if all its interfaces have been finalized, and calls the Finalize methods for any that have not been. --