Files
harbour-core/harbour/doc/en/garbage.txt
Viktor Szakats bb40624dbe 2010-02-20 21:19 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
+ doc/en
  - doc/en-EN
  - contrib/hbgt/doc/en-EN
  + contrib/hbgt/doc/en
  - contrib/hbziparc/doc/en-EN
  + contrib/hbziparc/doc/en
  - contrib/rddads/doc/en-EN
  + contrib/rddads/doc/en
  - contrib/hbgd/doc/en-EN
  + contrib/hbgd/doc/en
  - contrib/hbmisc/doc/en-EN
  + contrib/hbmisc/doc/en
  - contrib/hbbtree/doc/en-EN
  + contrib/hbbtree/doc/en
  - examples/hbdoc/examples/core_en
  + examples/hbdoc/examples/en
  - examples/hbdoc/examples/core_es
  + examples/hbdoc/examples/es
    * Renamed to use IETF complient language ID.

  - examples/hbdoc/examples/hbmisc
    - Deleted.

  * utils/hbmk2/hbmk2.pt_BR.po
  * utils/hbmk2/hbmk2.hu_HU.po
  * utils/hbmk2/hbmk2.prg
    ! Fixed to not use "en-EN" language code, but plain "en".

  * examples/hbdoc2/hbdoc2.prg
    * "en-en" -> "en"
2010-02-20 20:20:24 +00:00

298 lines
9.8 KiB
Plaintext

/*
* $Id$
*/
/* $DOC$
* $TEMPLATE$
* Document
* $NAME$
* The Garbage Collector
* $CATEGORY$
* Document
* $ONELINER$
* Readme for Harbour Garbage Collect Feature
* $DESCRIPTION$
* The garbage collector uses the following logic:
* - first collect all memory allocations that can cause garbage;
* - next scan all variables if these memory blocks are still referenced.
*
* Notice that only arrays, objects and codeblocks are collected because
* these are the only datatypes that can cause self-references (a[1]:=a)
* or circular references (a[1]:=b; b[1]:=c; c[1]:=a) that cannot be
* properly deallocated by simple reference counting.
*
* Since all variables in harbour are stored inside some available tables
* (the eval stack, memvars table and array of static variables) then checking
* if the reference is still alive is quite easy and doesn't require any
* special treatment during memory allocation. Additionaly the garbage
* collector is scanning some internal data used by harbour objects
* implementation that also stores some values that can contain memory
* references. These data are used to initialize class instance variables
* and are stored in class shared variables.
*
* In special cases when the value of a harbour variable is stored internally
* in some static area (at C or assembler level), the garbage collector will
* be not able to scan such values since it doesn't know their location. This
* could cause some memory blocks to be released prematurely. To prevent the
* premature deallocation of such memory blocks the static data have to store
* a pointer to the value created with hb_itemNew() function.
* Example:
* static HB_ITEM s_item; // this item can be released by the GC
*
* static PHB_ITEM pItem; // this item will be maintained correctly
* pItem = hb_itemNew( hb_param(1, IT_BLOCK) );
*
* However, scanning of all variables can be a time consuming operation. It
* requires that all allocated arrays have to be traversed through all their
* elements to find more arrays. Also all codeblocks are scanned for detached
* local variables they are referencing. For this reason, looking for unreferenced
* memory blocks is performed during the idle states.
*
* The idle state is a state when there is no real application code
* executed. For example, the user code is stopped for 0.1 of a second
* during INKEY(0.1) - Harbour is checking the keyboard only
* during this time. It leaves however quite enough time for
* many other background tasks. One such background task can be looking
* for unreferenced memory blocks.
*
* Allocating memory </par>
* -----------------
*
* The garbage collector collects memory blocks allocated with hb_gcAlloc()
* function calls. Memory allocated by hb_gcAlloc() should be released with
* hb_gcFree() function.
*
* The garbage collecting </par>
* ----------------------
*
* During scanning of unreferenced memory the GC is using a mark & sweep
* algorithm. This is done in three steps:
*
* 1) mark all memory blocks allocated by the GC with unused flag;
*
* 2) sweep (scan) all known places and clear unused flag for memory
* blocks that are referenced there;
*
* 3) finalize collecting by deallocation of all memory blocks that are
* still marked as unused and that are not locked.
*
* To speed things up, the mark step is simplified by swapping the meaning
* of the unused flag. After deallocation of unused blocks all still alive
* memory blocks are marked with the same 'used' flag so we can reverse
* the meaning of this flag to 'unused' state in the next collecting.
* All new or unlocked memory blocks are automatically marked as 'unused'
* using the current flag, which assures that all memory blocks are marked
* with the same flag before the sweep step will start.
* See hb_gcCollectAll() and hb_gcItemRef()
*
* Calling the garbage collector from harbour code </par>
* -----------------------------------------------
*
* The garbage collector can be called directly from the harbour code.
* This is usefull in situations where there is no idle states available
* or the application is working in the loop with no user interaction
* and there is many memory allocations.
* See HB_GCALL() for explanation of how to call this function from your
* harbour code.
* $SEEALSO$
* hb_gcAlloc(),hb_gcFree(),hb_gcCollectAll(),hb_gcItemRef(),HB_GCALL(),HB_IDLESTATE()
* $END$
*/
/* $DOC$
* $TEMPLATE$
* Function
* $NAME$
* hb_gcAlloc()
* $CATEGORY$
* API
* $SUBCATEGORY$
* Garbage Collector
* $ONELINER$
* Allocates memory that will be collected by the garbage collector.
* $SYNTAX$
* #include <hbapi.h>
* void *hb_gcAlloc( ULONG ulSize,
* HB_GARBAGE_FUNC_PTR pCleanupFunc );
* $ARGUMENTS$
* <ulSize> Requested size of memory block
*
* <pCleanupFunc> Pointer to HB_GARBAGE_FUNC function that will be called
* directly before releasing the garbage memory block or NULL. This
* function should release all other memory allocated and stored inside
* the memory block. For example, it releases all items stored inside
* the array. The functions receives a single parameter: the pointer
* to memory allocated by hb_gcAlloc().
* $RETURNS$
* The pointer to allocated memory or it generates an internal
* unrecoverable error.
* $DESCRIPTION$
* hb_gcAlloc() is used to allocate the memory that will be tracked
* by the garbage collector. It allows to properly release memory
* in case of self-referencing or cross-referencing harbour level
* variables.
* Memory allocated with this function should be released with
* hb_gcFree() function or it will be automatically deallocated
* by the GC if it is not locked or if it is not referenced by some
* harbour level variable.
* $EXAMPLES$
* See src/vm/arrays.c
* $STATUS$
* C
* $COMPLIANCE$
* H
* $PLATFORMS$
* All
* $FILES$
* src/vm/garbage.c
* $SEEALSO$
* hb_gcFree()
* $END$
*/
/* $DOC$
* $TEMPLATE$
* Function
* $NAME$
* hb_gcAlloc()
* $CATEGORY$
* API
* $SUBCATEGORY$
* Garbage Collector
* $ONELINER$
* Releases the memory that was allocated with hb_gcAlloc().
* $SYNTAX$
* void hb_gcFree( void *pMemoryPtr );
* $ARGUMENTS$
* <pMemoryPtr> The pointer to memory for release. This memory
* pointer have to be allocated with hb_gcAlloc() function.
* $RETURNS$
* Nothing.
* $DESCRIPTION$
* hb_gcFree() is used to deallocate the memory that was
* allocated with the hb_gcAlloc() function.
* $EXAMPLES$
* See src/vm/arrays.c
* $STATUS$
* C
* $COMPLIANCE$
* H
* $PLATFORMS$
* All
* $FILES$
* src/vm/garbage.c
* $SEEALSO$
* hb_gcAlloc()
* $END$
*/
/* $DOC$
* $TEMPLATE$
* Function
* $NAME$
* hb_gcAlloc()
* $CATEGORY$
* API
* $SUBCATEGORY$
* Garbage Collector
* $ONELINER$
* Scans all memory blocks and releases the garbage memory.
* $SYNTAX$
* void hb_gcCollectAll( void );
* $ARGUMENTS$
* None.
* $RETURNS$
* Nothing.
* $DESCRIPTION$
* This function scans the eval stack, the memvars table, the array
* of static variables and table of created classes for referenced
* memory blocks. After scanning all unused memory blocks and blocks
* that are not locked are released.
* $STATUS$
* C
* $COMPLIANCE$
* H
* $PLATFORMS$
* All
* $FILES$
* src/vm/garbage.c
* $SEEALSO$
* hb_gcAlloc(),hb_gcFree()
* $END$
*/
/* $DOC$
* $TEMPLATE$
* Function
* $NAME$
* hb_gcAlloc()
* $CATEGORY$
* API
* $SUBCATEGORY$
* Garbage Collector
* $ONELINER$
* Marks the memory to prevent deallocation by the garbage collector.
* $SYNTAX$
* void hb_gcItemRef( PHB_ITEM pItem );
* $ARGUMENTS$
* <pItem> The pointer to item structure that will be scanned. The
* passed item can be of any datatype although arrays, objects
* and codeblocks are scanned only. Other datatypes don't require
* locking so they are simply ignored.
* $RETURNS$
* Nothing.
* $DESCRIPTION$
* The garbage collector uses hb_gcItemRef() function during
* scanning of referenced memory pointers. This function checks the
* type of passed item and scans recursively all other memory blocks
* referenced by this item if it is an array, an object or a codeblock.
*
* NOTE: This function is reserved for the garbage collector only. It
* cannot be called from the user code - calling it can cause
* unpredicted results (memory blocks referenced by the
* passed item can be released prematurely during the closest
* garbage collection).
* $STATUS$
* C
* $COMPLIANCE$
* H
* $PLATFORMS$
* All
* $FILES$
* src/vm/garbage.c
* $SEEALSO$
* hb_gcAlloc(),hb_gcFree()
* $END$
*/
/* $DOC$
* $TEMPLATE$
* Procedure
* $NAME$
* hb_gcAlloc()
* $CATEGORY$
* API
* $SUBCATEGORY$
* Garbage Collector
* $ONELINER$
* Scans the memory and releases all garbage memory blocks.
* $SYNTAX$
* HB_GCALL()
* $ARGUMENTS$
* None
* $DESCRIPTION$
* This function releases all memory blocks that are considered
* as the garbage.
* $STATUS$
* Harbour
* $COMPLIANCE$
* H
* $PLATFORMS$
* All
* $FILES$
* src/vm/garbage.c
* $SEEALSO$
* hb_gcCollectAll()
* $END$
*/