Provided by: libatomic-ops-dev_7.6.2-1_amd64 bug

NAME

       libatomic-malloc - Library providing simple almost-lock-free malloc implementation

SYNOPSIS

       #include <atomic_ops_malloc.h>

       cc ... -latomic_ops_gpl

       Note  that  the AO_malloc implementation is licensed under the GPL, unlike the lower level
       routines.

       void *AO_malloc(size_t sz);
       void AO_free(void *p);
       void AO_malloc_enable_mmap(void);

DESCRIPTION

       A simple almost-lock-free malloc implementation.

       This is intended as a safe way to allocate memory from a signal handler,  or  to  allocate
       memory  in the context of a library that does not know what thread library it will be used
       with.  In either case locking is impossible.

       Note that the operations are only guaranteed to be  1-lock-free,  i.e.  a  single  blocked
       thread  will  not prevent progress, but multiple blocked threads may.  To safely use these
       operations in a signal handler, the handler should be non-reentrant, i.e. it should not be
       interruptable  by  another  handler  using  these  operations.  Furthermore use outside of
       signal handlers in a multithreaded application should be protected by a lock, so  that  at
       most  one  invocation  may  be  interrupted by a signal.  The header will define the macro
       AO_MALLOC_IS_LOCK_FREE on platforms on which malloc is  completely  lock-free,  and  hence
       these restrictions do not apply.

       In  the  presence  of  threads,  but  absence  of contention, the time performance of this
       package should be as good, or slightly better than, most  system  malloc  implementations.
       Its space performance is theoretically optimal (to within a constant factor), but probably
       quite poor in practice.  In particular, no attempt is made to coalesce free  small  memory
       blocks.   Something  like Doug Lea's malloc is likely to use significantly less memory for
       complex applications.

       Perfomance on platforms without an efficient compare-and-swap implementation will be poor.

       This package was not designed for processor-scalability in the  face  of  high  allocation
       rates.   If  all  threads happen to allocate different-sized objects, you might get lucky.
       Otherwise expect contention and false-sharing problems.  If this is  an  issue,  something
       like  Maged  Michael's algorithm (PLDI 2004) would be technically a far better choice.  If
       you are concerned only with scalablity, and not signal-safety,  you  might  also  consider
       using  Hoard  instead.   We  have seen a factor of 3 to 4 slowdown from the standard glibc
       malloc implementation with contention, even when the performance  without  contention  was
       faster.   (To  make the implementation more scalable, one would need to replicate at least
       the free list headers, so that concurrent access is possible without cache conflicts.)

       Unfortunately there is no portable async-signal-safe way to obtain large chunks of  memory
       from  the  OS.   Based  on  reading of the source code, mmap-based allocation appears safe
       under Linux, and probably BSD variants.  It is probably unsafe for operating systems built
       on Mach, such as Apple's Darwin.  Without use of mmap, the allocator is limited to a fixed
       size, statically preallocated heap (2MB by default), and will  fail  to  allocate  objects
       above  a  certain  size  (just  under  64K  by  default).  Use of mmap to circumvent these
       limitations requires an explicit call.

       The entire interface to the AO_malloc package currently consists of:

       AO_malloc
              Allocate an area of memory

       AO_free
              Free a previously malloced memory area

       AO_malloc_enable_mmap
              Enable mmap for large malloc chunks

SEE ALSO

       libatomic-ops(3), libatomic-stack(3)

AUTHOR

       This manual page was written by Ian Wienand <ianw@gelato.unsw.edu.au>, based  on  comments
       in the source code.  It was written for the Debian project (but may be used by others).