115 lines
2.7 KiB
C
115 lines
2.7 KiB
C
|
|
/******************************************************************************
|
|
*******************************************************************************
|
|
|
|
W E G A - Quelle (C) ZFT/KEAW Abt. Basissoftware - 1988
|
|
KERN 3.2 Modul: malloc.c
|
|
|
|
Bearbeiter:
|
|
Datum: $D$
|
|
Version: $R$
|
|
|
|
*******************************************************************************
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
#include "sys/param.h"
|
|
#include "sys/sysinfo.h"
|
|
#include "sys/systm.h"
|
|
#include "sys/map.h"
|
|
|
|
|
|
/*--------------------------------------------- Funktionen ------------------*/
|
|
|
|
/*
|
|
* Die Module malloc und mfree dienen der Speicherverwaltung in den
|
|
* beiden Speichern coremap und swapmap
|
|
*/
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/*
|
|
* malloc
|
|
* Bereitstellung von freiem Speicher aus der core- bzw. swapmap
|
|
* Zuweisung von 'size' Einheiten
|
|
* Rueckgabe Basis des zugewiesenen Bereiches
|
|
* In der map werden die Adressen erhoeht, die Liste wird durch eine
|
|
* 0-Laenge beendet
|
|
* Coremap-Unit = 64 Byte; Swapmap-Unit = 512 Byte
|
|
* Algorithmus ist first-fit.
|
|
*/
|
|
/*---------------------------------------------------------------------------*/
|
|
malloc(mp, size)
|
|
struct map *mp;
|
|
{
|
|
register unsigned int a;
|
|
register struct map *bp;
|
|
|
|
for (bp=mp; bp->m_size; bp++) {
|
|
if (bp->m_size >= size) {
|
|
a = bp->m_addr;
|
|
bp->m_addr += size;
|
|
if ((bp->m_size -= size) == 0) {
|
|
do {
|
|
bp++;
|
|
(bp-1)->m_addr = bp->m_addr;
|
|
} while ((bp-1)->m_size = bp->m_size);
|
|
}
|
|
return(a);
|
|
}
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/*
|
|
* mfree
|
|
* Freigabe des vorher zugewiesenen Speichers a mit der Laenge von size
|
|
* Einheiten an die spezifizierte Map
|
|
* 'a' wird in die Map einsortiert und ein oder beide Enden kombiniert,
|
|
* wenn moeglich
|
|
*/
|
|
/*---------------------------------------------------------------------------*/
|
|
mfree(mp, size, a)
|
|
struct map *mp;
|
|
register int a;
|
|
{
|
|
register struct map *bp;
|
|
register unsigned int t;
|
|
|
|
if ((bp = mp)==coremap && runin) {
|
|
runin = 0;
|
|
wakeup((caddr_t)&runin);
|
|
}
|
|
for (; bp->m_addr<=a && bp->m_size!=0; bp++);
|
|
if (bp>mp && (bp-1)->m_addr+(bp-1)->m_size == a) {
|
|
(bp-1)->m_size += size;
|
|
if (a+size == bp->m_addr) {
|
|
(bp-1)->m_size += bp->m_size;
|
|
while (bp->m_size) {
|
|
bp++;
|
|
(bp-1)->m_addr = bp->m_addr;
|
|
(bp-1)->m_size = bp->m_size;
|
|
}
|
|
}
|
|
} else {
|
|
if (a+size == bp->m_addr && bp->m_size) {
|
|
bp->m_addr -= size;
|
|
bp->m_size += size;
|
|
} else if (size) {
|
|
do {
|
|
t = bp->m_addr;
|
|
bp->m_addr = a;
|
|
a = t;
|
|
t = bp->m_size;
|
|
bp->m_size = size;
|
|
bp++;
|
|
} while (size = t);
|
|
}
|
|
}
|
|
}
|