You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by dr...@apache.org on 2001/07/02 10:01:06 UTC

cvs commit: apr/memory/unix apr_sms.c

dreid       01/07/02 01:01:06

  Modified:    include  apr_sms.h
               memory/unix apr_sms.c
  Log:
  Add some debugging to sms...
  
  - add an option to print out when we create/reset/destroy an sms
  - add an option to allow us to print out a tree of the sms's showing
    the inter-relationships
  
  Revision  Changes    Path
  1.20      +59 -7     apr/include/apr_sms.h
  
  Index: apr_sms.h
  ===================================================================
  RCS file: /home/cvs/apr/include/apr_sms.h,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- apr_sms.h	2001/06/30 08:21:50	1.19
  +++ apr_sms.h	2001/07/02 08:01:03	1.20
  @@ -72,21 +72,51 @@
   extern "C" {
   #endif
   
  +
  +/**********************************************************************
  + ** Defines 
  + **********************************************************************/
  +
   /* The various types of cleanup's we can offer */
   #define APR_ALL_CLEANUPS      0x0000
   #define APR_CHILD_CLEANUP     0x0001
   #define APR_PARENT_CLEANUP    0x0002
   
  -/* Alignment macro's
  - *
  - * APR_ALIGN is only to be used to align on a power
  - * of two boundary
  - */
  +/* Alignment macro's */
   #define APR_ALIGN(size, boundary) \
  -    (((size) + ((boundary) - 1)) & ~((boundary) - 1))
  +    ((size) + (((boundary) - ((size) & ((boundary) - 1))) & ((boundary) - 1)))
   
   #define APR_ALIGN_DEFAULT(size) APR_ALIGN(size, 8)
   
  +/**********************************************************************
  + ** Debug options
  + **********************************************************************/
  +/* 
  + * One of the aims of SMS is to provide a large range of debugging
  + * options.
  + *
  + * The options are normally turned off by having the define commented out.
  + * To use, simply remove the define and rebuild!
  + *
  + * Function definitions are at the end of the file...
  + */
  +
  +/* DEBUG_SHOW_STRUCTURE
  + * This turns on a print of the ancestory of the SMS when
  + * creating/destroying an SMS so it's place in the world can be seen.
  + */
  +/* #define DEBUG_SHOW_STRUCTURE      1 */
  +
  +/* DEBUG_SHOW_FUNCTIONS
  + * This turns on debug printing of every call to i
  + *    apr_sms_create
  + *    apr_sms_destroy
  + *    apr_sms_reset
  + *
  + * Format of output is
  + *    CREATE - sms 0x0000000 [STANDARD] has been created
  + */
  +/* #define DEBUG_SHOW_FUNCTIONS     1 */
   
   /**
    * @package APR memory system
  @@ -195,13 +225,14 @@
    */
   APR_DECLARE(apr_status_t) apr_sms_post_init(apr_sms_t *sms);
   
  +#ifdef APR_ASSERT_MEMORY
  +
   /**
    * Check if a memory system is obeying all rules. 
    * @caution Call this function as the last statement before returning a new
    *          memory system from your apr_xxx_sms_create.
    * @deffunc void apr_sms_validate(apr_sms_t *sms)
    */
  -#ifdef APR_ASSERT_MEMORY
   APR_DECLARE(void) apr_sms_assert(apr_sms_t *sms);
   #else
   #ifdef apr_sms_assert
  @@ -336,12 +367,33 @@
   APR_DECLARE(apr_status_t) apr_sms_cleanup_run_type(apr_sms_t *sms, 
                                                      apr_int32_t type);
   
  +/**********************************************************************
  + ** Standard SMS module
  + **********************************************************************/
  +
   /**
    * Create a standard malloc/realloc/free memory system
    * @param sms A pointer to the created apr_sms_t*
    * @deffunc apr_status_t apr_sms_std_create(apr_sms_t **sms);
    */
   APR_DECLARE(apr_status_t) apr_sms_std_create(apr_sms_t **sms);
  +
  +
  +/**********************************************************************
  + ** Debug routines
  + **********************************************************************/
  +
  +/* NB These are only available if the debugging option has been turned on. */
  +
  +#if DEBUG_SHOW_STRUCTURE
  +/**
  + * Show the heirachy of the sms
  + * @param sms The sms to show the information for
  + * @param direction Do we show up (to parent) or down (to children)
  + */
  +APR_DECLARE(void) apr_sms_show_structure(apr_sms_t *sms, int direction);
  +#endif /* DEBUG_SHOW_STRUCTURE */
  +
   
   #ifdef __cplusplus
   }
  
  
  
  1.29      +126 -4    apr/memory/unix/apr_sms.c
  
  Index: apr_sms.c
  ===================================================================
  RCS file: /home/cvs/apr/memory/unix/apr_sms.c,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- apr_sms.c	2001/07/01 13:56:29	1.28
  +++ apr_sms.c	2001/07/02 08:01:04	1.29
  @@ -232,19 +232,29 @@
   
   APR_DECLARE(apr_status_t) apr_sms_post_init(apr_sms_t *sms)
   {
  -    apr_sms_assert(sms);
  -    
       /* We do things here as these may potentially make calls
        * to the sms that we're creating, and if we make the calls
        * in the sms_init phase we haven't yet added the function
        * pointers so we'll segfault!
        */
  +    apr_status_t rv;
  +
  +    apr_sms_assert(sms);
   
       /* Create the sms framework lock we'll use. */
  -    return apr_lock_create(&sms->sms_lock, APR_MUTEX, APR_LOCKALL,
  -                           NULL, sms->pool);
  +    rv = apr_lock_create(&sms->sms_lock, APR_MUTEX, APR_LOCKALL,
  +                         NULL, sms->pool);
  +#if DEBUG_SHOW_FUNCTIONS
  +    printf("CREATE - sms %p [%s] has been created\n", sms, sms->identity);
  +#endif
  +#if DEBUG_SHOW_STRUCTURE
  +    apr_sms_show_structure(sms, 1);
  +#endif /* DEBUG_SHOW_STRUCTURE */
  +
  +    return rv;
   }
   
  +
   #ifdef APR_ASSERT_MEMORY
   APR_DECLARE(void) apr_sms_assert(apr_sms_t *sms)
   {
  @@ -355,6 +365,10 @@
       if (!sms->reset_fn)
           return APR_ENOTIMPL;
   
  +#if DEBUG_SHOW_FUNCTIONS
  +    printf("RESET - sms %p [%s] being reset\n", sms, sms->identity);
  +#endif
  +
       if (sms->sms_lock)
           apr_lock_acquire(sms->sms_lock);
       
  @@ -396,6 +410,14 @@
       struct apr_sms_cleanup *cleanup;
       struct apr_sms_cleanup *next_cleanup;
   
  +#if DEBUG_SHOW_FUNCTIONS
  +    printf("DESTROY - sms %p [%s] being destroyed\n", sms, sms->identity);
  +#endif
  +#if DEBUG_SHOW_STRUCTURE
  +    printf("WARNING! Destroying this SMS will also destroy:\n");
  +    apr_sms_show_structure(sms, 0);
  +#endif /* DEBUG_SHOW_STRUCTURE */
  +
       if (sms->sms_lock)
           apr_lock_acquire(sms->sms_lock);
       
  @@ -747,3 +769,103 @@
   {
       return sms->parent;
   }
  +
  +#if DEBUG_SHOW_STRUCTURE
  +static void add_sms(char *a, char *b, apr_sms_t *sms, apr_sms_t *caller,
  +                    int sib)
  +{
  +    char tmp[20];
  +    if (sib == 1) {
  +        strcat(a, "=");
  +        strcat(b, " ");
  +    }
  +    sprintf(tmp, sms == caller ? "**%9p**" : " [%9p] ", sms);
  +    strcat(a, tmp);
  +    sprintf(tmp, sms == caller ? " [%9s] " : " [%9s] ", sms->identity);
  +    strcat(b, tmp);
  +}
  +
  +static void add_tab(char *a, char *b, int level, apr_sms_t *sms) 
  +{
  +    char buffer[100];
  +    int i;
  +    for(i=0;i < level * 2;i++) 
  +        buffer[i] = ' ';
  +    buffer[i] = '\0';
  +    strcpy(a, buffer);
  +    strcpy(b, buffer);
  +    if (sms->parent)
  +        printf("%s     |\n", buffer);
  +}
  +
  +static void print_structure(char *l1, char *l2)
  +{
  +    printf("%s\n%s\n", l1, l2);
  +}
  +
  +APR_DECLARE(void) apr_sms_show_structure(apr_sms_t *sms, int direction)
  +{
  +    apr_sms_t *thesms, *sibling;
  +    int levels = 0, i = 0, j = 0;
  +    char l1[100], l2[100];
  + 
  +    if (direction == 1) {
  +        /* we're going up! */
  +        thesms = sms;
  +        while (thesms->parent != NULL) {
  +            levels++;
  +            thesms = thesms->parent;
  +        }
  +        if (levels == 0) {
  +            printf("The SMS is a top-level SMS.\n");
  +        } else {
  +            printf("The SMS is %d level(s) deep!\n", levels);
  +        }
  +        /* thesms now eqauls the top level... so start showing them! */
  +        while (thesms) {
  +            add_tab(l1, l2, i++, thesms);
  +
  +            add_sms(l1, l2, thesms, sms, 0);
  +            
  +            sibling = thesms->sibling;
  +            while (sibling) {
  +                add_sms(l1, l2, sibling, NULL, 1);
  +                sibling = sibling->sibling;
  +            }
  +            print_structure(l1, l2);
  +
  +            thesms = thesms->child;
  +        }
  +    } else {
  +        /* we go down!  i.e. show our descendants */
  +        thesms = sms;
  +        while (thesms->child) {
  +            levels++;
  +            thesms = thesms->child;
  +        }
  +        if (levels == 0) {
  +            printf("The SMS is a bottom-level SMS with no descendants\n");
  +        } else {
  +            printf("This SMS has %d descendants\n", levels);
  +        }
  +        thesms = sms;
  +        while (thesms) {
  +            add_tab(l1, l2, i++, thesms);
  +
  +            /* add the child... */
  +            add_sms(l1, l2, thesms, sms, 0);
  +
  +            /* add siblings... */
  +            sibling = thesms->sibling;
  +            while (sibling != NULL) {
  +                add_sms(l1, l2, sibling, sms, 1);
  +                sibling = sibling->sibling;
  +            }
  +            print_structure(l1, l2);
  +            thesms = thesms->child;
  +        }
  +    }
  +}
  +#endif /* DEBUG_SHOW_STRUCTURE */
  +
  +