Annotation of kernel/kern/malloc_debug.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.1 (the "License").  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License.
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: 
                     25: /* 
                     26:  * Copyright (c) 1990 NeXT, Inc.
                     27:  *
                     28:  * HISTORY
                     29:  * 29-Jun-90  Morris Meyer (mmeyer) at NeXT
                     30:  *     Created.
                     31:  */
                     32: 
                     33: #import <mallocdebug.h>
                     34: 
                     35: #if    MALLOCDEBUG
                     36: 
                     37: #import <sys/types.h>
                     38: #import <mach/boolean.h>
                     39: #import <kern/malloc_debug.h>
                     40: #import <sys/uio.h>
                     41: #import <sys/user.h>
                     42: #import <sys/vfs.h>
                     43: #import <sys/vnode.h>
                     44: #import <vm/vm_kern.h>
                     45: #import <vm/vm_pager.h>
                     46: #import <kern/lock.h>
                     47: #ifdef m68k
                     48: #import <machdep/m68k/eventc.h>
                     49: #endif m68k
                     50: 
                     51: int mallocdebug = FALSE;
                     52: int malloc_dropped = 0;
                     53: int malloc_curbuf = 0;
                     54: int malloc_buflim = 0;
                     55: char *malloctypes[] = { "MTYPE_KALLOC", "MTYPE_ZALLOC", "MTYPE_KMEM_ALLOC" };
                     56: struct vnode *mallocvp;
                     57: int mallocoffset;
                     58: struct mallocbuf {
                     59:        int numstamps;
                     60:        struct malloc_info mallocbufs[2048];
                     61: } mallocbuf [2];
                     62: static void malloc_debug_syncbufs (int nstamps, int whichbuf);
                     63: 
                     64: lock_data_t                    malloc_lock_data;
                     65: 
                     66: #define        malloc_lock()           lock_write(&malloc_lock_data)
                     67: #define        malloc_unlock()         lock_write_done(&malloc_lock_data)
                     68: 
                     69: mallocdebuginit()
                     70: {
                     71:        malloc_buflim = 2048;
                     72:        lock_init(&malloc_lock_data, TRUE);
                     73: }
                     74: 
                     75: void malloc_debug (void *addr, void *pc, int size, int which, int type)
                     76: {
                     77:        struct malloc_info mi, *mip;
                     78:        int write_buf;
                     79:        int numstamps = mallocbuf[malloc_curbuf].numstamps;
                     80:        
                     81:        if (mallocdebug) {
                     82:                mip = &mallocbuf[malloc_curbuf].mallocbufs[numstamps++];
                     83:                mi.type = type;
                     84:                mi.which = which;
                     85:                mi.addr = addr;
                     86:                mi.pc = pc;
                     87:                mi.size = size;
                     88: #if    m68k
                     89:                event_set_ts(&mi.time);
                     90: #endif m68k
                     91:                *(struct malloc_info *)mip = mi;
                     92: 
                     93:                if (numstamps >= malloc_buflim) {
                     94:                        write_buf = malloc_curbuf;
                     95:                        malloc_curbuf ^= 1;
                     96:                        malloc_debug_syncbufs(numstamps, write_buf);
                     97:                        numstamps = 0;
                     98:                }
                     99:                mallocbuf[malloc_curbuf].numstamps = numstamps;
                    100:        }
                    101: }
                    102: 
                    103: static void malloc_debug_syncbufs (int nstamps, int whichbuf)
                    104: {
                    105:        extern struct ucred *rootcred;
                    106:        struct vattr    vattr;
                    107:        struct uio auio;
                    108:        struct iovec aiov;
                    109:        int error;
                    110: 
                    111:        if (mallocvp == (struct vnode *)0)  {
                    112:                u.u_error = 0;
                    113:                vattr_null (&vattr);
                    114:                vattr.va_type = VREG;
                    115:                vattr.va_mode = 0644;
                    116:                vattr.va_size = 0;
                    117:                error = vn_create ("/mallocinfo", UIO_SYSSPACE, 
                    118:                                &vattr, NONEXCL, VWRITE, &mallocvp, rootcred);
                    119:                if (error)
                    120:                        panic ("vn_create: malloc_debug_syncbufs");
                    121:                (void) VOP_SETATTR(mallocvp, &vattr, rootcred);
                    122:        }
                    123:        
                    124:        error = vn_rdwr(UIO_WRITE, mallocvp, 
                    125:                        &mallocbuf[whichbuf].mallocbufs, 
                    126:                        nstamps * sizeof (struct malloc_info), mallocoffset,
                    127:                        UIO_SYSSPACE, IO_UNIT | IO_SYNC, (int *) 0);
                    128: 
                    129:        malloc_lock();
                    130:        mallocoffset += nstamps * sizeof (struct malloc_info);
                    131:        malloc_unlock();
                    132: }
                    133: 
                    134: /*
                    135:  * FIXME...
                    136:  */
                    137: #if    m88k
                    138: void *get_return_pc(void)
                    139: {
                    140:        return 0;
                    141: }
                    142: #endif m88k
                    143: #endif MALLOCDEBUG

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.