tlock malloc ourselves - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 7e0e6522e576bc35b55a7182c23fb752cc1ec636
 (DIR) parent c9896e2edba3bf17061447f3491a866a74e2cbb9
 (HTM) Author: rsc <devnull@localhost>
       Date:   Sun, 23 May 2004 00:58:23 +0000
       
       lock malloc ourselves
       
       Diffstat:
         M include/libc.h                      |      12 ++++++------
         M src/lib9/malloc.c                   |      49 ++++++++++++++++++++++++++++++-
       
       2 files changed, 54 insertions(+), 7 deletions(-)
       ---
 (DIR) diff --git a/include/libc.h b/include/libc.h
       t@@ -113,12 +113,9 @@ extern        void*        malloc(ulong);
         */
        extern        void*        p9malloc(ulong);
        extern        void*        mallocz(ulong, int);
       -/*
       -extern        void        free(void*);
       -extern        ulong        msize(void*);
       -extern        void*        calloc(ulong, ulong);
       -extern        void*        realloc(void*, ulong);
       - */
       +extern        void        p9free(void*);
       +extern        void*        p9calloc(ulong, ulong);
       +extern        void*        p9realloc(void*, ulong);
        extern        void                setmalloctag(void*, ulong);
        extern        void                setrealloctag(void*, ulong);
        extern        ulong        getmalloctag(void*);
       t@@ -128,6 +125,9 @@ extern        void*        malloctopoolblock(void*);
        */
        #ifndef NOPLAN9DEFINES
        #define        malloc        p9malloc
       +#define        realloc        p9realloc
       +#define        calloc        p9calloc
       +#define        free        p9free
        #endif
        
        /*
 (DIR) diff --git a/src/lib9/malloc.c b/src/lib9/malloc.c
       t@@ -2,10 +2,57 @@
        #define NOPLAN9DEFINES
        #include <libc.h>
        
       +/*
       + * The Unix libc routines cannot be trusted to do their own locking.
       + * Sad but apparently true.
       + */
       +
       +static Lock malloclock;
       +
        void*
        p9malloc(ulong n)
        {
       +        void *v;
                if(n == 0)
                        n++;
       -        return malloc(n);
       +//fprint(2, "%s %d malloc\n", argv0, getpid());
       +        lock(&malloclock);
       +        v = malloc(n);
       +        unlock(&malloclock);
       +//fprint(2, "%s %d donemalloc\n", argv0, getpid());
       +        return v;
       +}
       +
       +void
       +p9free(void *v)
       +{
       +//fprint(2, "%s %d free\n", argv0, getpid());
       +        lock(&malloclock);
       +        free(v);
       +        unlock(&malloclock);
       +//fprint(2, "%s %d donefree\n", argv0, getpid());
       +}
       +
       +void*
       +p9calloc(ulong a, ulong b)
       +{
       +        void *v;
       +
       +//fprint(2, "%s %d calloc\n", argv0, getpid());
       +        lock(&malloclock);
       +        v = calloc(a, b);
       +        unlock(&malloclock);
       +//fprint(2, "%s %d donecalloc\n", argv0, getpid());
       +        return v;
       +}
       +
       +void*
       +p9realloc(void *v, ulong n)
       +{
       +//fprint(2, "%s %d realloc\n", argv0, getpid());
       +        lock(&malloclock);
       +        v = realloc(v, n);
       +        unlock(&malloclock);
       +//fprint(2, "%s %d donerealloc\n", argv0, getpid());
       +        return v;
        }