Skip site navigation (1)Skip section navigation (2)

  
 
  

home | help
Judy(3) 		    Library Functions Manual			 Judy(3)

NAME
     Judy arrays - C library functions for creating and accessing dynamic arrays

SYNOPSIS
     Judy1  - maps an Index (word) to a bit
     JudyL  - maps an Index (word) to a Value (word/pointer)
     JudySL - maps an Index (null terminated string) to a Value
     JudyHS - maps an Index (array-of-bytes) of Length to a Value

DESCRIPTION
     The  Judy	family of functions supports fully dynamic arrays.  These arrays
     may be indexed by a 32- or 64-bit word (depending on processor word  size),
     a null terminated string or an array-of-bytes plus length.  A dynamic array
     (sparsely	populated) can also be thought of as a mapping function or asso-
     ciative memory.

     A Word_t is a typedef unsigned long int  in Judy.h and  must  be  the  same
     size as sizeof(void *) I.E. a pointer.

     Judy1 functions: Index is a Word_t and Value is just a bit or simply a flag
     that Index is present or missing from the array.  This can be thought of as
     a huge bitmap.

     JudyL functions: Index is a Word_t and Value is a Word_t.	This makes JudyL
     a	pure  word-to-word/pointer  mapper.  JudySL and JudyHL are based on this
     property of JudyL.

     JudySL functions: Index is a null-terminated string and Value is a Word_t.

     JudyHS functions:	Index is an array-of-bytes of length:  Length.	Value is
     a Word_t.	This new addition (May 2004) to Judy is a hybird using the  best
     features of hashing and Judy methods.  The author believes JudyHS is a good
     replacement  for a hashing method when resizing the hash table is done dur-
     ing population growth.  A correctly tuned hash method with  a  static  hash
     table  size  and  population is unbeatable for speed.  However, JudyHS will
     perform better than a hashing method with smaller	and  larger  populations
     than  the	optimum hash table size.  JudyHS does not have a degenerate per-
     formance case where knowledge of  the  hash  algorithm  can  be  exploited.
     (I.E.  JudyHS does not use a linked list to handle hash collisions, it uses
     a tree of JudyL arrays and a virtual hash table size of 4 billion).

     Judy arrays are both speed- and memory-efficient, with no tuning or config-
     uration required, across a wide range of index set types (sequential, peri-
     odic, clustered, random).	Judy's speed and memory usage are typically bet-
     ter than other data storage models such as skiplists, linked lists, binary,
     ternary, b-trees, or even hashing, and improves with very large data sets.

     A	Judy array is created merely by defining a null pointer and then storing
     (inserting) the first element into the array under that pointer.  The  mem-
     ory  used	by a Judy array is nearly proportional to the population (number
     of elements).

     Judy has two Application Program Interfaces (APIs):  a C  macro  interface,
     and  a  function  call  interface.   Because  the macro forms are sometimes
     faster and have a simpler error  handling	interface  than  the  equivalent
     functions, they are the preferred way of using the Judy functions.

     Since an initial (empty) Judy array is represented by a null pointer, it is
     possible  to construct an array of Judy arrays.  In other words, a Judy ar-
     ray's Values (except Judy1) can be pointers to  other  Judy  arrays.   This
     makes  it very simple to construct an array with an arbitrary number of di-
     mensions or Index sizes.  (JudySL and JudyHS are  implemented  using  JudyL
     this way).

A 10 MINUTE TECHNICAL DESCRIPTION
     may be found at http://judy.sourceforge.net/downloads/10minutes.htm

A 3 HOUR TECHNICAL DESCRIPTION (out of date and a bit corny)
     may be found at http://judy.sourceforge.net/application/shop_interm.pdf

DOWNLOADS
     Judy source downloads are available at http://sourceforge.net/projects/judy
     Binarys may be built and installed in a minute or two after downloading

     For   versions   including   more	 platforms   and/or  new  features  see:
     http://judy.sourceforge.net/downloads/

AUTHOR
     Judy was invented by Doug Baskins (dougbaskins .AT, yahoo.com)  and  imple-
     mented  by  Hewlett-Packard.  (Note:  Judy is named for the inventor's sis-
     ter, after discarding many proposed names.)

FILES
     Locations of interest include:
     http://sourceforge.net/projects/judy -- project downloads
     file:/usr/share/doc/Judy/ -- for HTML version of man pages.
     /usr/share/doc/Judy/demo/ -- demonstration program source files.
     The author attempted to write interesting application notes using	advanced
     features of Judy.	They may be found at "http://judy.sourceforge.net/appli-
     cation/ (Some may be out of date).

ERRORS
     A lot of thought (and time) went into making error handling in Judy simple,
     while  maintaining  flexibility  and  capability.	Error handling is a very
     boring subject even to write about.  So read this short section and use the
     recommended second method.  It generates the fastest code, uses  the  least
     amount  of  memory  and  requires	you  to  write	extra  code only for in-
     sert/deletes functions.  Also it is compatible with the other two	methods.
     This  method  is for production code that may want to handle malloc() fails
     differently than the Judy default.  If the Judy default method of	handling
     malloc() fails are OK, then use the first method.

     There  are  two  (2)  categories of Judy error returns, (or for any dynamic
     ADT):

     1) User programming errors (bugs) such  as  memory  corruption  or  invalid
     pointers.
     2)  Out-of-memory	(malloc()  failure)  with Insert (Set) or Delete (Unset)
     when modifying a Judy array.  Not all calls to insert and delete call  mal-
     loc(), so they may succeed even when a call to malloc() would fail.

     There  are  roughly  three  (3)  methods  of handling errors when using the
     macros:

1) Default Error Handling Method
     The default is to print error messages to stderr, for example:

     File 'YourCfile.c', line 1234: JudyLIns(), JU_ERRNO_* == 2, ID == 321
     This indicates that an error occurred in the JudyLIns()  function	at  line
     321.   Line  1234 is the line in 'YourCfile.c' where the JLI() call failed.
     JU_ERRNO_* == 2 is equal to JU_ERRNO_NOMEM (as defined in the Judy.h file).
     The ID number indicates the source line number in the  function  where  the
     error  originated.   Your program then terminates with an exit(1);.  By de-
     fault, both categories of Judy error returns are printed  this  way.   (The
     'ID  ==  321'  is for die hards that want more detail or for debugging Judy
     itself.)

2) Disable Macro Error Handling
     When your program is "bug free", the only errors returned	should	be  mal-
     loc()  failures.	Therefore all error returns can be treated as a malloc()
     failure.  By using the below #define, all error  testing  and  printing  is
     turned  off.   Additional	code needs to be added to the code that can have
     malloc() failures.  Judy was designed to leave the same data in  the  array
     before  the  call	if  a malloc() fail occurs.  (During testing of Judy, we
     found very few malloc()/OS's that were bug free after a  malloc()	failure.
     Sometimes	it  took weeks to discover because most systems go into a paging
     frenzy before running out of memory).

     #define JUDYERROR_NOTEST 1
     (in your program code), or

     cc -DJUDYERROR_NOTEST sourcefile -lJudy
     (on your command line).

     // This is an example of how to program using method two (2).

     JLI(PValue, PLArray, Index);
     if (PValue == PJERR) goto out_of_memory_handling;

     JLD(RC_int, PLArray, Index);
     if (RC_int == JERR) goto out_of_memory_handling;

     J1S(RC_int, P1Array, Index);
     if (RC_int == JERR) goto out_of_memory_handling;

     J1U(RC_int, P1Array, Index);
     if (RC_int == JERR) goto out_of_memory_handling;

     Note:  Without 'JUDYERROR_NOTEST'	defined,  the  'goto  out_of_memory_han-
     dling'  will  never  be executed and will be optimized out by the compiler.
     The default method will be used -- Macro will print error information if an
     error occurs as explained above.

     With 'JUDYERROR_NOTEST' defined, the 'goto out_of_memory_handling' will  be
     executed  when  an  error	occurs -- which should only happen when malloc()
     fails.

3) User-Specified JUDYERROR() Macro Method
     The JUDYERROR() macro (in Judy.h) provides flexibility for  handling  error
     returns  as  needed  to  suit your program while still using the Judy array
     macros instead of function calls.	You  can  use  a  different  JUDYERROR()
     macro  to suit your needs.  The following example is a possible alternative
     to the default. It is used to distinguish between the two types  of  errors
     (described above), and explicitly test for the remaining JU_ERRNO_NOMEM er-
     rors possible in your program.

     // This is an example of Judy macro API to continue when out of memory
     // and print and exit(1) when any other error occurs.

     #ifndef JUDYERROR_NOTEST
     #include <stdio.h>  // needed for fprintf()

     // This is the macro that the Judy macro APIs use for return codes of -1:

     #define JUDYERROR(CallerFile, CallerLine, JudyFunc, JudyErrno, JudyErrID) \
     {									       \
	 if ((JudyErrno) != JU_ERRNO_NOMEM) /* ! a malloc() failure */	       \
	 {								       \
	     (void) fprintf(stderr, "File '%s', line %d: %s(), "	       \
		 "JU_ERRNO_* == %d, ID == %d\n",			       \
		 CallerFile, CallerLine,				       \
		 JudyFunc, JudyErrno, JudyErrID);			       \
	     exit(1);							       \
	 }								       \
     }
     #endif // JUDYERROR_NOTEST not defined
     This  error  handling  macro  must be included before the #include <Judy.h>
     statement in your program.

SEE ALSO
     Judy1(3), JudyL(3), JudySL(3), JudyHS(3)

									 Judy(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=J1MU&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help