Annotation of kernel/driverkit/objc_support.m, 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: /* Copyright (c) 1992 NeXT Computer, Inc.  All rights reserved.
                     26:  * 
                     27:  *     File:   driverkit/objc_support.m
                     28:  *
                     29:  *     Run-time support for kernel ObjC library.
                     30:  *
                     31:  * HISTORY
                     32:  * 31-Jan-92   Doug Mitchell at NeXT
                     33:  *     Created.
                     34:  */
                     35: 
                     36: #import <streams/streams.h>
                     37: #import <bsd/sys/syslog.h>
                     38: #import <bsd/stdarg.h>
                     39: #import <bsd/machine/spl.h>
                     40: 
                     41: /*
                     42:  * FIXME - what the heck is this?
                     43:  */
                     44: char **NXArgv;
                     45: 
                     46: int NXFlush(NXStream *s)
                     47: {
                     48:        /*
                     49:         * Nothing to do for now.
                     50:         */
                     51:        return 0;
                     52: }
                     53: 
                     54: void NXPrintf(NXStream *s, const char *format, ...)
                     55: {
                     56:        register sp = splhigh();
                     57:        va_list ap;
                     58: 
                     59:        va_start(ap, format);
                     60:        log(LOG_ERR, format, ap);
                     61:        va_end(ap);
                     62:        splx(sp);
                     63: }
                     64: 
                     65: /*
                     66:  * This should never be called...
                     67:  */
                     68: void abort()
                     69: {
                     70:        panic("objc: fatal error\n");
                     71: }
                     72: 
                     73: #import <objc/zone.h>
                     74: 
                     75: #import <kern/kalloc.h>
                     76: 
                     77: #define        MDECL(reqlen)                                   \
                     78: union {                                                        \
                     79:        struct  _mhead hdr;                             \
                     80:        char    _m[(reqlen) + sizeof (struct _mhead)];  \
                     81: }
                     82: 
                     83: struct _mhead {
                     84:        size_t  mlen;
                     85:        char    dat[0];
                     86: };
                     87: 
                     88: static __inline__
                     89: void *kern_malloc(
                     90:        struct _NXZone  *zonep,
                     91:        size_t          size)
                     92: {
                     93:        MDECL(size)     *mem;
                     94:        size_t          memsize = sizeof (*mem);
                     95: 
                     96:        if (size == 0)
                     97:                return (0);
                     98: 
                     99:        mem = (void *)kalloc(memsize);
                    100:        if (!mem)
                    101:                return (0);
                    102: 
                    103:        mem->hdr.mlen = memsize;
                    104:        (void) memset(mem->hdr.dat, 0, size);
                    105: 
                    106:        return  (mem->hdr.dat);
                    107: }
                    108: 
                    109: static __inline__
                    110: void kern_free(
                    111:        struct _NXZone  *zonep,
                    112:        void            *addr)
                    113: {
                    114:        struct _mhead   *hdr;
                    115: 
                    116:        if (!addr)
                    117:                return;
                    118: 
                    119:        hdr = addr; hdr--;
                    120:        kfree((vm_offset_t)hdr, hdr->mlen);
                    121: }
                    122: 
                    123: static
                    124: void *kern_realloc(
                    125:         struct _NXZone *zonep,
                    126:        void            *addr,
                    127:        size_t          nsize)
                    128: {
                    129:        struct _mhead   *ohdr;
                    130:        MDECL(nsize)    *nmem;
                    131:        size_t          nmemsize, osize;
                    132:        
                    133:        if (!addr)
                    134:                return (kern_malloc(zonep, nsize));
                    135: 
                    136:        ohdr = addr; ohdr--;
                    137:        osize = ohdr->mlen - sizeof (*ohdr);
                    138:        if (nsize == osize)
                    139:                return (addr);
                    140: 
                    141:        if (nsize == 0) {
                    142:                kfree((vm_offset_t)ohdr, ohdr->mlen);
                    143:                return (0);
                    144:        }
                    145: 
                    146:        nmemsize = sizeof (*nmem);
                    147:        nmem = (void *)kalloc(nmemsize);
                    148:        if (!nmem)
                    149:                return (0);
                    150: 
                    151:        nmem->hdr.mlen = nmemsize;
                    152:        if (nsize > osize)
                    153:                (void) memset(&nmem->hdr.dat[osize], 0, nsize - osize);
                    154:        (void) memcpy(nmem->hdr.dat, ohdr->dat,
                    155:                                        (nsize > osize) ? osize : nsize);
                    156:        kfree((vm_offset_t)ohdr, ohdr->mlen);
                    157: 
                    158:        return (nmem->hdr.dat);
                    159: }
                    160: 
                    161: static void kern_destroy(struct _NXZone *zonep) 
                    162: {
                    163: }
                    164: 
                    165: NXZone KernelZone = {
                    166:        kern_realloc,
                    167:        kern_malloc,
                    168:        kern_free,
                    169:        kern_destroy,
                    170: };
                    171: 
                    172: NXZone *NXDefaultMallocZone()
                    173: {
                    174:        return &KernelZone; 
                    175: }
                    176: 
                    177: NXZone *NXZoneFromPtr(void *ptr)
                    178: {
                    179:        return(&KernelZone);
                    180: }
                    181: 
                    182: 
                    183: NXZone *NXCreateZone(size_t startsize, size_t granularity, int canfree)
                    184: {
                    185:        return(&KernelZone);
                    186: }
                    187: 
                    188: void NXNameZone(NXZone *z, const char *name)
                    189: {
                    190:        /* EMPTY */
                    191: }
                    192: 
                    193: void *
                    194: NXZoneCalloc(NXZone *zonep, size_t numElems, size_t byteSize)
                    195: {
                    196:        return kern_malloc(zonep, numElems*byteSize);
                    197: }
                    198: 
                    199: void *malloc(
                    200:        size_t          size)
                    201: {
                    202:        return kern_malloc(&KernelZone, size);
                    203: }
                    204: 
                    205: void free(
                    206:        void            *addr)
                    207: {
                    208:        kern_free(&KernelZone, addr);
                    209: }
                    210: 
                    211: void *calloc(
                    212:        size_t          num,
                    213:        size_t          size)
                    214: {
                    215:        return kern_malloc(&KernelZone, num*size);
                    216: }
                    217: 
                    218: void *realloc(
                    219:        void            *addr,
                    220:        size_t          size)
                    221: {
                    222:        return kern_realloc(&KernelZone, addr, size);
                    223: }

unix.superglobalmegacorp.com

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