umem 1.0.1
Macros | Functions | Variables
umem.c File Reference
#include "config.h"
#include <umem_impl.h>
#include <sys/vmem_impl_user.h>
#include "umem_base.h"
#include "vmem_base.h"
#include <sys/sysmacros.h>
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <signal.h>
#include <unistd.h>
#include "misc.h"

Macros

#define UMEM_VMFLAGS(umflag)   (VM_NOSLEEP)
 
#define NUM_ALLOC_SIZES   (sizeof (umem_alloc_sizes) / sizeof (*umem_alloc_sizes))
 
#define UMEM_MAXBUF   16384
 
#define CPUHINT()   (_thr_self())
 
#define CPUHINT_MAX()   INT_MAX
 
#define CPU(mask)   (umem_cpus + (CPUHINT() & (mask)))
 
#define IN_UPDATE()
 
#define IN_REAP()   IN_UPDATE()
 
#define ALLOC_TABLE_4    &umem_null_cache, &umem_null_cache, &umem_null_cache, &umem_null_cache
 
#define ALLOC_TABLE_64
 
#define ALLOC_TABLE_1024
 
#define UMERR_MODIFIED   0 /* buffer modified while on freelist */
 
#define UMERR_REDZONE   1 /* redzone violation (write past end of buf) */
 
#define UMERR_DUPFREE   2 /* freed a buffer twice */
 
#define UMERR_BADADDR   3 /* freed a bad (unallocated) address */
 
#define UMERR_BADBUFTAG   4 /* buftag corrupted */
 
#define UMERR_BADBUFCTL   5 /* bufctl corrupted */
 
#define UMERR_BADCACHE   6 /* freed a buffer to the wrong cache */
 
#define UMERR_BADSIZE   7 /* alloc size != free size */
 
#define UMERR_BADBASE   8 /* buffer base address wrong */
 
#define UMEM_AUDIT(lp, cp, bcp)
 

Functions

thread_t _thr_self (void)
 
int _cond_wait (cond_t *cv, mutex_t *mutex)
 
void umem_cache_applyall (void(*func)(umem_cache_t *))
 
void umem_nofail_callback (umem_nofail_callback_t *cb)
 
void * _umem_cache_alloc (umem_cache_t *cp, int umflag)
 
void _umem_cache_free (umem_cache_t *cp, void *buf)
 
void * _umem_zalloc (size_t size, int umflag)
 
void * _umem_alloc (size_t size, int umflag)
 
void * _umem_alloc_align (size_t size, size_t align, int umflag)
 
void _umem_free (void *buf, size_t size)
 
void _umem_free_align (void *buf, size_t size)
 
void umem_cache_update (umem_cache_t *cp)
 
void umem_process_updates (void)
 
void umem_reap (void)
 
umem_cache_tumem_cache_create (char *name, size_t bufsize, size_t align, umem_constructor_t *constructor, umem_destructor_t *destructor, umem_reclaim_t *reclaim, void *private, vmem_t *vmp, int cflags)
 
void umem_cache_destroy (umem_cache_t *cp)
 
void umem_startup (caddr_t start, size_t len, size_t pagesize, caddr_t minstack, caddr_t maxstack)
 
int umem_init (void)
 

Variables

size_t pagesize
 
uint32_t umem_max_ncpus
 
uint32_t umem_stack_depth = 15
 
uint32_t umem_reap_interval = 10
 
uint_t umem_depot_contention = 2
 
uint_t umem_abort = 1
 
uint_t umem_output = 0
 
uint_t umem_logging = 0
 
uint32_t umem_mtbf = 0
 
size_t umem_transaction_log_size
 
size_t umem_content_log_size
 
size_t umem_failure_log_size
 
size_t umem_slab_log_size
 
size_t umem_content_maxsave = 256
 
size_t umem_lite_minsize = 0
 
size_t umem_lite_maxalign = 1024
 
size_t umem_maxverify
 
size_t umem_minfirewall
 
uint_t umem_flags = 0
 
mutex_t umem_init_lock = DEFAULTMUTEX
 
cond_t umem_init_cv = DEFAULTCV
 
thread_t umem_init_thr
 
int umem_init_env_ready
 
int umem_ready = UMEM_READY_STARTUP
 
mutex_t umem_flags_lock = DEFAULTMUTEX
 
vmem_tumem_memalign_arena
 
umem_log_header_tumem_transaction_log
 
umem_log_header_tumem_content_log
 
umem_log_header_tumem_failure_log
 
umem_log_header_tumem_slab_log
 
volatile uint32_t umem_reaping
 
thread_t umem_update_thr
 
struct timeval umem_update_next
 
volatile thread_t umem_st_update_thr
 
mutex_t umem_update_lock = DEFAULTMUTEX
 
cond_t umem_update_cv = DEFAULTCV
 
volatile hrtime_t umem_reap_next
 
mutex_t umem_cache_lock = DEFAULTMUTEX
 
umem_cache_t umem_null_cache
 
caddr_t umem_min_stack
 
caddr_t umem_max_stack
 
struct { 
 
   hrtime_t   ump_timestamp 
 
   int   ump_error 
 
   void *   ump_buffer 
 
   void *   ump_realbuf 
 
   umem_cache_t *   ump_cache 
 
   umem_cache_t *   ump_realcache 
 
   umem_slab_t *   ump_slab 
 
   umem_bufctl_t *   ump_bufctl 
 
umem_abort_info 
 

Macro Definition Documentation

◆ ALLOC_TABLE_1024

#define ALLOC_TABLE_1024

◆ ALLOC_TABLE_4

#define ALLOC_TABLE_4    &umem_null_cache, &umem_null_cache, &umem_null_cache, &umem_null_cache

◆ ALLOC_TABLE_64

#define ALLOC_TABLE_64

◆ CPU

#define CPU ( mask)    (umem_cpus + (CPUHINT() & (mask)))

◆ CPUHINT

#define CPUHINT ( )    (_thr_self())

◆ CPUHINT_MAX

#define CPUHINT_MAX ( )    INT_MAX

Referenced by umem_init().

◆ IN_REAP

#define IN_REAP ( )    IN_UPDATE()

◆ IN_UPDATE

#define IN_UPDATE ( )
Value:
thr_self() == umem_st_update_thr)
#define thr_self()
Definition sol_compat.h:58
volatile thread_t umem_st_update_thr
Definition umem.c:544
thread_t umem_update_thr
Definition umem.c:542

◆ NUM_ALLOC_SIZES

#define NUM_ALLOC_SIZES   (sizeof (umem_alloc_sizes) / sizeof (*umem_alloc_sizes))

◆ UMEM_AUDIT

#define UMEM_AUDIT ( lp,
cp,
bcp )
Value:
{ \
_bcp->bc_timestamp = gethrtime(); \
_bcp->bc_thread = thr_self(); \
(cp != NULL) && (cp->cache_flags & UMF_CHECKSIGNAL)); \
_bcp->bc_lastlog = umem_log_enter((lp), _bcp, \
}
int getpcstack(uintptr_t *pcstack, int pcstack_limit, int check_signal)
Definition getpcstack.c:75
Definition umem_impl.h:150
hrtime_t bc_timestamp
Definition umem_impl.h:155
thread_t bc_thread
Definition umem_impl.h:156
int bc_depth
Definition umem_impl.h:159
struct umem_bufctl * bc_lastlog
Definition umem_impl.h:157
uintptr_t bc_stack[1]
Definition umem_impl.h:160
uint32_t umem_stack_depth
Definition umem.c:464
#define UMF_CHECKSIGNAL
Definition umem_impl.h:73
#define UMEM_BUFCTL_AUDIT_SIZE
Definition umem_impl.h:167

◆ UMEM_MAXBUF

#define UMEM_MAXBUF   16384

Referenced by malloc(), memalign(), and umem_startup().

◆ UMEM_VMFLAGS

#define UMEM_VMFLAGS ( umflag)    (VM_NOSLEEP)

Referenced by _umem_alloc(), and _umem_alloc_align().

◆ UMERR_BADADDR

#define UMERR_BADADDR   3 /* freed a bad (unallocated) address */

◆ UMERR_BADBASE

#define UMERR_BADBASE   8 /* buffer base address wrong */

◆ UMERR_BADBUFCTL

#define UMERR_BADBUFCTL   5 /* bufctl corrupted */

◆ UMERR_BADBUFTAG

#define UMERR_BADBUFTAG   4 /* buftag corrupted */

◆ UMERR_BADCACHE

#define UMERR_BADCACHE   6 /* freed a buffer to the wrong cache */

◆ UMERR_BADSIZE

#define UMERR_BADSIZE   7 /* alloc size != free size */

Referenced by _umem_free().

◆ UMERR_DUPFREE

#define UMERR_DUPFREE   2 /* freed a buffer twice */

Referenced by _umem_free().

◆ UMERR_MODIFIED

#define UMERR_MODIFIED   0 /* buffer modified while on freelist */

◆ UMERR_REDZONE

#define UMERR_REDZONE   1 /* redzone violation (write past end of buf) */

Referenced by _umem_free().

Function Documentation

◆ _cond_wait()

int _cond_wait ( cond_t * cv,
mutex_t * mutex )
extern

◆ _thr_self()

thread_t _thr_self ( void )
extern

◆ _umem_alloc()

void * _umem_alloc ( size_t size,
int umflag )

◆ _umem_alloc_align()

void * _umem_alloc_align ( size_t size,
size_t align,
int umflag )

◆ _umem_cache_alloc()

void * _umem_cache_alloc ( umem_cache_t * cp,
int umflag )

◆ _umem_cache_free()

void _umem_cache_free ( umem_cache_t * cp,
void * buf )

◆ _umem_free()

void _umem_free ( void * buf,
size_t size )

◆ _umem_free_align()

void _umem_free_align ( void * buf,
size_t size )

◆ _umem_zalloc()

void * _umem_zalloc ( size_t size,
int umflag )

◆ umem_cache_applyall()

void umem_cache_applyall ( void(*)(umem_cache_t *) func)

◆ umem_cache_create()

umem_cache_t * umem_cache_create ( char * name,
size_t bufsize,
size_t align,
umem_constructor_t * constructor,
umem_destructor_t * destructor,
umem_reclaim_t * reclaim,
void * private,
vmem_t * vmp,
int cflags )

References ASSERT, umem_cache::cache_align, umem_cache::cache_arena, umem_cache::cache_bufctl, umem_cache::cache_bufctl_cache, umem_cache::cache_bufsize, umem_cache::cache_buftag, umem_cache::cache_cflags, umem_cache::cache_chunksize, umem_cache::cache_color, umem_cache::cache_constructor, umem_cache::cache_contents, umem_cache::cache_cpu, umem_cache::cache_cpu_mask, umem_cache::cache_depot_lock, umem_cache::cache_destructor, umem_cache::cache_flags, umem_cache::cache_freelist, umem_cache::cache_hash_mask, umem_cache::cache_hash_shift, umem_cache::cache_hash_table, umem_cache::cache_lock, umem_cache::cache_magtype, umem_cache::cache_maxcolor, umem_cache::cache_mincolor, umem_cache::cache_name, umem_cache::cache_next, umem_cache::cache_nullslab, umem_cache::cache_prev, umem_cache::cache_private, umem_cache::cache_reclaim, umem_cache::cache_slabsize, umem_cache::cache_verify, umem_cpu_cache::cc_flags, umem_cpu_cache::cc_lock, umem_cpu_cache::cc_prounds, umem_cpu_cache::cc_rounds, highbit(), MAX, MIN, umem_magtype::mt_minbuf, mutex_destroy, mutex_init, mutex_lock, mutex_unlock, P2NPHASE, P2PHASE, P2ROUNDUP, umem_slab::slab_cache, umem_slab::slab_next, umem_slab::slab_prev, umem_slab::slab_refcnt, thr_self, UMC_INTERNAL, UMC_NODEBUG, UMC_NOHASH, UMC_NOMAGAZINE, UMC_NOTOUCH, UMC_QCACHE, UMEM_ALIGN, umem_cache_lock, UMEM_CACHE_SIZE, umem_content_maxsave, UMEM_CPU_CACHE_SIZE, umem_flags, umem_flags_lock, UMEM_HASH_INITIAL, umem_init(), umem_init_thr, umem_lite_maxalign, umem_lite_minsize, umem_max_ncpus, umem_maxverify, umem_minfirewall, umem_null_cache, umem_ready, UMEM_READY, UMEM_SECOND_ALIGN, UMEM_VOID_FRACTION, UMF_AUDIT, UMF_BUFTAG, UMF_DEADBEEF, UMF_DEBUG, UMF_FIREWALL, UMF_HASH, UMF_LITE, UMF_NOMAGAZINE, UMF_RANDOM, UMF_RANDOMIZE, UMF_REDZONE, VM_NOSLEEP, vmem::vm_qcache_max, vmem::vm_quantum, vmem_alloc(), vmem_xalloc(), and vmem_xfree().

Referenced by vmem_create().

◆ umem_cache_destroy()

void umem_cache_destroy ( umem_cache_t * cp)

◆ umem_cache_update()

void umem_cache_update ( umem_cache_t * cp)

◆ umem_init()

int umem_init ( void )

◆ umem_nofail_callback()

void umem_nofail_callback ( umem_nofail_callback_t * cb)

◆ umem_process_updates()

void umem_process_updates ( void )

◆ umem_reap()

void umem_reap ( void )

◆ umem_startup()

void umem_startup ( caddr_t start,
size_t len,
size_t pagesize,
caddr_t minstack,
caddr_t maxstack )

Variable Documentation

◆ pagesize

size_t pagesize

◆ umem_abort

uint_t umem_abort = 1

Referenced by umem_err_recoverable().

◆ [struct]

struct { ... } umem_abort_info

◆ umem_cache_lock

mutex_t umem_cache_lock = DEFAULTMUTEX

◆ umem_content_log

umem_log_header_t* umem_content_log

Referenced by umem_init(), and umem_startup().

◆ umem_content_log_size

size_t umem_content_log_size

Referenced by umem_init().

◆ umem_content_maxsave

size_t umem_content_maxsave = 256

Referenced by umem_cache_create().

◆ umem_depot_contention

uint_t umem_depot_contention = 2

Referenced by umem_cache_update().

◆ umem_failure_log

umem_log_header_t* umem_failure_log

◆ umem_failure_log_size

size_t umem_failure_log_size

Referenced by umem_init().

◆ umem_flags

uint_t umem_flags = 0

Referenced by umem_cache_create(), and umem_init().

◆ umem_flags_lock

mutex_t umem_flags_lock = DEFAULTMUTEX

Referenced by umem_cache_create().

◆ umem_init_cv

cond_t umem_init_cv = DEFAULTCV

Referenced by umem_init().

◆ umem_init_env_ready

int umem_init_env_ready

Referenced by umem_init(), and umem_startup().

◆ umem_init_lock

mutex_t umem_init_lock = DEFAULTMUTEX

Referenced by umem_init().

◆ umem_init_thr

thread_t umem_init_thr

◆ umem_lite_maxalign

size_t umem_lite_maxalign = 1024

Referenced by umem_cache_create().

◆ umem_lite_minsize

size_t umem_lite_minsize = 0

Referenced by umem_cache_create().

◆ umem_logging

uint_t umem_logging = 0

Referenced by umem_init().

◆ umem_max_ncpus

uint32_t umem_max_ncpus

◆ umem_max_stack

caddr_t umem_max_stack

Referenced by getpcstack(), and umem_startup().

◆ umem_maxverify

size_t umem_maxverify

Referenced by umem_cache_create(), and umem_init().

◆ umem_memalign_arena

vmem_t* umem_memalign_arena

◆ umem_min_stack

caddr_t umem_min_stack

Referenced by getpcstack(), and umem_startup().

◆ umem_minfirewall

size_t umem_minfirewall

Referenced by umem_cache_create(), and umem_init().

◆ umem_mtbf

uint32_t umem_mtbf = 0

Referenced by umem_init().

◆ umem_null_cache

umem_cache_t umem_null_cache

◆ umem_output

uint_t umem_output = 0

Referenced by log_message(), and umem_error_enter().

◆ umem_ready

int umem_ready = UMEM_READY_STARTUP

◆ umem_reap_interval

uint32_t umem_reap_interval = 10

◆ umem_reap_next

volatile hrtime_t umem_reap_next

Referenced by umem_init(), and umem_reap().

◆ umem_reaping

volatile uint32_t umem_reaping

Referenced by umem_reap().

◆ umem_slab_log

umem_log_header_t* umem_slab_log

Referenced by umem_init(), and umem_startup().

◆ umem_slab_log_size

size_t umem_slab_log_size

Referenced by umem_init().

◆ umem_st_update_thr

volatile thread_t umem_st_update_thr

Referenced by umem_reap().

◆ umem_stack_depth

uint32_t umem_stack_depth = 15

◆ umem_transaction_log

umem_log_header_t* umem_transaction_log

Referenced by umem_init(), and umem_startup().

◆ umem_transaction_log_size

size_t umem_transaction_log_size

Referenced by umem_init().

◆ umem_update_cv

cond_t umem_update_cv = DEFAULTCV

Referenced by umem_process_updates(), and umem_reap().

◆ umem_update_lock

mutex_t umem_update_lock = DEFAULTMUTEX

◆ umem_update_next

struct timeval umem_update_next

Referenced by umem_init().

◆ umem_update_thr

thread_t umem_update_thr

◆ ump_bufctl

umem_bufctl_t* ump_bufctl

◆ ump_buffer

void* ump_buffer

◆ ump_cache

umem_cache_t* ump_cache

◆ ump_error

int ump_error

◆ ump_realbuf

void* ump_realbuf

◆ ump_realcache

umem_cache_t* ump_realcache

◆ ump_slab

umem_slab_t* ump_slab

◆ ump_timestamp

hrtime_t ump_timestamp