view src/README.kkcc @ 1001:cba22ad5bbfd

[xemacs-hg @ 2002-09-13 20:35:10 by adrian] xemacs-21.5: Install to overwrite existing files, support xemacs_extra_name -------------------- ChangeLog entries follow: -------------------- nt/ChangeLog addition: 2002-09-13 Adrian Aichner <adrian@xemacs.org> * xemacs.mak: Suppress confirmation for overwriting files. * xemacs.mak (installation): Add support for xemacs_extra_name.
author adrian
date Fri, 13 Sep 2002 20:35:11 +0000
parents 964f33d24564
children e22b0213b713
line wrap: on
line source

2002-07-17  Marcus Crestani  <crestani@informatik.uni-tuebingen.de>
	    Markus Kaltenbach  <makalten@informatik.uni-tuebingen.de>
	    Mike Sperber <mike@xemacs.org>

	New KKCC-GC mark algorithm:
	configure flag : --use-kkcc

	For better understanding, first a few words about the mark algorithm 
	up to now:
	Every Lisp_Object has its own mark method, which calls mark_object
	with the stuff to be marked.
	Also, many Lisp_Objects have pdump descriptions, which are used by 
	the portable dumper. The dumper gets all the information it needs 
	about the Lisp_Object from the descriptions.

	Also the garbage collector can use the information in the pdump
	descriptions, so we can get rid of the mark methods.
	That is what we have been doing.

	
	DUMPABLE FLAG
	-------------
	First we added a dumpable flag to lrecord_implementation. It shows,
	if the object is dumpable and should be processed by the dumper.
	The dumpable flag is the third argument of a lrecord_implementation
	definition (DEFINE_LRECORD_IMPLEMENTATION).
	If it is set to 1, the dumper processes the descriptions and dumps
	the Object, if it is set to 0, the dumper does not care about it.
		

	XD_UNION
	--------
	We implemented XD_UNION support in (mark_with_description), so
	we can describe exspecially console/device specific data with XD_UNION.
	To describe with XD_UNION, we added a field to these objects, which 
	holds the variant type of the object. This field is initialized in 
	the appendant constructor. The variant is an integer, it has also to 
	be described in an description, if XD_UNION is used.

	Here is a pattern of a XD_UNION usage:

	First, the existing variants are listed.
	enum example_variant
	{
	  first_choice,
	  second_choice
	};

	Then a field which holds the variant is added to the Lisp_Object.
	This field determines, where pointer points to.
	struct Lisp_...
	{
	  enum example_variant which_variant;
	  ...
	  void *pointer;
	}
	The variant field must be initialized in the constructor(s).

	In the description, the first entry should be the which_variant field,
	on which XD_UNION refers.
	static const struct lrecord_description ..._description [] = {
	  { XD_INT, offsetof (struct Lisp_..., which_variant) },
	  ...
	  { XD_UNION, offsetof (struct Lisp_..., which_variant), 
	    XD_INDIRECT (0, 0), variant_description },
	  ...
	};

	The variant_description looks like this:
	static const struct struct_description variant_description []= {
	  { first_choice, first_choice_description},
	  { second_choice, second_choice__description},
	  { XD_END }
	};

	first- and second_choice_description are common lrecord_descriptions:
	static const struct lrecord_description first_choice_description [] = {
	  ...
	  { XD_END }
	}
	


	TODO
	----

	The following objects have currently no description:
	* alloc.c: lcrecord_list
	mark_object is never called, marking is done per mane.

	* buffer.c: mark_buffer
	mark_conses_in_list implements weakness???

	* extents.c: extent_info
	loop to mark elements in list.

	* frame.c: frame
	calls mark_gutters, that calls mark_redisplay_structs	

	* glyphs.c: image_instance
	XD_UNION or convert the union members to Lisp_Objects (see Lisp_Event)

	* gui-x.c: popup_data
	calls lw_map_widget_values

	* window.c: window
	calls mark_face_cachels and mark_glyph_cachels

		    window_configuration
	loop to mark saved_windows

	            window_mirror
	calls mark_redisplay_structs

	* lstream.c: lstream
	

	After all Lisp_Objects have pdump descriptions, 
	(mark_with_description) can get rid of the mark_object calls.

	
	There are a few Lisp_Objects, where there occured differences and 
	inexactness between the mark-method and the pdump description.
	All these Lisp_Objects get dumped, so their descriptions have been
	written, before we started our work:

	* alloc.c: cons
	description: car and cdr
	mark: cdr is marked, only if its != Qnil

	* alloc.c: string
	description:
	mark:

	* elhash.c: hash_table
	description: the weakness receives no consideration
	mark: weakness == HASH_TABLE_NON_WEAK

	* eval.c: subr
	description: XD_DOC_STRING doc
	mark: empty, nothing is marked

	* file-coding.c: coding_system
	description: 
	mark:

	* frame.c: bit_vektor
	description: XD_LISP_OBJECT next
	mark: empty, nothing is marked

	* marker.c: marker
	description: prev & next (marker's chain)
	mark: do not mark through marker's chain!

	* specifier.c: specifier
	description: XD_STRUCT_PTR caching
	mark: caching is not marked

	* symbols.c: symbol-value-lisp-magic
	description: only handler[] is described
	mark: even harg[] and shadowed are marked

	* data.c: ephemeron
	description: everything is marked, there is no weakness!