diff --git a/kernel/entry.asm b/kernel/entry.asm index d0950bf..ebceaad 100644 --- a/kernel/entry.asm +++ b/kernel/entry.asm @@ -42,6 +42,7 @@ segment HMA_TEXT extern _ErrorMode extern _InDOS extern _term_type + extern _abort_progress %IFDEF WIN31SUPPORT extern _winInstanced %ENDIF ; WIN31SUPPORT @@ -742,6 +743,9 @@ CritErrExit: ; Abort processing. ; CritErrAbort: + test byte [_abort_progress], -1 + mov al, FAIL + jnz CritErrExit %if 0 mov ax,[_cu_psp] mov es,ax diff --git a/kernel/globals.h b/kernel/globals.h index d2ee463..14d0b5c 100644 --- a/kernel/globals.h +++ b/kernel/globals.h @@ -308,6 +308,7 @@ extern BYTE ASM swap_always[], /* " " */ ASM swap_indos[], /* " " */ ASM term_type, /* 0 normal, 1 ^C, 2 int 24h, 3 TSR */ + ASM abort_progress, /* set during process termination */ ASM break_flg, /* true if break was detected */ ASM break_ena; /* break enabled flag */ extern void FAR * ASM dta; /* Disk transfer area (kludge) */ diff --git a/kernel/kernel.asm b/kernel/kernel.asm index 40e9258..1590b5c 100644 --- a/kernel/kernel.asm +++ b/kernel/kernel.asm @@ -796,6 +796,7 @@ _DayOfWeek db 2 ; 36 - day of week _console_swap db 0 ; 37 console swapped during read from dev global _dosidle_flag _dosidle_flag db 1 ; 38 - safe to call int28 if nonzero + global _abort_progress _abort_progress db 0 ; 39 - abort in progress global _CharReqHdr _CharReqHdr: diff --git a/kernel/task.c b/kernel/task.c index 6311b3a..1f31b92 100644 --- a/kernel/task.c +++ b/kernel/task.c @@ -588,6 +588,8 @@ VOID return_user(void) setvec(0x23, p->ps_isv23); setvec(0x24, p->ps_isv24); + abort_progress = -1; + /* And free all process memory if not a TSR return */ network_redirector(REM_PROCESS_END); /* might be a good idea to do that after closing @@ -607,6 +609,8 @@ VOID return_user(void) cu_psp = p->ps_parent; q = MK_FP(cu_psp, 0); + abort_progress = 0; + irp = (iregs FAR *) q->ps_stack; irp->CS = FP_SEG(p->ps_isv22);