X-Git-Url: https://deadsoftware.ru/gitweb?p=cpc.git;a=blobdiff_plain;f=src%2Fcpfront%2Fposix%2Fgeneric%2FSystem%2FMod%2FKernel.cp;h=622e0b10cc31ffb511333206090233333c0fd193;hp=a3f6d712bf86c35e95adf33de2d7de72e3e7957a;hb=e01013bb2dfa7aaab246a94bdde530fd91ea4a43;hpb=76d1e8d98f1d80d24fa52a15e6b2c6fb0a5f44d0 diff --git a/src/cpfront/posix/generic/System/Mod/Kernel.cp b/src/cpfront/posix/generic/System/Mod/Kernel.cp index a3f6d71..622e0b1 100644 --- a/src/cpfront/posix/generic/System/Mod/Kernel.cp +++ b/src/cpfront/posix/generic/System/Mod/Kernel.cp @@ -1,9 +1,9 @@ MODULE Kernel; - IMPORT S := SYSTEM, stdlib := C99stdlib, stdio := C99stdio, - time := C99time, wctype := C99wctype, sysmman := C99sys_mman, - dlfcn := C99dlfcn, fcntl := C99fcntl, types := C99types, - unistd := C99unistd, signal := C99signal, setjmp := C99setjmp; + IMPORT S := SYSTEM, stdlib := PosixCstdlib, stdio := PosixCstdio, + time := PosixCtime, wctype := PosixCwctype, sysmman := PosixCsys_mman, + dlfcn := PosixCdlfcn, fcntl := PosixCfcntl, types := PosixCtypes, + unistd := PosixCunistd, signal := PosixCsignal, setjmp := PosixCsetjmp; (* init fpu? *) (* add signal blocking to avoid race conditions in Try/Trap/TrapHandler *) @@ -238,7 +238,9 @@ MODULE Kernel; wouldFinalize: BOOLEAN; - watcher*: PROCEDURE (event: INTEGER); (* for debugging *) + watcher*: PROCEDURE (event: INTEGER); (* for debugging *) + + intTrap*: BOOLEAN; PROCEDURE Erase (adr, words: INTEGER); BEGIN @@ -460,12 +462,18 @@ MODULE Kernel; PROCEDURE AllocHeapMem (size: INTEGER; VAR c: Cluster); CONST N = 65536; (* cluster size for dll *) - VAR adr, allocated: INTEGER; + VAR adr, allocated, newsize: INTEGER; BEGIN INC(size, 16); ASSERT(size > 0, 100); adr := 0; - IF size < N THEN adr := stdlib.malloc(N) END; - IF adr = 0 THEN adr := stdlib.malloc(size); allocated := size ELSE allocated := N END; + IF size < N THEN + adr := AllocMem(N, newsize); + allocated := newsize + END; + IF adr = 0 THEN + adr := AllocMem(size, newsize); + allocated := newsize + END; IF adr = 0 THEN c := NIL ELSE c := S.VAL(Cluster, (adr + 15) DIV 16 * 16); c.max := adr; @@ -479,7 +487,7 @@ MODULE Kernel; PROCEDURE FreeHeapMem (c: Cluster); BEGIN DEC(used, c.size); DEC(total, c.size); - stdlib.free(S.VAL(ADDRESS, c.max)) + FreeMem(S.VAL(ADDRESS, c.max), c.size) END FreeHeapMem; PROCEDURE HeapFull (size: INTEGER): BOOLEAN; @@ -1553,7 +1561,7 @@ MODULE Kernel; SetDLink(tryDLink); setjmp._longjmp(tryEnv, 1) END; - IF err = 128 THEN (* do nothing *) + IF (err = 128) OR (err = 200) & ~intTrap THEN (* do nothing *) ELSIF (trapViewer # NIL) & (restart # NIL) & ~trapped & ~guarded THEN trapped := TRUE; trapViewer() ELSE DefaultTrapViewer @@ -1616,7 +1624,7 @@ MODULE Kernel; SetDLink(tryDLink); setjmp._longjmp(tryEnv, 1) END; - IF err = 128 THEN (* do nothing *) + IF (err = 128) OR (err = 200) & ~intTrap THEN (* do nothing *) ELSIF (trapViewer # NIL) & (restart # NIL) & ~trapped & ~guarded THEN trapped := TRUE; trapViewer() ELSE DefaultTrapViewer @@ -1656,6 +1664,7 @@ MODULE Kernel; PROCEDURE Init; VAR i: INTEGER; BEGIN + intTrap := TRUE; baseStack := S.ADR(i); (* XXX *) pagesize := unistd.sysconf(unistd._SC_PAGESIZE);