Annotation of 43BSD/contrib/X/libvs100/vsalloc.c, revision 1.1.1.1

1.1       root        1: /* $Header: vsalloc.c,v 10.3 86/02/01 15:47:58 tony Rel $ */
                      2: /* vsalloc.c   routines to allocate and free vs framebuffer memory
                      3:  *
                      4:  *     VSMemInit       Initializes the free list
                      5:  *     VSAlloc         Allocates a chunk of memory
                      6:  *     VSFree          Frees a chunk of memory
                      7:  *
                      8:  *     The method used is a variant on the method described in Knuth
                      9:  * volume 1, page 441.  The modification is that since we can't directly
                     10:  * modify the memory in the vs, we maintain an ordered linked list of
                     11:  * extents with either free chain pointers or addresses of blocks
                     12:  *
                     13:  */
                     14: 
                     15: /****************************************************************************
                     16:  *                                                                         *
                     17:  *  Copyright (c) 1983, 1984 by                                                    *
                     18:  *  DIGITAL EQUIPMENT CORPORATION, Maynard, Massachusetts.                 *
                     19:  *  All rights reserved.                                                   *
                     20:  *                                                                         *
                     21:  *  This software is furnished on an as-is basis and may be used and copied *
                     22:  *  only with inclusion of the above copyright notice. This software or any *
                     23:  *  other copies thereof may be provided or otherwise made available to     *
                     24:  *  others only for non-commercial purposes.  No title to or ownership of   *
                     25:  *  the software is hereby transferred.                                            *
                     26:  *                                                                         *
                     27:  *  The information in this software is  subject to change without notice   *
                     28:  *  and  should  not  be  construed as  a commitment by DIGITAL EQUIPMENT   *
                     29:  *  CORPORATION.                                                           *
                     30:  *                                                                         *
                     31:  *  DIGITAL assumes no responsibility for the use  or  reliability of its   *
                     32:  *  software on equipment which is not supplied by DIGITAL.                *
                     33:  *                                                                         *
                     34:  *                                                                         *
                     35:  ****************************************************************************/
                     36: 
                     37: #include "vs100.h"
                     38: #include <errno.h>
                     39: 
                     40: extern int errno;
                     41: 
                     42: char *Xalloc();
                     43: 
                     44: #define slopsize 10    /* Amount we're willing to overallocate */
                     45: 
                     46: static VSArea listhead;
                     47: 
                     48: /* Initialize the memory structures.  Called by DownLoad, usually */
                     49: 
                     50: int VSMemInit()
                     51: {
                     52:        MemArea freefb, freepg;
                     53:        register VSArea *fb, *buf, *pg;
                     54:        VSArea *AllocVSArea();
                     55: 
                     56:        if (ReportStatus ((int *) NULL, (short *) NULL, (short *) NULL,
                     57:                          (BitMap *) NULL, &freefb, &freepg, (MemArea *) NULL,
                     58:                          0) == -1) return (-1);
                     59: 
                     60:        if ((fb = AllocVSArea()) == NULL) return (-1);
                     61:        if ((buf = AllocVSArea()) == NULL) return (-1);
                     62:        if ((pg = AllocVSArea()) == NULL) return (-1);
                     63: 
                     64:        /* Make the list of memory areas */
                     65: 
                     66:        listhead.next = buf->prev = fb;
                     67:        fb->next = pg->prev = buf;
                     68:        buf->next = listhead.prev = pg;
                     69:        pg->next = fb->prev = &listhead;
                     70: 
                     71:        /* Now set up the free list */
                     72: 
                     73:        listhead.vsFree.next = pg->vsFree.prev = fb;
                     74:        fb->vsFree.next = listhead.vsFree.prev = pg;
                     75:        pg->vsFree.next = fb->vsFree.prev = &listhead;
                     76: 
                     77:        /* Set up the sizes and addresses */
                     78: 
                     79:        listhead.vsPtr = NULL;
                     80:        listhead.vsFreeFlag = VS_INUSE;
                     81:        listhead.vsSize = 0;
                     82: 
                     83:        fb->vsPtr = *(caddr_t *) freefb.m_base;
                     84:        fb->vsFreeFlag = VS_FREE;
                     85:        fb->vsSize = *(long *) freefb.m_size;
                     86: 
                     87:        /* There's at least one version of the software that returns
                     88:           bogus information there, so... (ug) */
                     89: 
                     90:        if (fb->vsPtr == (caddr_t) 0x12ee00) {
                     91:            fb->vsPtr = (caddr_t) 0x117700;
                     92:            fb->vsSize = 35072;
                     93:        }
                     94: 
                     95:        /* Hack to deal with the crummy framebuffer bug:  can't use
                     96:           first 8 bytes */
                     97: 
                     98:        if (fb->vsPtr == (caddr_t) 0x117700) {
                     99:            fb->vsPtr += 8;
                    100:            fb->vsSize -= 8;
                    101:        }
                    102: 
                    103:        buf->vsPtr = 0;
                    104:        buf->vsFreeFlag = VS_INUSE;
                    105:        buf->vsSize = 0;
                    106: 
                    107:        pg->vsPtr = *(caddr_t *) freepg.m_base;
                    108:        pg->vsFreeFlag = VS_FREE;
                    109:        pg->vsSize = *(long *) freepg.m_size;
                    110: 
                    111:        return (0);
                    112: }
                    113: 
                    114: /* Allocate size bytes of specified type (bitmap, halftone, or font) */
                    115: 
                    116: VSArea *VSAlloc (size, type)
                    117:        int size, type;
                    118: {
                    119:        register VSArea *f = listhead.vsFree.next, *new;
                    120:        
                    121:        /* Make sure size is a multiple of 2 */
                    122: 
                    123:        if (size & 0x1) size++;
                    124: 
                    125:        while (f != &listhead && f->vsSize < size) f = f->vsFree.next;
                    126: 
                    127:        if (f == &listhead) {
                    128:            DeallocateSpace();
                    129:            errno = ENOMEM;
                    130:            return (NULL);      /* No space */
                    131:        }
                    132: 
                    133:        if (f->vsSize <= size + slopsize) {     /* Don't split block */
                    134:            f->vsFree.next->vsFree.prev = f->vsFree.prev;
                    135:            f->vsFree.prev->vsFree.next = f->vsFree.next;
                    136:            f->vsFreeFlag = VS_INUSE;
                    137:            f->vsType = type;
                    138:            return (f);
                    139: 
                    140:        } else {        /* Split into two smaller blocks */
                    141:            if ((new = AllocVSArea()) == NULL) return (NULL);
                    142:            new->prev = f->prev;
                    143:            new->next = f;
                    144:            f->prev->next = new;
                    145:            f->prev = new;
                    146:            new->vsSize = size;
                    147:            f->vsSize -= size;
                    148:            new->vsPtr = f->vsPtr;
                    149:            f->vsPtr += size;
                    150: 
                    151:            new->vsFreeFlag = VS_INUSE;
                    152:            new->vsType = type;
                    153: 
                    154:            return (new);
                    155:        }
                    156: }
                    157: 
                    158: /* Free the allocated storage */
                    159: 
                    160: int VSFree (block)
                    161:        register VSArea *block;
                    162: {
                    163:        register VSArea *temp;
                    164: 
                    165:        if (block->prev->vsFreeFlag == VS_FREE) { /* Coalesce areas */
                    166:            temp = block;
                    167:            block = block->prev;
                    168:            block->vsSize += temp->vsSize;
                    169:            block->next = temp->next;
                    170:            temp->next->prev = block;
                    171:            FreeVSArea (temp);
                    172:            block->vsFree.next->vsFree.prev = block->vsFree.prev;
                    173:            block->vsFree.prev->vsFree.next = block->vsFree.next;
                    174:        }
                    175: 
                    176:        if (block->next->vsFreeFlag == VS_FREE) { /* ditto */
                    177:            temp = block;
                    178:            block = block->next;
                    179:            block->vsPtr = temp->vsPtr;
                    180:            block->vsSize += temp->vsSize;
                    181:            block->prev = temp->prev;
                    182:            temp->prev->next = block;
                    183:            FreeVSArea (temp);
                    184:            block->vsFree.next->vsFree.prev = block->vsFree.prev;
                    185:            block->vsFree.prev->vsFree.next = block->vsFree.next;
                    186:        }
                    187: 
                    188:        /* Link the block into the free list */
                    189: 
                    190:        block->vsFreeFlag = VS_FREE;
                    191:        block->vsFree.next = listhead.vsFree.next;
                    192:        block->vsFree.prev = &listhead;
                    193:        listhead.vsFree.next->vsFree.prev = block;
                    194:        listhead.vsFree.next = block;
                    195: }
                    196: 
                    197: /* Boring routines to manage the allocation of the memory area descriptors
                    198:  * on the Vax.
                    199:  */
                    200: 
                    201: static VSArea *freeVSAreaHead = NULL;
                    202: #define alloc_at_once 10
                    203: 
                    204: VSArea *AllocVSArea()
                    205: {
                    206:        register VSArea *block;
                    207:        register int i;
                    208: 
                    209:        if ((block = freeVSAreaHead) == NULL) {
                    210:            block = (VSArea *) Xalloc (alloc_at_once * sizeof (VSArea));
                    211:            freeVSAreaHead = block;
                    212:            i = alloc_at_once;
                    213:            while (--i)
                    214:                block = block->next = block + 1;
                    215:            block->next = NULL;
                    216:            block = freeVSAreaHead;
                    217:        }
                    218:        freeVSAreaHead = block->next;
                    219: 
                    220:        return (block);
                    221: }
                    222: 
                    223: FreeVSArea(block)
                    224:        VSArea *block;
                    225: {
                    226:        block->next = freeVSAreaHead;
                    227:        freeVSAreaHead = block;
                    228: }

unix.superglobalmegacorp.com

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