memarea.c File Reference

Implementation for memarea_t, an allocator for allocating lots of small objects that will be freed all at once. More...

#include "orconfig.h"
#include <stdlib.h>
#include "memarea.h"
#include "util.h"
#include "compat.h"
#include "log.h"

Data Structures

struct  memarea_chunk_t
struct  memarea_t

Defines

#define USE_SENTINELS
#define MEMAREA_ALIGN   SIZEOF_VOID_P
#define MEMAREA_ALIGN_MASK   7lu
#define SENTINEL_VAL   0x90806622u
#define SENTINEL_LEN   sizeof(uint32_t)
#define SET_SENTINEL(chunk)
#define CHECK_SENTINEL(chunk)
#define CHUNK_HEADER_SIZE   STRUCT_OFFSET(memarea_chunk_t, u)
#define CHUNK_SIZE   4096
#define MAX_FREELIST_LEN   4

Functions

static INLINE void * realign_pointer (void *ptr)
static memarea_chunk_talloc_chunk (size_t sz, int freelist_ok)
static void chunk_free_unchecked (memarea_chunk_t *chunk)
memarea_tmemarea_new (void)
void memarea_drop_all (memarea_t *area)
void memarea_clear (memarea_t *area)
void memarea_clear_freelist (void)
int memarea_owns_ptr (const memarea_t *area, const void *p)
void * memarea_alloc (memarea_t *area, size_t sz)
void * memarea_alloc_zero (memarea_t *area, size_t sz)
void * memarea_memdup (memarea_t *area, const void *s, size_t n)
char * memarea_strdup (memarea_t *area, const char *s)
char * memarea_strndup (memarea_t *area, const char *s, size_t n)
void memarea_get_stats (memarea_t *area, size_t *allocated_out, size_t *used_out)
void memarea_assert_ok (memarea_t *area)

Variables

static int freelist_len = 0
static memarea_chunk_tfreelist = NULL


Detailed Description

Implementation for memarea_t, an allocator for allocating lots of small objects that will be freed all at once.


Define Documentation

#define CHECK_SENTINEL ( chunk   ) 

Value:

STMT_BEGIN                                                            \
  uint32_t sent_val = get_uint32(&(chunk)->u.mem[chunk->mem_size]);     \
  tor_assert(sent_val == SENTINEL_VAL);                                 \
  STMT_END

#define MAX_FREELIST_LEN   4

How many chunks will we put into the freelist before freeing them?

Referenced by chunk_free_unchecked().

#define MEMAREA_ALIGN   SIZEOF_VOID_P

All returned pointers should be aligned to the nearest multiple of this value.

#define SET_SENTINEL ( chunk   ) 

Value:

STMT_BEGIN                                                    \
  set_uint32( &(chunk)->u.mem[chunk->mem_size], SENTINEL_VAL ); \
  STMT_END

#define USE_SENTINELS

If true, we try to detect any attempts to write beyond the length of a memarea.


Function Documentation

static memarea_chunk_t* alloc_chunk ( size_t  sz,
int  freelist_ok 
) [static]

Helper: allocate a new memarea chunk of around chunk_size bytes.

References freelist_len, memarea_chunk_t::mem, memarea_chunk_t::mem_size, memarea_chunk_t::next_chunk, memarea_chunk_t::next_mem, realign_pointer(), tor_assert, and memarea_chunk_t::u.

Referenced by memarea_alloc(), and memarea_new().

static void chunk_free_unchecked ( memarea_chunk_t chunk  )  [static]

Release chunk from a memarea, either by adding it to the freelist or by freeing it if the freelist is already too big.

References freelist_len, MAX_FREELIST_LEN, memarea_chunk_t::mem, memarea_chunk_t::next_chunk, memarea_chunk_t::next_mem, tor_free, and memarea_chunk_t::u.

Referenced by buf_clear(), buf_pullup(), buf_remove_from_front(), memarea_clear(), and memarea_drop_all().

void* memarea_alloc ( memarea_t area,
size_t  sz 
)

Return a pointer to a chunk of memory in area of at least sz bytes. sz should be significantly smaller than the area's chunk size, though we can deal if it isn't.

References alloc_chunk(), memarea_t::first, memarea_chunk_t::mem, memarea_chunk_t::mem_size, memarea_chunk_t::next_chunk, memarea_chunk_t::next_mem, realign_pointer(), tor_assert, and memarea_chunk_t::u.

Referenced by memarea_alloc_zero(), memarea_memdup(), and memarea_strndup().

void* memarea_alloc_zero ( memarea_t area,
size_t  sz 
)

As memarea_alloc(), but clears the memory it returns.

References memarea_alloc().

void memarea_assert_ok ( memarea_t area  ) 

void memarea_clear ( memarea_t area  ) 

Forget about having allocated anything in area, and free some of the backing storage associated with it, as appropriate. Invalidates all pointers returned from memarea_alloc() for this area.

References chunk_free_unchecked(), memarea_t::first, memarea_chunk_t::mem, memarea_chunk_t::next_chunk, memarea_chunk_t::next_mem, and memarea_chunk_t::u.

Referenced by microdescs_parse_from_string(), networkstatus_v2_parse_from_string(), rend_parse_client_keys(), rend_parse_introduction_points(), router_parse_directory(), and routerstatus_parse_entry_from_string().

void memarea_clear_freelist ( void   ) 

Remove all unused memarea chunks from the internal freelist.

References freelist_len, memarea_chunk_t::next_chunk, and tor_free.

Referenced by tor_free_all().

void memarea_drop_all ( memarea_t area  ) 

void memarea_get_stats ( memarea_t area,
size_t *  allocated_out,
size_t *  used_out 
)

Set allocated_out to the number of bytes allocated in area, and used_out to the number of bytes currently used.

References memarea_t::first, memarea_chunk_t::mem, memarea_chunk_t::mem_size, memarea_chunk_t::next_chunk, memarea_chunk_t::next_mem, tor_assert, and memarea_chunk_t::u.

void* memarea_memdup ( memarea_t area,
const void *  s,
size_t  n 
)

As memdup, but returns the memory from area.

References memarea_alloc().

Referenced by get_token_arguments(), and memarea_strdup().

memarea_t* memarea_new ( void   ) 

int memarea_owns_ptr ( const memarea_t area,
const void *  p 
)

Return true iff p is in a range that has been returned by an allocation from area.

References memarea_t::first, memarea_chunk_t::mem, memarea_chunk_t::next_chunk, and memarea_chunk_t::u.

char* memarea_strdup ( memarea_t area,
const char *  s 
)

As strdup, but returns the memory from area.

References memarea_memdup().

char* memarea_strndup ( memarea_t area,
const char *  s,
size_t  n 
)

As strndup, but returns the memory from area.

References memarea_alloc().

Referenced by get_token_arguments().

static INLINE void* realign_pointer ( void *  ptr  )  [static]

Increment ptr until it is aligned to MEMAREA_ALIGN.

References tor_assert.

Referenced by alloc_chunk(), memarea_alloc(), and memarea_assert_ok().


Variable Documentation

memarea_chunk_t* freelist = NULL [static]

A linked list of unused memory area chunks. Used to prevent us from spinning in malloc/free loops.

Referenced by chunk_free_unchecked(), and chunk_new_with_alloc_size().

int freelist_len = 0 [static]

The number of memarea chunks currently in our freelist.

Referenced by alloc_chunk(), chunk_free_unchecked(), and memarea_clear_freelist().


Generated on Tue May 25 00:30:44 2010 for tor by  doxygen 1.5.6