DosUmbLink no longer tries to merge free blocks. Also cleaned up a bit.

git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@968 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
Bart Oldeman 2004-05-28 19:08:48 +00:00
parent 3f72bd1865
commit 7a9c620d82
3 changed files with 23 additions and 34 deletions

View File

@ -1142,7 +1142,7 @@ dispatch:
case 0x03:
if (uppermem_root != 0xffff) /* always error if not exists */
{
DosUmbLink(lr.BL);
DosUmbLink(lr.BX);
break;
}
/* else fall through */

View File

@ -119,7 +119,7 @@ searchAgain:
/*
Hack to the Umb Region direct for now. Save time and program space.
*/
if (uppermem_link && uppermem_root != 0xffff)
if ((uppermem_link & 1) && uppermem_root != 0xffff)
{
COUNT tmpmode = (mode == LARGEST ? mem_access_mode : mode);
if ((mode != LARGEST || size == 0xffff) &&
@ -189,7 +189,7 @@ searchAgain:
if (!foundSeg || !foundSeg->m_size)
{ /* no block to fullfill the request */
if ((mode != LARGEST) && (mode & FIRST_FIT_U) &&
uppermem_link && uppermem_root != 0xffff)
(uppermem_link & 1) && uppermem_root != 0xffff)
{
mode &= ~FIRST_FIT_U;
goto searchAgain;
@ -401,7 +401,7 @@ COUNT DosMemCheck(void)
COUNT FreeProcessMem(UWORD ps)
{
mcb FAR *p;
BYTE oldumbstate = uppermem_link;
BYTE oldumbstate = uppermem_link & 1;
/* link in upper memory to free those , too */
DosUmbLink(1);
@ -455,7 +455,7 @@ VOID mcb_print(mcb FAR * mcbp)
}
#endif
VOID DosUmbLink(BYTE n)
void DosUmbLink(unsigned n)
{
REG mcb FAR *p;
REG mcb FAR *q;
@ -463,37 +463,26 @@ VOID DosUmbLink(BYTE n)
if (uppermem_root == 0xffff)
return;
q = p = para2far(first_mcb);
/* like a xor thing! */
if ((uppermem_link == 1) && (n == 0))
p = para2far(first_mcb);
if (n > 1 || (uppermem_link & 1) == n)
return;
while (FP_SEG(p) != uppermem_root && p->m_type != MCB_LAST)
{
while (FP_SEG(p) != uppermem_root)
{
if (mcbFree(p))
joinMCBs(FP_SEG(p));
if (!mcbValid(p))
return;
q = p;
p = nxtMCB(p);
}
if (q->m_type == MCB_NORMAL)
if (!mcbValid(p))
return;
q = p;
p = nxtMCB(p);
}
if (n == 0)
{
if (q->m_type == MCB_NORMAL && FP_SEG(p) == uppermem_root)
q->m_type = MCB_LAST;
uppermem_link = n;
}
else if ((uppermem_link == 0) && (n == 1))
{
while (q->m_type != MCB_LAST)
{
if (!mcbValid(q))
return;
q = nxtMCB(q);
}
q->m_type = MCB_NORMAL;
uppermem_link = n;
}
else if (p->m_type == MCB_LAST)
p->m_type = MCB_NORMAL;
else
return;
uppermem_link = n;
}
#endif

View File

@ -248,7 +248,7 @@ COUNT DosMemCheck(void);
COUNT FreeProcessMem(UWORD ps);
COUNT DosGetLargestBlock(UWORD * block);
VOID show_chain(void);
VOID DosUmbLink(BYTE n);
void DosUmbLink(unsigned n);
VOID mcb_print(mcb FAR * mcbp);
/* lfnapi.c */