2500: # 2501: /* 2502: */ 2503: 2504: /* 2505: * Structure of the coremap and swapmap 2506: * arrays. Consists of non-zero count 2507: * and base address of that many 2508: * contiguous units. 2509: * (The coremap unit is 64 bytes, 2510: * the swapmap unit is 512 bytes) 2511: * The addresses are increasing and 2512: * the list is terminated with the 2513: * first zero count. 2514: */ 2515: struct map 2516: { 2517: char *m_size; 2518: char *m_addr; 2519: }; 2520: /* --------------------------- */ 2521: 2522: /* 2523: * Allocate size units from the given 2524: * map. Return the base of the allocated 2525: * space. 2526: * Algorithm is first fit. 2527: */ 2528: malloc(mp, size) 2529: struct map *mp; 2530: { 2531: register int a; 2532: register struct map *bp; 2533: 2534: for (bp = mp; bp->m_size; bp++) { 2535: if (bp->m_size >= size) { 2536: a = bp->m_addr; 2537: bp->m_addr =+ size; 2538: if ((bp->m_size =- size) == 0) 2539: do { 2540: bp++; 2541: (bp-1)->m_addr = bp->m_addr; 2542: } while ((bp-1)->m_size = bp->m_size); 2543: return(a); 2544: } 2545: } 2546: return(0); 2547: } 2548: /* --------------------------- */ 2549: 2550: /* 2551: * Free the previously allocated space aa 2552: * of size units into the specified map. 2553: * Sort aa into map and combine on 2554: * one or both ends if possible. 2555: */ 2556: mfree(mp, size, aa) 2557: struct map *mp; 2558: { 2559: register struct map *bp; 2560: register int t; 2561: register int a; 2562: 2563: a = aa; 2564: for (bp = mp; bp->m_addr<=a && bp->m_size!=0; bp++); 2565: if (bp>mp && (bp-1)->m_addr+(bp-1)->m_size == a) { 2566: (bp-1)->m_size =+ size; 2567: if (a+size == bp->m_addr) { 2568: (bp-1)->m_size =+ bp->m_size; 2569: while (bp->m_size) { 2570: bp++; 2571: (bp-1)->m_addr = bp->m_addr; 2572: (bp-1)->m_size = bp->m_size; 2573: } 2574: } 2575: } else { 2576: if (a+size == bp->m_addr && bp->m_size) { 2577: bp->m_addr =- size; 2578: bp->m_size =+ size; 2579: } else if (size) do { 2580: t = bp->m_addr; 2581: bp->m_addr = a; 2582: a = t; 2583: t = bp->m_size; 2584: bp->m_size = size; 2585: bp++; 2586: } while (size = t); 2587: } 2588: } 2589: /* --------------------------- */