Annotation of embedaddon/mpd/src/mbuf.c, revision 1.1.1.1

1.1       misho       1: 
                      2: /*
                      3:  * mbuf.c
                      4:  *
                      5:  * Written by Toshiharu OHNO <tony-o@iij.ad.jp>
                      6:  * Copyright (c) 1993, Internet Initiative Japan, Inc. All rights reserved.
                      7:  * See ``COPYRIGHT.iij''
                      8:  * 
                      9:  * Rewritten by Archie Cobbs <archie@freebsd.org>
                     10:  * Copyright (c) 1995-1999 Whistle Communications, Inc. All rights reserved.
                     11:  * See ``COPYRIGHT.whistle''
                     12:  */
                     13: 
                     14: #include "ppp.h"
                     15: 
                     16: /*
                     17:  * Malloc()
                     18:  *
                     19:  * Replacement for the usual malloc()
                     20:  */
                     21: 
                     22: void *
                     23: Malloc(const char *type, size_t size)
                     24: {
                     25:     const char **memory;
                     26: 
                     27:     if ((memory = MALLOC(type, sizeof(char *) + size)) == NULL) {
                     28:        Perror("Malloc: malloc");
                     29:        DoExit(EX_ERRDEAD);
                     30:     }
                     31: 
                     32:     memory[0] = type;
                     33:     bzero(memory + 1, size);
                     34:     return (memory + 1);
                     35: }
                     36: 
                     37: /*
                     38:  * Mdup()
                     39:  *
                     40:  * Malloc() + memcpy()
                     41:  */
                     42: 
                     43: void *
                     44: Mdup(const char *type, const void *src, size_t size)
                     45: {
                     46:     const char **memory;
                     47:     if ((memory = MALLOC(type, sizeof(char *) + size)) == NULL) {
                     48:        Perror("Mdup: malloc");
                     49:        DoExit(EX_ERRDEAD);
                     50:     }
                     51: 
                     52:     memory[0] = type;
                     53:     memcpy(memory + 1, src, size);
                     54:     return(memory + 1);
                     55: }
                     56: 
                     57: void *
                     58: Mstrdup(const char *type, const void *src)
                     59: {
                     60:     return (Mdup(type, src, strlen(src) + 1));
                     61: }
                     62: 
                     63: /*
                     64:  * Freee()
                     65:  *
                     66:  * Replacement for the ususal free()
                     67:  */
                     68: 
                     69: void
                     70: Freee(void *ptr)
                     71: {
                     72:     if (ptr) {
                     73:        char    **memory = ptr;
                     74:        memory--;
                     75:        FREE(memory[0], memory);
                     76:     }
                     77: }
                     78: 
                     79: /*
                     80:  * mballoc()
                     81:  *
                     82:  * Allocate an mbuf with memory
                     83:  */
                     84: 
                     85: Mbuf
                     86: mballoc(int size)
                     87: {
                     88:     u_char     *memory;
                     89:     int                amount, osize;
                     90:     Mbuf       bp;
                     91: 
                     92:     assert(size >= 0);
                     93: 
                     94:     if (size == 0) {
                     95:        osize = 64 - sizeof(*bp);
                     96:     } else if (size < 512)
                     97:        osize = ((size - 1) / 32 + 1) * 64 - sizeof(*bp);
                     98:     else
                     99:        osize = ((size - 1) / 64 + 1) * 64 + 512 - sizeof(*bp);
                    100:     amount = sizeof(*bp) + osize;
                    101: 
                    102:     if ((memory = MALLOC(MB_MBUF, amount)) == NULL) {
                    103:        Perror("mballoc: malloc");
                    104:        DoExit(EX_ERRDEAD);
                    105:     }
                    106: 
                    107:     /* Put mbuf at front of memory region */
                    108:     bp = (Mbuf)(void *)memory;
                    109:     bp->size = osize;
                    110:     bp->offset = (osize - size) / 2;
                    111:     bp->cnt = 0;
                    112: 
                    113:     return (bp);
                    114: }
                    115: 
                    116: /*
                    117:  * mbfree()
                    118:  *
                    119:  * Free head of chain, return next
                    120:  */
                    121: 
                    122: void
                    123: mbfree(Mbuf bp)
                    124: {
                    125:     if (bp)
                    126:        FREE(MB_MBUF, bp);
                    127: }
                    128: 
                    129: /*
                    130:  * mbread()
                    131:  *
                    132:  * Read contents of an mbuf chain into buffer, consuming len bytes.
                    133:  * If all of the chain is consumed, return NULL.
                    134:  *
                    135:  * This should ALWAYS be called like this:
                    136:  *     bp = mbread(bp, ... );
                    137:  */
                    138: 
                    139: Mbuf
                    140: mbread(Mbuf bp, void *buf, int cnt)
                    141: {
                    142:     int nread;
                    143: 
                    144:     assert(cnt >= 0);
                    145: 
                    146:     if (!bp)
                    147:        return (NULL);
                    148:     if (cnt > bp->cnt)
                    149:        nread = bp->cnt;
                    150:     else
                    151:         nread = cnt;
                    152:     memcpy(buf, MBDATAU(bp), nread);
                    153:     bp->offset += nread;
                    154:     bp->cnt -= nread;
                    155:     if (bp->cnt == 0) {
                    156:        mbfree(bp);
                    157:        return (NULL);
                    158:     }
                    159:     return(bp);
                    160: }
                    161: 
                    162: /*
                    163:  * mbcopy()
                    164:  *
                    165:  * Copy contents of an mbuf chain into buffer, up to "cnt" bytes.
                    166:  * This does not consume any of the mbuf chain. Returns number copied.
                    167:  */
                    168: 
                    169: int
                    170: mbcopy(Mbuf bp, int offset, void *buf, int cnt)
                    171: {
                    172:     int nread;
                    173: 
                    174:     assert(offset >= 0);
                    175:     assert(cnt >= 0);
                    176: 
                    177:     if (!bp)
                    178:        return (0);
                    179:     if (offset >= bp->cnt)
                    180:        return (0);
                    181: 
                    182:     if (cnt > bp->cnt - offset)
                    183:        nread = bp->cnt - offset;
                    184:     else
                    185:         nread = cnt;
                    186:     memcpy(buf, MBDATAU(bp) + offset, nread);
                    187:     return (nread);
                    188: }
                    189: 
                    190: /*
                    191:  * mbcopyback()
                    192:  *
                    193:  * Write bytes from buffer into an mbuf chain. Returns first argument.
                    194:  */
                    195: 
                    196: Mbuf
                    197: mbcopyback(Mbuf bp, int offset, const void *buf, int cnt)
                    198: {
                    199:     int                b, e;
                    200: 
                    201:     if (!bp) {
                    202:        if (offset < 0)
                    203:            offset = 0;
                    204:        bp = mballoc(offset + cnt);
                    205:        memcpy(MBDATAU(bp) + offset, buf, cnt);
                    206:        bp->cnt = offset + cnt;
                    207:        return (bp);
                    208:     }
                    209: 
                    210:     b = (offset > 0) ? 0 : -offset;
                    211:     e = (offset + cnt > bp->cnt) ? offset + cnt - bp->cnt : 0;
                    212:     
                    213:     if (b + bp->cnt + e > bp->size) {
                    214:        Mbuf    nbp = mballoc(b + bp->cnt + e);
                    215:        memcpy(MBDATAU(nbp) + b, MBDATAU(bp), bp->cnt);
                    216:        nbp->cnt = bp->cnt;
                    217:        mbfree(bp);
                    218:        bp = nbp;
                    219:     } else if ((b > bp->offset) || (bp->offset + bp->cnt + e > bp->size)) {
                    220:        int     noff = (bp->size - (b + bp->cnt + e)) / 2;
                    221:        memmove(MBDATAU(bp) - bp->offset + noff + b, MBDATAU(bp), bp->cnt);
                    222:        bp->offset = noff;
                    223:     } else {
                    224:        bp->offset -= b;
                    225:     }
                    226:     bp->cnt = b + bp->cnt + e;
                    227:     memcpy(MBDATAU(bp) + offset + b, buf, cnt);
                    228:     return(bp);
                    229: }
                    230: 
                    231: /*
                    232:  * mbtrunc()
                    233:  *
                    234:  * Truncate mbuf to total of "max" bytes. If max is zero
                    235:  * then a zero length mbuf is returned (rather than a NULL mbuf).
                    236:  */
                    237: 
                    238: Mbuf
                    239: mbtrunc(Mbuf bp, int max)
                    240: {
                    241:     assert(max >= 0);
                    242: 
                    243:     if (!bp)
                    244:        return (NULL);
                    245: 
                    246:     if (bp->cnt > max)
                    247:        bp->cnt = max;
                    248: 
                    249:     return (bp);
                    250: }
                    251: 
                    252: /*
                    253:  * mbadj()
                    254:  *
                    255:  * Truncate mbuf cutting "cnt" bytes from begin or end.
                    256:  */
                    257: 
                    258: Mbuf
                    259: mbadj(Mbuf bp, int cnt)
                    260: {
                    261:     if (!bp)
                    262:        return (NULL);
                    263: 
                    264:     if (cnt >= 0) {
                    265:        if (bp->cnt > cnt) {
                    266:            bp->cnt -= cnt;
                    267:            bp->offset += cnt;
                    268:        } else {
                    269:            bp->cnt = 0;
                    270:        }
                    271:     } else {
                    272:        if (bp->cnt > -cnt) {
                    273:            bp->cnt -= -cnt;
                    274:        } else {
                    275:            bp->cnt = 0;
                    276:        }
                    277:     }
                    278: 
                    279:     return (bp);
                    280: }
                    281: 
                    282: /*
                    283:  * mbsplit()
                    284:  *
                    285:  * Break an mbuf chain after "cnt" bytes.
                    286:  * Return the newly created mbuf chain that
                    287:  * starts after "cnt" bytes. If MBLEN(bp) <= cnt,
                    288:  * then returns NULL.  The first part of
                    289:  * the chain remains pointed to by "bp".
                    290:  */
                    291: 
                    292: Mbuf
                    293: mbsplit(Mbuf bp, int cnt)
                    294: {
                    295:     Mbuf       nbp;
                    296:     
                    297:     assert(cnt >= 0);
                    298: 
                    299:     if (!bp)
                    300:        return (NULL);
                    301: 
                    302:     if (MBLEN(bp) <= cnt)
                    303:        return (NULL);
                    304: 
                    305:     nbp = mballoc(bp->cnt - cnt);
                    306:     memcpy(MBDATAU(nbp), MBDATAU(bp) + cnt, bp->cnt - cnt);
                    307:     nbp->cnt = bp->cnt - cnt;
                    308:     bp->cnt = cnt;
                    309: 
                    310:     return(nbp);
                    311: }
                    312: 
                    313: /*
                    314:  * MemStat()
                    315:  */
                    316: 
                    317: int
                    318: MemStat(Context ctx, int ac, char *av[], void *arg)
                    319: {
                    320:     struct typed_mem_stats stats;
                    321:     u_int      i;
                    322:     u_int      total_allocs = 0;
                    323:     u_int      total_bytes = 0;
                    324: 
                    325:     if (typed_mem_usage(&stats))
                    326:        Error("typed_mem_usage() error");
                    327:     
                    328:     /* Print header */
                    329:     Printf("   %-28s %10s %10s\r\n", "Type", "Count", "Total");
                    330:     Printf("   %-28s %10s %10s\r\n", "----", "-----", "-----");
                    331: 
                    332:     for (i = 0; i < stats.length; i++) {
                    333:        struct typed_mem_typestats *type = &stats.elems[i];
                    334: 
                    335:        Printf("   %-28s %10u %10lu\r\n",
                    336:            type->type, (int)type->allocs, (u_long)type->bytes);
                    337:        total_allocs += type->allocs;
                    338:        total_bytes += type->bytes;
                    339:     }
                    340:     /* Print totals */
                    341:     Printf("   %-28s %10s %10s\r\n", "", "-----", "-----");
                    342:     Printf("   %-28s %10lu %10lu\r\n",
                    343:         "Totals", total_allocs, total_bytes);
                    344: 
                    345:     structs_free(&typed_mem_stats_type, NULL, &stats);
                    346:     return(0);
                    347: }
                    348: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>