コード例 #1
0
ファイル: pool.c プロジェクト: SangramSahuFIS/proftpd
static union block_hdr *new_block(int minsz, int exact) {
  union block_hdr **lastptr = &block_freelist;
  union block_hdr *blok = block_freelist;

  if (!exact) {
    minsz = 1 + ((minsz - 1) / BLOCK_MINFREE);
    minsz *= BLOCK_MINFREE;
  }

  /* Check if we have anything of the requested size on our free list first...
   */
  while (blok) {
    if (minsz <= blok->h.endp - blok->h.first_avail) {
      *lastptr = blok->h.next;
      blok->h.next = NULL;

      stat_freehit++;
      return blok;

    } else {
      lastptr = &blok->h.next;
      blok = blok->h.next;
    }
  }

  /* Nope...damn.  Have to malloc() a new one. */
  stat_malloc++;
  return malloc_block(minsz);
}
コード例 #2
0
ファイル: malloc.c プロジェクト: Selk/Dev
void			*malloc(size_t size)
{
	t_block	*b;

	b = malloc_block(size);
	return (BDATA(b));
}
コード例 #3
0
ファイル: epmem.c プロジェクト: gitpan/Embperl
static union block_hdr *new_block(int min_size)
{
    union block_hdr **lastptr = &block_freelist;
    union block_hdr *blok = block_freelist;

    /* First, see if we have anything of the required size
     * on the free list...
     */

    while (blok != NULL) {
	if (min_size + BLOCK_MINFREE <= blok->h.endp - blok->h.first_avail) {
	    *lastptr = blok->h.next;
	    blok->h.next = NULL;
	    debug_verify_filled(blok->h.first_avail, blok->h.endp,
		"Ouch!  Someone trounced a block on the free list!\n");
	    return blok;
	}
	else {
	    lastptr = &blok->h.next;
	    blok = blok->h.next;
	}
    }

    /* Nope. */

    min_size += BLOCK_MINFREE;
    blok = malloc_block((min_size > BLOCK_MINALLOC) ? min_size : BLOCK_MINALLOC);
    return blok;
}
コード例 #4
0
ファイル: pool.cpp プロジェクト: LenxWei/libproton
void* seg_pool::malloc_one()
{
    pool_block* ba=get_free_block();
    if(!ba){
        malloc_block();
        ba=get_free_block();
        if(!ba)
            return NULL;
    }
    void* p=ba->malloc_one();

    if(ba->full()){
        ba->erase_from_list();
        reg_full_block(ba);
    }
    return p;
}
コード例 #5
0
ファイル: vogl_mem.cpp プロジェクト: Nicky-D/vogl
void *vogl_tracked_malloc(const char *pFile_line, size_t size, size_t *pActual_size)
{
    size = (size + sizeof(uint32) - 1U) & ~(sizeof(uint32) - 1U);
    if (!size)
        size = sizeof(uint32);

    if (size > VOGL_MAX_POSSIBLE_HEAP_BLOCK_SIZE)
    {
        vogl_mem_error("vogl_malloc: size too big", pFile_line);
        return NULL;
    }

    uint8 *p_new = (uint8 *)malloc_block(size, pFile_line);

    VOGL_ASSERT((reinterpret_cast<ptr_bits_t>(p_new) & (VOGL_MIN_ALLOC_ALIGNMENT - 1)) == 0);

    if (!p_new)
    {
        vogl_mem_error("vogl_malloc: out of memory", pFile_line);
        return NULL;
    }

    if (pActual_size)
    {
        *pActual_size = msize_block(p_new, pFile_line);

        if ((size) && (*pActual_size >= static_cast<uint64_t>(size) * 16U))
        {
            // I've seen this happen with glibc's absolutely terrible debug heap crap, best to let the caller know that shit is going to die
            fprintf(stderr, "%s: malloc_usable_size may be misbehaving! Requested %zu bytes, but the usable size is reported as %zu bytes.\n", __FUNCTION__, size, *pActual_size);
        }
    }

#if VOGL_RAND_FILL_ALLLOCATED_MEMORY
    random_fill(p_new, size);
#endif

    return p_new;
}