|
|
1.1 ! root 1: /* ! 2: * static char ID_allocc[] = "@(#) allocate.c: 1.1 1/7/82"; ! 3: */ ! 4: ! 5: ITEMID allocate(request, spacenbr, partnbr) ! 6: int request, spacenbr, partnbr; ! 7: { ! 8: ! 9: register HEADER *gframe; ! 10: int framenbr; ! 11: long pagenbr; ! 12: long itemid; ! 13: long getnxtpage(); ! 14: ! 15: /* ! 16: * The request must be for an even number of bytes, and must hold an ! 17: * itemid. No request can exceed one page ! 18: */ ! 19: ! 20: request = (request < ITEMIDSIZE) ? (ITEMIDSIZE) : ((request+1) & (~1)); ! 21: ! 22: if( (request == 0) || (request > PAGESIZE) ) ! 23: return( (ITEMID) fatal("allocate request out of range") ); ! 24: ! 25: if( open_spacenumbers[spacenbr] != YES ) ! 26: return( (ITEMID) fatal("address space not yet opened") ); ! 27: ! 28: if( (partnbr < 0) || (partnbr > num_partitions) ) ! 29: return( (ITEMID) fatal("allocate partition out of range") ); ! 30: ! 31: ! 32: /* ! 33: * Satisfy the request. There are two cases: ! 34: * ! 35: * 1. Allocate a piece of the current page ! 36: * 2. Allocate an entirely new page ! 37: */ ! 38: ! 39: gframe = &global_frames[spacenbr]; ! 40: ! 41: #if DEBUG ! 42: if( dflag > 15 ) ! 43: fprintf( stderr, " alloc %04x %d %d ", ! 44: request, spacenbr, partnbr); ! 45: #endif ! 46: ! 47: if( gframe->curoffset + request <= PAGESIZE ) { ! 48: ! 49: itemid = BUILDPN(gframe->curpage, spacenbr) + gframe->curoffset; ! 50: gframe->curoffset += request; ! 51: ! 52: return( (ITEMID) itemid ); ! 53: ! 54: } ! 55: ! 56: if( (pagenbr = getnxtpage(spacenbr)) < 0 ) ! 57: return( (ITEMID) fatal("unable to allocate new page") ); ! 58: ! 59: itemid = BUILDPN(pagenbr, spacenbr); ! 60: ! 61: if( (framenbr = sojourn(itemid, partnbr, NO)) < 0 ) ! 62: return( (ITEMID) fatal("unable to find frame for new page") ); ! 63: ! 64: if( delist(framenbr) < 0 ) ! 65: return( (ITEMID) fatal("unable to delist frame of new page") ); ! 66: if( enlist(framenbr, MRU) < 0 ) ! 67: return( (ITEMID) fatal("unable to enlist frame of new page") ); ! 68: ! 69: gframe->curpage = pagenbr; ! 70: gframe->curoffset = request; ! 71: ! 72: return( (ITEMID) itemid ); ! 73: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.