Alien-Judy
view release on metacpan or search on metacpan
src/judy-1.0.5/src/JudyCommon/JudyGet.c view on Meta::CPAN
CHECKLEAFNONNAT(6, Pjp, Index, 2, JU_COPY6_PINDEX_TO_LONG);
CHECKLEAFNONNAT(6, Pjp, Index, 1, JU_COPY6_PINDEX_TO_LONG);
break;
case cJ1_JPIMMED_7_02:
CHECKLEAFNONNAT(7, Pjp, Index, 2, JU_COPY7_PINDEX_TO_LONG);
CHECKLEAFNONNAT(7, Pjp, Index, 1, JU_COPY7_PINDEX_TO_LONG);
break;
#endif // (JUDY1 && JU_64BIT)
// ****************************************************************************
// INVALID JP TYPE:
default:
ReturnCorrupt:
#ifdef JUDYGETINLINE // Pjpm is known to be non-null:
JU_SET_ERRNO_NONNULL(Pjpm, JU_ERRNO_CORRUPT);
#else
JU_SET_ERRNO(PJError, JU_ERRNO_CORRUPT);
#endif
JUDY1CODE(return(JERRI );)
JUDYLCODE(return(PPJERR);)
} // switch on JP type
JUDY1CODE(return(0);)
JUDYLCODE(return((PPvoid_t) NULL);)
} // Judy1Test() / JudyLGet()
#ifndef JUDYGETINLINE // only compile the following function once:
#ifdef DEBUG
// ****************************************************************************
// J U D Y C H E C K P O P
//
// Given a pointer to a Judy array, traverse the entire array to ensure
// population counts add up correctly. This can catch various coding errors.
//
// Since walking the entire tree is probably time-consuming, enable this
// function by setting env parameter $CHECKPOP to first call at which to start
// checking. Note: This function is called both from insert and delete code.
//
// Note: Even though this function does nothing useful for LEAFW leaves, its
// good practice to call it anyway, and cheap too.
//
// TBD: This is a debug-only check function similar to JudyCheckSorted(), but
// since it walks the tree it is Judy1/JudyL-specific and must live in a source
// file that is built both ways.
//
// TBD: As feared, enabling this code for every insert/delete makes Judy
// deathly slow, even for a small tree (10K indexes). Its not so bad if
// present but disabled (<1% slowdown measured). Still, should it be ifdefd
// other than DEBUG and/or called less often?
//
// TBD: Should this "population checker" be expanded to a comprehensive tree
// checker? It currently detects invalid LEAFW/JP types as well as inconsistent
// pop1s. Other possible checks, all based on essentially redundant data in
// the Judy tree, include:
//
// - Zero LS bits in jp_Addr field.
//
// - Correct Dcd bits.
//
// - Consistent JP types (always descending down the tree).
//
// - Sorted linear lists in BranchLs and leaves (using JudyCheckSorted(), but
// ideally that function is already called wherever appropriate after any
// linear list is modified).
//
// - Any others possible?
#include <stdlib.h> // for getenv() and atol().
static Word_t JudyCheckPopSM(Pjp_t Pjp, Word_t RootPop1);
FUNCTION void JudyCheckPop(
Pvoid_t PArray)
{
static bool_t checked = FALSE; // already checked env parameter.
static bool_t enabled = FALSE; // env parameter set.
static bool_t active = FALSE; // calls >= callsmin.
static Word_t callsmin; // start point from $CHECKPOP.
static Word_t calls = 0; // times called so far.
// CHECK FOR EXTERNAL ENABLING:
if (! checked) // only check once.
{
char * value; // for getenv().
checked = TRUE;
if ((value = getenv("CHECKPOP")) == (char *) NULL)
{
#ifdef notdef
// Take this out because nightly tests want to be flavor-independent; its not
// OK to emit special non-error output from the debug flavor:
(void) puts("JudyCheckPop() present but not enabled by "
"$CHECKPOP env parameter; set it to the number of "
"calls at which to begin checking");
#endif
return;
}
callsmin = atol(value); // note: non-number evaluates to 0.
enabled = TRUE;
(void) printf("JudyCheckPop() present and enabled; callsmin = "
"%lu\n", callsmin);
}
else if (! enabled) return;
// Previously or just now enabled; check if non-active or newly active:
( run in 0.648 second using v1.01-cache-2.11-cpan-5b529ec07f3 )