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: case 0x03:
if (uppermem_root != 0xffff) /* always error if not exists */ if (uppermem_root != 0xffff) /* always error if not exists */
{ {
DosUmbLink(lr.BL); DosUmbLink(lr.BX);
break; break;
} }
/* else fall through */ /* else fall through */

View File

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

View File

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