rbb         99/11/24 14:30:20

  Modified:    src/lib/apr/include apr_lib.h
               src/lib/apr/lib apr_pools.c
               src/lib/apr/misc/unix misc.h start.c
  Log:
  Deal with pool function failures in a clean way.  I need to look at how we
  are dealing with this in APR more closely.  Currently, I just passed NULL
  for the initial allocation.  This means we get an error back in ap_initialize.
  I think this is okay, but I wanted to get this change in because of all the
  discussion about it, and I am stopping work for the day.  I'll look at this
  more tomorrow or Friday.
  
  Revision  Changes    Path
  1.17      +1 -1      apache-2.0/src/lib/apr/include/apr_lib.h
  
  Index: apr_lib.h
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/include/apr_lib.h,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- apr_lib.h 1999/11/23 13:46:54     1.16
  +++ apr_lib.h 1999/11/24 22:30:01     1.17
  @@ -299,7 +299,7 @@
   /*
    * APR memory structure manipulators (pools, tables, and arrays).
    */
  -API_EXPORT(ap_pool_t *) ap_make_sub_pool(ap_pool_t *p);
  +API_EXPORT(ap_pool_t *) ap_make_sub_pool(ap_pool_t *p, int (*apr_abort)(int 
retcode));
   API_EXPORT(void) ap_clear_pool(struct context_t *p);
   API_EXPORT(void) ap_destroy_pool(struct context_t *p);
   API_EXPORT(long) ap_bytes_in_pool(ap_pool_t *p);
  
  
  
  1.22      +32 -22    apache-2.0/src/lib/apr/lib/apr_pools.c
  
  Index: apr_pools.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/lib/apr_pools.c,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- apr_pools.c       1999/11/23 21:22:47     1.21
  +++ apr_pools.c       1999/11/24 22:30:06     1.22
  @@ -201,6 +201,17 @@
       } h;
   };
   
  +#define APR_ABORT(conditional, retcode, func, str) \
  +    if (conditional) { \
  +        if (func == NULL) { \
  +            return NULL; \
  +        } \
  +        else { \
  +            fprintf(stderr, "%s", str);
  +            func(retcode); \
  +        } \
  +    }
  +
   /*
    * Static cells for managing our internal synchronisation.
    */
  @@ -250,7 +261,7 @@
    * malloc() to provide aligned memory.
    */
   
  -static union block_hdr *malloc_block(int size)
  +static union block_hdr *malloc_block(int size, int (*apr_abort)(int retcode))
   {
       union block_hdr *blok;
   
  @@ -267,9 +278,8 @@
   #endif /* ALLOC_STATS */
   
       blok = (union block_hdr *) malloc(size + sizeof(union block_hdr));
  -    if (blok == NULL) {
  -        return NULL;
  -    }
  +    APR_ABORT(blok == NULL, APR_ENOMEM, (*apr_abort)
  +              "Ouch!  malloc failed in malloc_block()\n");
       debug_fill(blok, size + sizeof(union block_hdr));
       blok->h.next = NULL;
       blok->h.first_avail = (char *) (blok + 1);
  @@ -298,6 +308,7 @@
                        "at the end of a block!\n");
       while (free_blk) {
        if (free_blk == blok) {
  +            fprintf(stderr, "Ouch!  Freeing free block\n");
            abort();
            exit(1);
        }
  @@ -394,7 +405,7 @@
    * if necessary.  Must be called with alarms blocked.
    */
   
  -static union block_hdr *new_block(int min_size)
  +static union block_hdr *new_block(int min_size, int (*apr_abort)(int 
retcode))
   {
       union block_hdr **lastptr = &block_freelist;
       union block_hdr *blok = block_freelist;
  @@ -422,7 +433,7 @@
   
       min_size += BLOCK_MINFREE;
       blok = malloc_block((min_size > BLOCK_MINALLOC)
  -                     ? min_size : BLOCK_MINALLOC);
  +                     ? min_size : BLOCK_MINALLOC, apr_abort);
       return blok;
   }
   
  @@ -468,7 +479,7 @@
   #define POOL_HDR_CLICKS (1 + ((sizeof(struct ap_pool_t) - 1) / CLICK_SZ))
   #define POOL_HDR_BYTES (POOL_HDR_CLICKS * CLICK_SZ)
   
  -API_EXPORT(ap_pool_t *) ap_make_sub_pool(ap_pool_t *p)
  +API_EXPORT(ap_pool_t *) ap_make_sub_pool(ap_pool_t *p, int (*apr_abort)(int 
retcode))
   {
       union block_hdr *blok;
       ap_pool_t *new_pool;
  @@ -477,7 +488,7 @@
   
       ap_lock(alloc_mutex);
   
  -    blok = new_block(POOL_HDR_BYTES);
  +    blok = new_block(POOL_HDR_BYTES, apr_abort);
       new_pool = (ap_pool_t *) blok->h.first_avail;
       blok->h.first_avail += POOL_HDR_BYTES;
   #ifdef POOL_DEBUG
  @@ -545,7 +556,7 @@
       ap_create_lock(&spawn_mutex, APR_MUTEX, APR_INTRAPROCESS,
                      NULL, NULL);
   
  -    permanent_pool = ap_make_sub_pool(NULL);
  +    permanent_pool = ap_make_sub_pool(NULL, NULL);
   #ifdef ALLOC_STATS
       atexit(dump_stats);
   #endif
  @@ -658,7 +669,7 @@
   /* Find the pool that ts belongs to, return NULL if it doesn't
    * belong to any pool.
    */
  -API_EXPORT(ap_pool_t *) ap_find_pool(const void *ts)
  +API_EXPORT(ap_pool_t *) ap_find_pool(const void *ts, int (apr_abort)(int 
retcode))
   {
       const char *s = ts;
       union block_hdr **pb;
  @@ -671,12 +682,11 @@
       /* consider stuff on the stack to also be in the NULL pool...
        * XXX: there's cases where we don't want to assume this
        */
  -    if ((stack_direction == -1 && is_ptr_in_range(s, &ts, known_stack_point))
  -     || (stack_direction == 1
  -         && is_ptr_in_range(s, known_stack_point, &ts))) {
  -     abort();
  -     return NULL;
  -    }
  +    APR_ABORT((stack_direction == -1 && 
  +              is_ptr_in_range(s, &ts, known_stack_point)) || 
  +              (stack_direction == 1 &&    
  +              is_ptr_in_range(s, known_stack_point, &ts)), 1, apr_abort,
  +              "Ouch!  find_pool() called on pointer in a free block\n");
       ap_block_alarms();
       /* search the global_block_list */
       for (pb = &global_block_list; *pb; pb = &b->h.global_next) {
  @@ -728,14 +738,14 @@
    * instead.  This is a guarantee by the caller that sub will not
    * be destroyed before p is.
    */
  -API_EXPORT(void) ap_pool_join(ap_pool_t *p, ap_pool_t *sub)
  +API_EXPORT(void) ap_pool_join(ap_pool_t *p, ap_pool_t *sub, 
  +                              int (*apr_abort)(int retcode))
   {
       union block_hdr *b;
   
       /* We could handle more general cases... but this is it for now. */
  -    if (sub->parent != p) {
  -     abort();
  -    }
  +    APR_ABORT(sub->parent != p, 1, apr_abort,
  +              "pool_join: p is not a parent of sub\n");
       ap_block_alarms();
       while (p->joined) {
        p = p->joined;
  @@ -830,7 +840,7 @@
   
       ap_lock(alloc_mutex);
   
  -    blok = new_block(size);
  +    blok = new_block(size, c->apr_abort);
       a->last->h.next = blok;
       a->last = blok;
   #ifdef POOL_DEBUG
  @@ -974,7 +984,7 @@
   
       /* must try another blok */
       ap_lock(alloc_mutex);
  -    nblok = new_block(2 * cur_len);
  +    nblok = new_block(2 * cur_len, NULL);
       ap_unlock(alloc_mutex);
       memcpy(nblok->h.first_avail, blok->h.first_avail, cur_len);
       ps->vbuff.curpos = nblok->h.first_avail + cur_len;
  
  
  
  1.5       +1 -0      apache-2.0/src/lib/apr/misc/unix/misc.h
  
  Index: misc.h
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/misc/unix/misc.h,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- misc.h    1999/11/20 22:05:17     1.4
  +++ misc.h    1999/11/24 22:30:09     1.5
  @@ -71,6 +71,7 @@
   struct context_t {
       struct ap_pool_t *pool;
       datastruct *prog_data;
  +    int (*apr_abort)(int retcode);
   };
   
   #endif  /* ! MISC_H */
  
  
  
  1.13      +12 -1     apache-2.0/src/lib/apr/misc/unix/start.c
  
  Index: start.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/misc/unix/start.c,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- start.c   1999/11/04 07:26:21     1.12
  +++ start.c   1999/11/24 22:30:09     1.13
  @@ -82,7 +82,7 @@
       ap_pool_t *pool;
   
       if (cont) {
  -        pool = ap_make_sub_pool(cont->pool);
  +        pool = ap_make_sub_pool(cont->pool, cont->apr_abort);
       }
       else {
           pool = ap_init_alloc();;
  @@ -96,6 +96,7 @@
   
       new->pool = pool;
       new->prog_data = NULL;
  +    new->apr_abort = NULL;
    
       *newcont = new;
       return APR_SUCCESS;
  @@ -207,5 +208,15 @@
       pthread_sigmask(SIG_BLOCK, &sigset, NULL);
   #endif
       return APR_SUCCESS;
  +}
  +
  +ap_status_t ap_set_abort(int (*apr_abort)(int retcode), struct context_t 
*cont)
  +{
  +    if (cont == NULL) {
  +        return APR_ENOCONT;
  +    }
  +    else {
  +        cont->apr_abort = apr_abort;
  +    }
   }
    
  
  
  

Reply via email to