Changeset 953


Ignore:
Timestamp:
Feb 16, 2007 9:44:36 PM (13 years ago)
Author:
bennylp
Message:

Fixed ticket #105: unnecessary assert in fixed buffer based pool (pool_buf) on no memory condition

Location:
pjproject/trunk/pjlib/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjlib/src/pj/pool.c

    r725 r953  
    175175    PJ_CHECK_STACK(); 
    176176 
     177    /* Size must be at least sizeof(pj_pool)+sizeof(pj_pool_block) */ 
     178    PJ_ASSERT_RETURN(initial_size >= sizeof(pj_pool_t)+sizeof(pj_pool_block), 
     179                     NULL); 
     180 
    177181    /* If callback is NULL, set calback from the policy */ 
    178182    if (callback == NULL) 
  • pjproject/trunk/pjlib/src/pj/pool_buf.c

    r839 r953  
    5454{ 
    5555    struct creation_param *param; 
     56    void *buf; 
    5657 
    5758    PJ_UNUSED_ARG(factory); 
    5859 
    5960    param = pj_thread_local_get(tls); 
    60     PJ_ASSERT_RETURN(param != NULL, NULL); 
     61    if (param == NULL) { 
     62        /* Don't assert(), this is normal no-memory situation */ 
     63        return NULL; 
     64    } 
    6165 
    6266    pj_thread_local_set(tls, NULL); 
     
    6468    PJ_ASSERT_RETURN(size <= param->size, NULL); 
    6569 
    66     return param->stack_buf; 
     70    buf = param->stack_buf; 
     71 
     72    /* Prevent the buffer from being reused */ 
     73    param->stack_buf = NULL; 
     74 
     75    return buf; 
    6776} 
    6877 
  • pjproject/trunk/pjlib/src/pjlib-test/pool.c

    r65 r953  
    1818 */ 
    1919#include <pj/pool.h> 
     20#include <pj/pool_buf.h> 
    2021#include <pj/rand.h> 
    2122#include <pj/log.h> 
     23#include <pj/except.h> 
    2224#include "test.h" 
    2325 
     
    140142} 
    141143 
     144/* Test the buffer based pool */ 
     145static int pool_buf_test(void) 
     146{ 
     147    enum { STATIC_BUF_SIZE = 40 }; 
     148    /* 16 is the internal struct in pool_buf */ 
     149    static char buf[ STATIC_BUF_SIZE + sizeof(pj_pool_t) +  
     150                     sizeof(pj_pool_block) + 16]; 
     151    pj_pool_t *pool; 
     152    void *p; 
     153    PJ_USE_EXCEPTION; 
     154 
     155    PJ_LOG(3,("test", "...pool_buf test")); 
     156 
     157    pool = pj_pool_create_on_buf("no name", buf, sizeof(buf)); 
     158    if (!pool) 
     159        return -70; 
     160 
     161    /* Drain the pool */ 
     162    PJ_TRY { 
     163        if ((p=pj_pool_alloc(pool, STATIC_BUF_SIZE/2)) == NULL) 
     164            return -75; 
     165 
     166        if ((p=pj_pool_alloc(pool, STATIC_BUF_SIZE/2)) == NULL) 
     167            return -76; 
     168    } 
     169    PJ_CATCH_ANY { 
     170        return -77; 
     171    } 
     172    PJ_END; 
     173 
     174    /* On the next alloc, exception should be thrown */ 
     175    PJ_TRY { 
     176        p = pj_pool_alloc(pool, STATIC_BUF_SIZE); 
     177        if (p != NULL) { 
     178            /* This is unexpected, the alloc should fail */ 
     179            return -78; 
     180        } 
     181    } 
     182    PJ_CATCH_ANY { 
     183        /* This is the expected result */ 
     184    } 
     185    PJ_END; 
     186 
     187    /* Done */ 
     188    return 0; 
     189} 
     190 
     191 
    142192int pool_test(void) 
    143193{ 
     
    161211    } 
    162212 
     213    rc = pool_buf_test(); 
     214    if (rc != 0) 
     215        return rc; 
     216 
     217 
    163218    return 0; 
    164219} 
Note: See TracChangeset for help on using the changeset viewer.