Annotation of researchv8dc/sys/chaosld/challoc.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *             C H  A L L O C
                      3:  *
                      4:  * Memory allocation/deallocation routines for Chaosnet line discipline.
                      5:  *
                      6:  *
                      7:  * (c) Copyright 1984  Nirvonics, Inc.
                      8:  *
                      9:  * Written by Kurt Gollhardt
                     10:  * Last update Mon Nov 12 16:27:57 1984
                     11:  *
                     12:  * This software is the property of Nirvonics, Inc.
                     13:  * All rights reserved.
                     14:  *
                     15:  */
                     16: 
                     17: #include "ch.h"
                     18: #if NCH > 0
                     19: #include "../h/param.h"
                     20: #include "../h/stream.h"
                     21: #include "../h/conf.h"
                     22: #include "../h/buf.h"
                     23: #include "../chaosld/constants.h"
                     24: #include "../chaosld/types.h"
                     25: #include "../chaosld/globals.h"
                     26: 
                     27: #define CHBLKSIZE   BSIZE(0)
                     28: 
                     29: static caddr_t ch_alloc();
                     30: static ch_free();
                     31: 
                     32: 
                     33: static struct buf   *pkhead;
                     34: 
                     35: struct packet  *pkalloc()
                     36: {
                     37:      return (struct packet *)ch_alloc(sizeof(struct packet), &pkhead);
                     38: }
                     39: 
                     40: pkfree(pkt)
                     41:      struct packet  *pkt;
                     42: {
                     43:      ch_free((caddr_t)pkt, sizeof(struct packet), &pkhead);
                     44: }
                     45: 
                     46: 
                     47: static struct buf   *cnhead;
                     48: 
                     49: struct connection   *cnalloc()
                     50: {
                     51:      return (struct connection *)ch_alloc(sizeof(struct connection), &cnhead);
                     52: }
                     53: 
                     54: cnfree(conn)
                     55:      struct connection   *conn;
                     56: {
                     57:      ch_free((caddr_t)conn, sizeof(struct connection), &cnhead);
                     58: }
                     59: 
                     60: 
                     61: #define NOBUF   (struct buf *)0
                     62: #define ALIGN(n)    (((n) + sizeof(int) - 1) & ~(sizeof(int) - 1))
                     63: 
                     64: static caddr_t ch_alloc(size, head)
                     65:      struct buf     **head;
                     66: {
                     67:      register struct buf *bufp;
                     68:      register int        i;
                     69:      int       ps = spl6();
                     70: 
                     71:      debug(DALLOC,printf("ch_alloc: size=0x%lx ", size));
                     72: 
                     73:      for (bufp = *head; bufp != NOBUF;) {
                     74:           if (bufp->b_resid > 0)
                     75:               break;
                     76:           if ((bufp = bufp->av_forw) == *head)
                     77:               bufp = NOBUF;
                     78:      }
                     79:      debug(DALLOC,printf("bufp=0x%lx ", bufp));
                     80: 
                     81:      if (bufp == NOBUF) {
                     82:           if ((bufp = geteblk()) == NOBUF) {
                     83:               debug(DALLOC|DABNOR,printf("No more buffers available\n"));
                     84:               return NOBUF;
                     85:           }
                     86:           if (*head == NOBUF)
                     87:               *head = bufp->av_forw = bufp->av_back = bufp;
                     88:           else {
                     89:               bufp->av_forw = (*head)->av_forw;
                     90:               bufp->av_back = (*head)->av_back;
                     91:               bufp->av_forw->av_back = bufp->av_back->av_forw = bufp;
                     92:           }
                     93:          bufp->b_bcount = CHBLKSIZE / (size + 1);
                     94:          if (ALIGN(bufp->b_bcount) + size * bufp->b_bcount > CHBLKSIZE)
                     95:               bufp->b_bcount--;
                     96:          bfill(bufp->b_un.b_addr, bufp->b_resid = bufp->b_bcount, 0);
                     97:          debug(DALLOC,printf("new bufp=0x%lx bcount=%d ", bufp, bufp->b_bcount));
                     98:      }
                     99: 
                    100:      for (i = 0; i < bufp->b_bcount; ++i)
                    101:           if (bufp->b_un.b_addr[i] == 0)
                    102:               break;
                    103:      debug(DALLOC,printf("i = %d\n", i));
                    104: 
                    105:      bufp->b_un.b_addr[i] = 1;
                    106:      bufp->b_resid--;
                    107: 
                    108:      splx(ps);
                    109:      return bufp->b_un.b_addr + ALIGN(bufp->b_bcount) + i * size;
                    110: }
                    111: 
                    112: 
                    113: static ch_free(addr, size, head)
                    114:      caddr_t        addr;
                    115:      struct buf     **head;
                    116: {
                    117:      register struct buf *bufp;
                    118:      register int        i;
                    119:      int       ps = spl6();
                    120: 
                    121:      debug(DALLOC,printf("ch_free: addr=0x%lx size=0x%lx ", addr, size));
                    122: 
                    123:      for (bufp = *head; bufp != NOBUF;) {
                    124:           i = (addr - bufp->b_un.b_addr - ALIGN(bufp->b_bcount)) / size;
                    125:          if (i >= 0 && i < bufp->b_bcount)
                    126:               break;
                    127:           if ((bufp = bufp->av_forw) == *head)
                    128:               bufp = NOBUF;
                    129:      }
                    130:      debug(DALLOC,printf("bufp=0x%lx i=%d\n", bufp, i));
                    131: 
                    132:      if (bufp == NOBUF || bufp->b_un.b_addr[i] == 0) {
                    133:           splx(ps);
                    134:           printf("CHAOS: freeing un-allocated object %x (ch_free)\n", addr);
                    135:          return;
                    136:      }
                    137: 
                    138:      bufp->b_un.b_addr[i] = 0;
                    139:      if (++bufp->b_resid == bufp->b_bcount) {
                    140:           if (bufp->av_forw == bufp)
                    141:               *head = NOBUF;
                    142:           else {
                    143:                bufp->av_forw->av_back = bufp->av_back;
                    144:               bufp->av_back->av_forw = bufp->av_forw;
                    145:                if (*head == bufp)
                    146:                    *head = bufp->av_forw;
                    147:           }
                    148:          brelse(bufp);
                    149:           debug(DALLOC,printf("ch_free: released buf 0x%lx\n", bufp));
                    150:      }
                    151: 
                    152:      splx(ps);
                    153: }
                    154: 
                    155: #endif

unix.superglobalmegacorp.com

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