Only in Persistent_M3/pm3-1.1.15-unpacked/database: GRAS3
Only in Persistent_M3/pm3-1.1.15-unpacked/database: persistence
diff -r PolyMTL/pm3-1.1.15-unpacked/database/src/index.html Persistent_M3/pm3-1.1.15-unpacked/database/src/index.html
23a24,46
>
GRAS3
> GRAS is a set of libraries and programs that together implement
> a structure-oriented client/server database management system. In general,
> structure-oriented DBMS offer a richer set of data types and constructors
> than e.g. relational DBMS. The data model of GRAS is the directed,
> attributed, node and edge labelled graph. GRAS is not intended as a
> stand-alone system, but must be accessed via its application programming
> interface.
> Orthogonal Persistence
> Libraries and HREF="../persistence/libpm3common/src">interfaces to orthogonally
> persistent distributed storage for Modula-3 objects. Persistent storage is
> (by default) provided by the GRAS3 transactional page server. An
> experimental binding to the SHORE object store is also available on
> machines where SHORE is installed. Example applications include
> implementations of the OO7
> traversal operations and a HREF="../persistence/primes/src">prime number generator that starts
> generating prime numbers where it left off in its previous invocation.
> Orthogonally persistent applications run as clients of the GRAS3 page
> server (or SHORE server), which must be running before they can
> execute. See the information on getting started with GRAS3 in the GRAS3 REL = INCLUDE HREF="../GRAS3/README">README.
diff -r PolyMTL/pm3-1.1.15-unpacked/graphics/animation/anim3D/src/m3makefile Persistent_M3/pm3-1.1.15-unpacked/graphics/animation/anim3D/src/m3makefile
87c87
< Module ("PropList")
---
> List ("Prop", "Prop")
Only in PolyMTL/pm3-1.1.15-unpacked/graphics/animation/anim3D/src: PropList.i3
Only in PolyMTL/pm3-1.1.15-unpacked/graphics/animation/anim3D/src: PropList.m3
Only in PolyMTL/pm3-1.1.15-unpacked/graphics/animation/mentor/src/kpaths: AtomEdgeTbl.i3
Only in PolyMTL/pm3-1.1.15-unpacked/graphics/animation/mentor/src/kpaths: AtomEdgeTbl.m3
Only in PolyMTL/pm3-1.1.15-unpacked/graphics/animation/mentor/src/kpaths: AtomVertexTbl.i3
Only in PolyMTL/pm3-1.1.15-unpacked/graphics/animation/mentor/src/kpaths: AtomVertexTbl.m3
Only in PolyMTL/pm3-1.1.15-unpacked/graphics/animation/mentor/src/kpaths: EdgeSeq.i3
Only in PolyMTL/pm3-1.1.15-unpacked/graphics/animation/mentor/src/kpaths: EdgeSeq.m3
Only in PolyMTL/pm3-1.1.15-unpacked/graphics/animation/mentor/src/kpaths: EdgeSeqRep.i3
diff -r PolyMTL/pm3-1.1.15-unpacked/graphics/animation/mentor/src/kpaths/m3makefile Persistent_M3/pm3-1.1.15-unpacked/graphics/animation/mentor/src/kpaths/m3makefile
14,17c14,15
< interface("EdgeSeqRep")
< interface("VertexSeqRep")
< module("EdgeSeq")
< module("VertexSeq")
---
> sequence ("Edge", "Edge")
> sequence("Vertex", "Vertex")
19,20c17,18
< module("AtomEdgeTbl")
< module("AtomVertexTbl")
---
> table("AtomEdge", "Atom", "Edge")
> table("AtomVertex", "Atom", "Vertex")
Only in PolyMTL/pm3-1.1.15-unpacked/graphics/animation/mentor/src/kpaths: VertexSeq.i3
Only in PolyMTL/pm3-1.1.15-unpacked/graphics/animation/mentor/src/kpaths: VertexSeq.m3
Only in PolyMTL/pm3-1.1.15-unpacked/graphics/animation/mentor/src/kpaths: VertexSeqRep.i3
diff -r PolyMTL/pm3-1.1.15-unpacked/graphics/animation/mentor/src/minimax/m3makefile Persistent_M3/pm3-1.1.15-unpacked/graphics/animation/mentor/src/minimax/m3makefile
18c18
< module ("MoveList")
---
> list ("Move", "GameMove")
Only in PolyMTL/pm3-1.1.15-unpacked/graphics/animation/mentor/src/minimax: MoveList.i3
Only in PolyMTL/pm3-1.1.15-unpacked/graphics/animation/mentor/src/minimax: MoveList.m3
diff -r PolyMTL/pm3-1.1.15-unpacked/graphics/animation/mgkit/src/MGRd.m3 Persistent_M3/pm3-1.1.15-unpacked/graphics/animation/mgkit/src/MGRd.m3
69c69
< t.buff := NEW(REF ARRAY OF CHAR, 1);
---
> t.buff := NEW(<*TRANSIENT*> REF ARRAY OF CHAR, 1);
diff -r PolyMTL/pm3-1.1.15-unpacked/graphics/animation/rehearsecode/src/RehearseCode.m3 Persistent_M3/pm3-1.1.15-unpacked/graphics/animation/rehearsecode/src/RehearseCode.m3
53c53
< st := 0, buff := NEW (REF ARRAY OF CHAR, BufferSize),
---
> st := 0, buff := NEW (<*TRANSIENT*> REF ARRAY OF CHAR, BufferSize),
diff -r PolyMTL/pm3-1.1.15-unpacked/graphics/gr-libs/jvideo/src/POSIX/JVConverter.i3 Persistent_M3/pm3-1.1.15-unpacked/graphics/gr-libs/jvideo/src/POSIX/JVConverter.i3
17c17
< Private <: ROOT;
---
> Private <: <*TRANSIENT*> ROOT;
diff -r PolyMTL/pm3-1.1.15-unpacked/graphics/gr-libs/ui/src/picture/Picture.i3 Persistent_M3/pm3-1.1.15-unpacked/graphics/gr-libs/ui/src/picture/Picture.i3
22c22
< TYPE T <: ROOT;
---
> TYPE T <: <*TRANSIENT*> ROOT;
diff -r PolyMTL/pm3-1.1.15-unpacked/graphics/gr-libs/ui/src/vbt/Trestle.i3 Persistent_M3/pm3-1.1.15-unpacked/graphics/gr-libs/ui/src/vbt/Trestle.i3
21c21
< T <: ROOT;
---
> T <: <*TRANSIENT*> ROOT;
diff -r PolyMTL/pm3-1.1.15-unpacked/graphics/gr-libs/ui/src/vbt/VBT.i3 Persistent_M3/pm3-1.1.15-unpacked/graphics/gr-libs/ui/src/vbt/VBT.i3
51c51
< Prefix <: ROOT;
---
> Prefix <: <*TRANSIENT*> ROOT;
diff -r PolyMTL/pm3-1.1.15-unpacked/graphics/gr-libs/vbtkit/src/etext/TypescriptVBT.m3 Persistent_M3/pm3-1.1.15-unpacked/graphics/gr-libs/vbtkit/src/etext/TypescriptVBT.m3
111c111,112
< buff := NEW (REF ARRAY OF CHAR, TerminalReaderBuffSize),
---
> buff := NEW (<*TRANSIENT*> REF ARRAY OF CHAR,
> TerminalReaderBuffSize),
115c116,117
< st := 0, buff := NEW (REF ARRAY OF CHAR, TerminalWriterBuffSize),
---
> st := 0, buff := NEW (<*TRANSIENT*> REF ARRAY OF CHAR,
> TerminalWriterBuffSize),
diff -r PolyMTL/pm3-1.1.15-unpacked/graphics/gr-libs/vbtkit/src/lego/ChoiceVBT.i3 Persistent_M3/pm3-1.1.15-unpacked/graphics/gr-libs/vbtkit/src/lego/ChoiceVBT.i3
54c54
< TYPE Group <: ROOT;
---
> TYPE Group <: <*TRANSIENT*> ROOT;
diff -r PolyMTL/pm3-1.1.15-unpacked/graphics/gr-libs/vbtkit/src/mtext/MTextRd.m3 Persistent_M3/pm3-1.1.15-unpacked/graphics/gr-libs/vbtkit/src/mtext/MTextRd.m3
30c30
< chars : REF ARRAY OF CHAR := NIL
---
> chars : <*TRANSIENT*> REF ARRAY OF CHAR := NIL
67c67
< rd.chars := NEW (REF ARRAY OF CHAR, BufferSize)
---
> rd.chars := NEW (<*TRANSIENT*> REF ARRAY OF CHAR, BufferSize)
diff -r PolyMTL/pm3-1.1.15-unpacked/graphics/gr-libs/vbtkit/src/vbtkitutils/AutoRepeat.i3 Persistent_M3/pm3-1.1.15-unpacked/graphics/gr-libs/vbtkit/src/vbtkitutils/AutoRepeat.i3
55c55
< Private <: ROOT;
---
> Private <: <*TRANSIENT*> ROOT;
diff -r PolyMTL/pm3-1.1.15-unpacked/graphics/lecternpkg/lectern/src/Lectern.m3 Persistent_M3/pm3-1.1.15-unpacked/graphics/lecternpkg/lectern/src/Lectern.m3
30,31c30,31
< TempFiles, Text, TextPort, TextRd, TextSeq, TextWr, Thread,
< ThumbnailVBT, Time, Trestle, TrestleComm,
---
> TempFiles, Text, TextPort, TextRd, TextTransientSeq AS TextSeq,
> TextWr, Thread, ThumbnailVBT, Time, Trestle, TrestleComm,
diff -r PolyMTL/pm3-1.1.15-unpacked/graphics/lecternpkg/lectern/src/MyFileBrowserVBT.m3 Persistent_M3/pm3-1.1.15-unpacked/graphics/lecternpkg/lectern/src/MyFileBrowserVBT.m3
22,23c22,23
< TextList, TextListSort, TextPort, TextRd, TextSeq, TextVBT, Thread,
< Time, TypeinVBT, VBT, WeakRef;
---
> TextList, TextListSort, TextPort, TextRd, TextTransientSeq AS TextSeq,
> TextVBT, Thread, Time, TypeinVBT, VBT, WeakRef;
Only in Persistent_M3/pm3-1.1.15-unpacked/intro/src/questions: bookstore.html
diff -r PolyMTL/pm3-1.1.15-unpacked/language/m3quake/src/QMachine.m3 Persistent_M3/pm3-1.1.15-unpacked/language/m3quake/src/QMachine.m3
11c11
< IMPORT Wr, Thread, OSError, TextSeq, TextF, Pipe;
---
> IMPORT Wr, Thread, OSError, TextTransientSeq AS TextSeq, TextF, Pipe;
diff -r PolyMTL/pm3-1.1.15-unpacked/language/m3quake/src/QMachRep.i3 Persistent_M3/pm3-1.1.15-unpacked/language/m3quake/src/QMachRep.i3
3c3,4
< IMPORT QMachine, QCode, QValue, QVTbl, QVSeq, M3Buf, IntRefTbl, TextSeq;
---
> IMPORT QMachine, QCode, QValue, QVTbl, QVSeq, M3Buf, IntRefTbl,
> TextTransientSeq AS TextSeq;
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3bootstrap/src/m3makefile Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3bootstrap/src/m3makefile
274a275,276
> AS="/usr/ccs/bin/as"
> AR="/usr/ccs/bin/ld"
287c289
<
---
>
293c295
<
---
>
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3cc/gcc/config/m68k/mot3300-crt0.S Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3cc/gcc/config/m68k/mot3300-crt0.S
100c100
< STRING ("$Id: mot3300-crt0.S,v 1.1.1.1 1997/02/06 21:32:33 ldd Exp $\n")
---
> STRING ("$Id: mot3300-crt0.S,v 1.1.1.1 1998/10/28 21:28:02 hosking Exp $\n")
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3cc/gcc/config/m68k/mot3300Mcrt0.S Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3cc/gcc/config/m68k/mot3300Mcrt0.S
146c146
< STRING ("$Id: mot3300Mcrt0.S,v 1.1.1.1 1997/02/06 21:32:33 ldd Exp $\n")
---
> STRING ("$Id: mot3300Mcrt0.S,v 1.1.1.1 1998/10/28 21:28:03 hosking Exp $\n")
Only in Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3cc/gcc: cp
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3cc/gcc/function.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3cc/gcc/function.c
4224,4229d4223
<
< pad_to_arg_alignment (offset_ptr, boundary);
< if (where_pad == downward)
< pad_below (offset_ptr, passed_mode, sizetree);
< ADD_PARM_SIZE (*arg_size_ptr, sizetree);
< /**************** W.Kalsow 5/24/95 I'm confused... **************
4232d4225
<
4246,4247d4238
< *****************************************************************/
<
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3cc/gcc/gcc.1 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3cc/gcc/gcc.1
23c23
< .Id $Id: gcc.1,v 1.2 1997/02/07 20:01:12 ldd Exp $
---
> .Id $Id: gcc.1,v 1.1.1.1 1998/10/28 21:27:17 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3cc/gcc/genemit.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3cc/gcc/genemit.c
215d214
< printf (
216a216
> printf (
217a218
> INTVAL (x));
218a220
> printf (
220d221
< #endif
221a223
> #endif
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3cc/gcc/genrecog.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3cc/gcc/genrecog.c
1354d1353
< printf (
1355a1355
> printf (
1356a1357
> depth, p->elt_zero_wide + offset, offset ? "-1" : "");
1357a1359
> printf (
1359d1360
< #endif
1360a1362
> #endif
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3cc/gcc/just-fixinc Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3cc/gcc/just-fixinc
2c2
< # $Id: just-fixinc,v 1.2 1997/02/07 20:01:13 ldd Exp $
---
> # $Id: just-fixinc,v 1.1.1.1 1998/10/28 21:27:21 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3cc/gcc/Makefile.in Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3cc/gcc/Makefile.in
68,69c68,69
< BISON = `if [ -f $(objdir)/../byacc/byacc ] ; then echo $(objdir)/../byacc/byacc ; else echo byacc ; fi`
< BISONFLAGS =
---
> BISON = yacc
> BISONFLAGS =
Only in Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3cc/gcc: objc
Only in Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3cc/gcc: testsuite
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinOps/Adr.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinOps/Adr.m3
20c20
< t := RefType.New (Expr.TypeOf (ce.args[0]), FALSE, NIL);
---
> t := RefType.New (Expr.TypeOf (ce.args[0]), FALSE, FALSE, NIL);
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinOps/Dispose.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinOps/Dispose.m3
12c12,13
< IMPORT Addr, Reff, Module, Error, ObjectRef, ObjectAdr, Target;
---
> IMPORT Addr, Reff, ReffTransient, Module, Error, ObjectRef, ObjectTransient,
> ObjectAdr, Target;
25a27
> OR Type.IsEqual (t, ReffTransient.T, NIL)
27a30
> OR Type.IsEqual (t, ObjectTransient.T, NIL)
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinOps/New.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinOps/New.m3
160c160,161
< newType := ObjectType.New (t, info.isTraced, NIL, fields, overrides);
---
> newType := ObjectType.New (t, info.isTraced, info.isTransient, NIL,
> fields, overrides);
249,250c250,253
< CONST PHook = ARRAY BOOLEAN OF Runtime.Hook { Runtime.Hook.NewUntracedRef,
< Runtime.Hook.NewTracedRef };
---
> TYPE TT = ARRAY BOOLEAN OF Runtime.Hook;
> CONST PHook = ARRAY BOOLEAN OF TT
> { TT { Runtime.Hook.NewUntracedRef, Runtime.Hook.NewUntracedRef },
> TT { Runtime.Hook.NewTracedRef, Runtime.Hook.NewTransientRef } };
262c265
< GenOpenArray (t, t_info.isTraced, r_info, ce);
---
> GenOpenArray (t, t_info.isTraced, t_info.isTransient, r_info, ce);
265c268
< GenRecord (t, base, t_info.isTraced, r_info, ce);
---
> GenRecord (t, base, t_info.isTraced, t_info.isTransient, r_info, ce);
268c271
< proc := Runtime.LookUpProc (PHook [t_info.isTraced]);
---
> proc := Runtime.LookUpProc (PHook [t_info.isTraced, t_info.isTransient]);
277c280
< PROCEDURE GenOpenArray (t: Type.T; traced: BOOLEAN;
---
> PROCEDURE GenOpenArray (t: Type.T; traced, transient: BOOLEAN;
279,280c282,285
< CONST PHook = ARRAY BOOLEAN OF Runtime.Hook { Runtime.Hook.NewUntracedArray,
< Runtime.Hook.NewTracedArray };
---
> TYPE TT = ARRAY BOOLEAN OF Runtime.Hook;
> CONST PHook = ARRAY BOOLEAN OF TT
> { TT { Runtime.Hook.NewUntracedArray, Runtime.Hook.NewUntracedArray },
> TT { Runtime.Hook.NewTracedArray, Runtime.Hook.NewTransientArray } };
287c292
< proc := Runtime.LookUpProc (PHook [traced]);
---
> proc := Runtime.LookUpProc (PHook [traced, transient]);
325c330
< PROCEDURE GenRecord (t, r: Type.T; traced: BOOLEAN;
---
> PROCEDURE GenRecord (t, r: Type.T; traced, transient: BOOLEAN;
327,328c332,335
< CONST PHook = ARRAY BOOLEAN OF Runtime.Hook { Runtime.Hook.NewUntracedRef,
< Runtime.Hook.NewTracedRef };
---
> TYPE TT = ARRAY BOOLEAN OF Runtime.Hook;
> CONST PHook = ARRAY BOOLEAN OF TT
> { TT { Runtime.Hook.NewUntracedRef, Runtime.Hook.NewUntracedRef },
> TT { Runtime.Hook.NewTracedRef, Runtime.Hook.NewTransientRef } };
335c342
< proc := Runtime.LookUpProc (PHook [traced]);
---
> proc := Runtime.LookUpProc (PHook [traced, transient]);
359,360c366,369
< CONST PHook = ARRAY BOOLEAN OF Runtime.Hook { Runtime.Hook.NewUntracedObj,
< Runtime.Hook.NewTracedRef };
---
> TYPE TT = ARRAY BOOLEAN OF Runtime.Hook;
> CONST PHook = ARRAY BOOLEAN OF TT
> { TT { Runtime.Hook.NewUntracedObj, Runtime.Hook.NewUntracedObj },
> TT { Runtime.Hook.NewTracedRef, Runtime.Hook.NewTransientRef } };
374c383
< proc := Runtime.LookUpProc (PHook [info.isTraced]);
---
> proc := Runtime.LookUpProc (PHook [info.isTraced, info.isTransient]);
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinOps/Typecode.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinOps/Typecode.m3
12c12
< IMPORT Reff, TypeExpr, ObjectType, M3RT;
---
> IMPORT Reff, ReffTransient, TypeExpr, ObjectType, M3RT;
22a23,24
> Error.Msg ("TYPECODE: T must be a fixed reference type");
> ELSIF (Type.IsEqual (t, ReffTransient.T, NIL)) THEN
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/Addr.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/Addr.m3
15c15,16
< T := RefType.New (NIL, FALSE, TextExpr.New (M3String.Add ("$address$")));
---
> T := RefType.New (NIL, traced := FALSE, transient := TRUE,
> brand := TextExpr.New (M3String.Add ("$address$")));
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/BuiltinTypes.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/BuiltinTypes.m3
12c12,13
< IMPORT Null, Reff, Textt, Mutex, ErrType, ObjectRef, ObjectAdr;
---
> IMPORT Null, Reff, ReffTransient, Textt, Mutex, ErrType, ObjectRef, ObjectAdr,
> ObjectTransient;
29a31
> ReffTransient.Initialize ();
31a34
> ObjectTransient.Initialize ();
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/EReel.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/EReel.m3
36a37
> p.info.isTransient := TRUE;
58c59,60
< PROCEDURE GenMap (<*UNUSED*> p: P; offset, size: INTEGER; refs_only: BOOLEAN) =
---
> PROCEDURE GenMap (<*UNUSED*> p: P; offset, size: INTEGER; refs_only: BOOLEAN;
> <*UNUSED*> transient: BOOLEAN) =
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/ErrType.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/ErrType.m3
36a37
> p.info.isTransient := TRUE;
60c61
< <*UNUSED*> refs_only: BOOLEAN) =
---
> <*UNUSED*> refs_only, transient: BOOLEAN) =
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/Int.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/Int.m3
36a37
> p.info.isTransient := TRUE;
58c59,60
< PROCEDURE GenMap (<*UNUSED*> p: P; offset, size: INTEGER; refs_only: BOOLEAN) =
---
> PROCEDURE GenMap (<*UNUSED*> p: P; offset, size: INTEGER; refs_only: BOOLEAN;
> <*UNUSED*> transient: BOOLEAN) =
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/LReel.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/LReel.m3
36a37
> p.info.isTransient := TRUE;
58c59,60
< PROCEDURE GenMap (<*UNUSED*> p: P; offset, size: INTEGER; refs_only: BOOLEAN) =
---
> PROCEDURE GenMap (<*UNUSED*> p: P; offset, size: INTEGER; refs_only: BOOLEAN;
> <*UNUSED*> transient: BOOLEAN) =
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/m3makefile Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/m3makefile
21a22
> module ("ObjectTransient")
23a25
> module ("ReffTransient")
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/Mutex.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/Mutex.m3
11c11
< IMPORT ObjectRef, Tipe;
---
> IMPORT ObjectTransient, Tipe;
15c15
< T := Tipe.DefineOpaque ("MUTEX", ObjectRef.T);
---
> T := Tipe.DefineOpaque ("MUTEX", ObjectTransient.T);
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/Null.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/Null.m3
15c15,16
< T := RefType.New (NIL, FALSE, TextExpr.New (M3String.Add ("$null$")));
---
> T := RefType.New (NIL, traced := FALSE, transient := TRUE,
> brand := TextExpr.New (M3String.Add ("$null$")));
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/ObjectAdr.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/ObjectAdr.m3
19c19
< T := ObjectType.New (NIL, FALSE, NIL, s, s);
---
> T := ObjectType.New (NIL, FALSE, TRUE, NIL, s, s);
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/ObjectRef.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/ObjectRef.m3
19c19
< T := ObjectType.New (NIL, TRUE, NIL, s, s);
---
> T := ObjectType.New (NIL, TRUE, FALSE, NIL, s, s);
Only in Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes: ObjectTransient.i3
Only in Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes: ObjectTransient.m3
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/Reel.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/Reel.m3
36a37
> p.info.isTransient := TRUE;
58c59,60
< PROCEDURE GenMap (<*UNUSED*> p: P; offset, size: INTEGER; refs_only: BOOLEAN) =
---
> PROCEDURE GenMap (<*UNUSED*> p: P; offset, size: INTEGER; refs_only: BOOLEAN;
> <*UNUSED*> transient: BOOLEAN) =
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/Reff.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes/Reff.m3
15c15,16
< T := RefType.New (NIL, TRUE, TextExpr.New (M3String.Add ("$refany$")));
---
> T := RefType.New (NIL, traced := TRUE, transient := FALSE,
> brand := TextExpr.New (M3String.Add ("$refany$")));
Only in Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes: ReffTransient.i3
Only in Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/builtinTypes: ReffTransient.m3
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/exprs/ArrayExpr.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/exprs/ArrayExpr.m3
147c147
< elt_info: Type.Info;
---
> info, elt_info: Type.Info;
218c218,221
< p.solidType := ArrayType.New (index, solidElt);
---
> EVAL Type.CheckInfo (p.tipe, info);
> p.solidType :=
> ArrayType.New (info.isTransient AND NOT elt_info.isTransient,
> index, solidElt);
224c227,228
< p.refType := RefType.New (p.tipe, traced := TRUE, brand := NIL);
---
> p.refType := RefType.New (p.tipe, traced := TRUE, transient := TRUE,
> brand := NIL, warn := TRUE);
489c493
< proc := Runtime.LookUpProc (Runtime.Hook.NewTracedArray);
---
> proc := Runtime.LookUpProc (Runtime.Hook.NewTransientArray);
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/exprs/ExprParse.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/exprs/ExprParse.m3
197c197
< | TK.tBRANDED, TK.tLBRACE, TK.tUNTRACED, TK.tOBJECT,
---
> | TK.tBRANDED, TK.tLBRACE, TK.tUNTRACED, TK.tOBJECT, TK.tTRANSIENT,
260c260
< a := TypeExpr.New (ObjectType.Parse (t, TRUE, brand));
---
> a := TypeExpr.New (ObjectType.Parse (t, TRUE, FALSE, brand));
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/misc/CG.i3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/misc/CG.i3
107c107,108
< PROCEDURE Declare_pointer (t, target: TypeUID; brand: TEXT; traced: BOOLEAN);
---
> PROCEDURE Declare_pointer (t, target: TypeUID; brand: TEXT;
> traced, transient: BOOLEAN);
118,119c119,122
< PROCEDURE Declare_object (t, super: TypeUID; brand: TEXT; traced: BOOLEAN;
< n_fields, n_methods, n_overrides: INTEGER; field_size: Size);
---
> PROCEDURE Declare_object (t, super: TypeUID; brand: TEXT;
> traced, transient: BOOLEAN;
> n_fields, n_methods, n_overrides: INTEGER;
> field_size: Size);
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/misc/CG.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/misc/CG.m3
267c267,268
< PROCEDURE Declare_pointer (t, target: TypeUID; brand: TEXT; traced: BOOLEAN)=
---
> PROCEDURE Declare_pointer (t, target: TypeUID; brand: TEXT;
> traced, transient: BOOLEAN)=
270c271
< WebInfo.Declare_pointer (t, target, brand, traced);
---
> WebInfo.Declare_pointer (t, target, brand, traced, transient);
306,308c307,310
< PROCEDURE Declare_object (t, super: TypeUID; brand: TEXT; traced: BOOLEAN;
< n_fields, n_methods, n_overrides: INTEGER;
< field_size: Size) =
---
> PROCEDURE Declare_object (t, super: TypeUID; brand: TEXT;
> traced, transient: BOOLEAN;
> n_fields, n_methods, n_overrides: INTEGER;
> field_size: Size) =
312c314
< WebInfo.Declare_object (t, super, brand, traced,
---
> WebInfo.Declare_object (t, super, brand, traced, transient,
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/misc/Runtime.i3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/misc/Runtime.i3
20c20
< NewTracedRef, NewTracedArray,
---
> NewTracedRef, NewTransientRef, NewTracedArray, NewTransientArray,
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/misc/Runtime.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/misc/Runtime.m3
14c14
< ActualHook = [0..14];
---
> ActualHook = [0..16];
24a25
> "AllocateTransient",
25a27
> "AllocateTransientOpenArray",
36,37c38,39
< 11, 12, 13, 14, 14, 14, 14, 14, 14,
< 14, 14, 14 };
---
> 11, 12, 13, 14, 15, 16, 16, 16, 16,
> 16, 16, 16, 16, 16 };
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/misc/TipeMap.i3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/misc/TipeMap.i3
23c23,24
< (*50*) SkipB_1, SkipB_2, SkipB_3, SkipB_4, SkipB_5, SkipB_6, SkipB_7, SkipB_8
---
> (*50*) SkipB_1, SkipB_2, SkipB_3, SkipB_4, SkipB_5, SkipB_6, SkipB_7, SkipB_8,
> (*58*) TransientRef
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/misc/TipeMap.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/misc/TipeMap.m3
71c71,72
< 8 (* SkipB_8 *)
---
> 8, (* SkipB_8 *)
> 0 (* TransientRef *)
133c134,135
< -7 (* SkipB_8 *)
---
> -7, (* SkipB_8 *)
> -8 (* TransientRef *)
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/misc/Token.i3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/misc/Token.i3
30c30
< tINLINE, tEXTERNAL, tASSERT, tUNUSED, tOBSOLETE, tTRACE,
---
> tINLINE, tEXTERNAL, tASSERT, tUNUSED, tOBSOLETE, tTRACE, tTRANSIENT,
77c77
< T.tREF, T.tSET, T.tLBRACKET, T.tLPAREN};
---
> T.tREF, T.tSET, T.tTRANSIENT, T.tLBRACKET, T.tLPAREN};
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/misc/Token.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/misc/Token.m3
25c25
< "INLINE", "EXTERNAL", "ASSERT", "UNUSED", "OBSOLETE", "TRACE",
---
> "INLINE", "EXTERNAL", "ASSERT", "UNUSED", "OBSOLETE", "TRACE", "TRANSIENT",
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/misc/WebInfo.i3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/misc/WebInfo.i3
64c64,65
< PROCEDURE Declare_pointer (t, target: TypeUID; brand: TEXT; traced: BOOLEAN);
---
> PROCEDURE Declare_pointer (t, target: TypeUID; brand: TEXT;
> traced, transient: BOOLEAN);
73,74c74,77
< PROCEDURE Declare_object (t, super: TypeUID; brand: TEXT; traced: BOOLEAN;
< n_fields, n_methods, n_overrides: INTEGER; field_size: Size);
---
> PROCEDURE Declare_object (t, super: TypeUID; brand: TEXT;
> traced, transient: BOOLEAN;
> n_fields, n_methods, n_overrides: INTEGER;
> field_size: Size);
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/misc/WebInfo.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/misc/WebInfo.m3
140,141c140,144
< PROCEDURE Declare_pointer (t, target: TypeUID; brand: TEXT; traced: BOOLEAN) =
< CONST Tag = ARRAY BOOLEAN OF CHAR { 'O', 'P' };
---
> PROCEDURE Declare_pointer (t, target: TypeUID; brand: TEXT;
> traced, transient: BOOLEAN) =
> CONST Tag = ARRAY BOOLEAN, BOOLEAN OF CHAR
> { ARRAY BOOLEAN OF CHAR { 'O', 'O' },
> ARRAY BOOLEAN OF CHAR { 'P', 'p' } };
143c146
< OutX (t, Tag [traced]);
---
> OutX (t, Tag [traced, transient]);
184,186c187,193
< PROCEDURE Declare_object (t, super: TypeUID; brand: TEXT; traced: BOOLEAN;
< n_fields, n_methods, n_overrides: INTEGER; field_size: Size) =
< CONST Tag = ARRAY BOOLEAN OF CHAR { 'U', 'V' };
---
> PROCEDURE Declare_object (t, super: TypeUID; brand: TEXT;
> traced, transient: BOOLEAN;
> n_fields, n_methods, n_overrides: INTEGER;
> field_size: Size) =
> CONST Tag = ARRAY BOOLEAN, BOOLEAN OF CHAR
> { ARRAY BOOLEAN OF CHAR { 'U', 'U' },
> ARRAY BOOLEAN OF CHAR { 'V', 'v' } };
188c195
< OutX (t, Tag[traced]);
---
> OutX (t, Tag[traced, transient]);
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/ArrayType.i3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/ArrayType.i3
13c13
< PROCEDURE Parse (): Type.T;
---
> PROCEDURE Parse (transient: BOOLEAN): Type.T;
15c15
< PROCEDURE New (index, element: Type.T): Type.T;
---
> PROCEDURE New (transient: BOOLEAN; index, element: Type.T): Type.T;
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/ArrayType.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/ArrayType.m3
28a29
> transient : BOOLEAN;
42c43
< PROCEDURE Parse (): Type.T =
---
> PROCEDURE Parse (transient: BOOLEAN): Type.T =
48c49
< p0 := New (NIL, NIL); p := p0;
---
> p0 := New (transient, NIL, NIL); p := p0;
53c54
< p.element := New (NIL, NIL);
---
> p.element := New (FALSE, NIL, NIL);
62c63
< RETURN OpenArrayType.New (Type.Parse ());
---
> RETURN OpenArrayType.New (transient, Type.Parse ());
66c67
< PROCEDURE New (index, element: Type.T): Type.T =
---
> PROCEDURE New (transient: BOOLEAN; index, element: Type.T): Type.T =
79a81
> p.transient := transient;
126c128
< p.openCousin := OpenArrayType.New (p.element);
---
> p.openCousin := OpenArrayType.New (p.transient, p.element);
214a217,221
> IF p.transient AND elt_info.isTransient THEN
> Error.Warn (1, "array type already transient, <*TRANSIENT*> ignored");
> END;
> p.info.isTransient := p.transient OR elt_info.isTransient;
>
354c361
< PROCEDURE GenMap (p: P; offset, size: INTEGER; refs_only: BOOLEAN) =
---
> PROCEDURE GenMap (p: P; offset, size: INTEGER; refs_only, transient: BOOLEAN) =
359c366,367
< Type.GenMap (p.element, offset, p.elt_pack, refs_only);
---
> Type.GenMap (p.element, offset, p.elt_pack, refs_only,
> p.transient OR transient);
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/EnumType.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/EnumType.m3
138a139
> p.info.isTransient := TRUE;
209c210,211
< PROCEDURE GenMap (<*UNUSED*> p: P; offset, size: INTEGER; refs_only: BOOLEAN) =
---
> PROCEDURE GenMap (<*UNUSED*> p: P; offset, size: INTEGER; refs_only: BOOLEAN;
> <*UNUSED*> transient: BOOLEAN) =
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/NamedType.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/NamedType.m3
61c61
< t := ObjectType.Parse (t, FALSE, RefType.ParseBrand ());
---
> t := ObjectType.Parse (t, FALSE, FALSE, RefType.ParseBrand ());
63c63
< t := ObjectType.Parse (t, FALSE, NIL);
---
> t := ObjectType.Parse (t, FALSE, FALSE, NIL);
197c197
< PROCEDURE GenMap (p: P; offset, size: INTEGER; refs_only: BOOLEAN) =
---
> PROCEDURE GenMap (p: P; offset, size: INTEGER; refs_only, transient: BOOLEAN) =
200c200
< Type.GenMap (p.type, offset, size, refs_only);
---
> Type.GenMap (p.type, offset, size, refs_only, transient);
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/ObjectType.i3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/ObjectType.i3
14c14,15
< PROCEDURE Parse (super: Type.T; traced: BOOLEAN; brand: Expr.T): Type.T;
---
> PROCEDURE Parse (super: Type.T; traced, transient: BOOLEAN; brand: Expr.T):
> Type.T;
16c17
< PROCEDURE New (super: Type.T; traced: BOOLEAN; brand: Expr.T;
---
> PROCEDURE New (super: Type.T; traced, transient: BOOLEAN; brand: Expr.T;
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/ObjectType.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/ObjectType.m3
14,15c14,16
< IMPORT Field, Reff, Addr, RefType, Word, TextExpr, M3Buf, ErrType;
< IMPORT ObjectAdr, ObjectRef, Token, Module, Method;
---
> IMPORT Field, Reff, ReffTransient, Addr, RefType, Word, TextExpr, M3Buf,
> ErrType;
> IMPORT ObjectAdr, ObjectRef, ObjectTransient, Token, Module, Method;
39a41
> isTransient : BOOLEAN;
57a60
> TROOT_ID: INTEGER := 0;
59c62,63
< PROCEDURE Parse (sup: Type.T; traced: BOOLEAN; brand: Expr.T): Type.T =
---
> PROCEDURE Parse (sup: Type.T; traced, transient: BOOLEAN; brand: Expr.T):
> Type.T =
64c68
< p := New (sup, traced, brand, NIL, NIL);
---
> p := New (sup, traced, transient, brand, NIL, NIL);
89a94
> transient := FALSE;
146,147c151,152
< PROCEDURE New (super: Type.T; traced: BOOLEAN; brand: Expr.T;
< fields, methods: Scope.T): Type.T =
---
> PROCEDURE New (super: Type.T; traced, transient: BOOLEAN; brand: Expr.T;
> fields, methods: Scope.T): Type.T =
151,154c156,162
< IF (traced)
< THEN super := ObjectRef.T;
< ELSE super := ObjectAdr.T;
< END;
---
> IF traced THEN
> IF transient THEN
> super := ObjectTransient.T;
> ELSE
> super := ObjectRef.T;
> END;
> ELSE super := ObjectAdr.T; END;
158a167
> p.isTransient := transient;
354a364
> p.isTransient := super_info.isTransient;
365a376
> p.isTransient := super_info.isTransient;
409a421
> p.info.isTransient := p.isTransient;
442c454,458
< IF (NOT p.isTraced) AND Module.IsSafe() THEN CheckTracedFields (p) END;
---
> IF p.isTraced THEN
> IF p.isTransient THEN CheckNonTransientFields (p) END;
> ELSE
> IF Module.IsSafe() THEN CheckTracedFields (p) END;
> END;
462a479,496
> PROCEDURE CheckNonTransientFields (p: P) =
> VAR fields := Scope.ToList (p.fields); info: Type.Info; field: Field.Info;
> BEGIN
> WHILE (fields # NIL) DO
> EVAL Type.CheckInfo (Value.TypeOf (fields), info);
> Field.Split (fields, field);
> IF NOT info.isTransient AND NOT field.transient THEN
> VAR save := Scanner.offset;
> BEGIN
> Scanner.offset := fields.origin;
> Error.Warn (1, "transient object contains a non-transient field");
> Scanner.offset := save;
> END;
> END;
> fields := fields.next;
> END;
> END CheckNonTransientFields;
>
488,489c522,523
< brand, p.isTraced, nFields, nMethods, nOverrides,
< p.fieldSize);
---
> brand, p.isTraced, p.isTransient, nFields, nMethods,
> nOverrides, p.fieldSize);
586c620,624
< CG.Init_intt (offset + M3RT.TC_traced, isz, 1);
---
> IF p.isTransient THEN
> CG.Init_intt (offset + M3RT.TC_traced, isz, 3);
> ELSE
> CG.Init_intt (offset + M3RT.TC_traced, isz, 1);
> END;
631c669
< Type.GenMap (field.type, field.offset, -1, refs_only);
---
> Type.GenMap (field.type, field.offset, -1, refs_only, field.transient);
810a849
> OR (a.isTransient # b.isTransient)
838d876
< VAR root := Reff.T;
840,841c878,885
< IF (NOT a.isTraced) THEN root := Addr.T END;
< IF Type.IsEqual (t, root, NIL) THEN RETURN TRUE END;
---
> IF a.isTraced THEN
> IF a.isTransient THEN
> IF Type.IsEqual (t, ReffTransient.T, NIL) THEN RETURN TRUE END;
> END;
> IF Type.IsEqual (t, Reff.T, NIL) THEN RETURN TRUE END;
> ELSE
> IF Type.IsEqual (t, Addr.T, NIL) THEN RETURN TRUE END;
> END;
859a904,906
> ELSIF Type.IsEqual (p, ObjectTransient.T, NIL) THEN
> x.tag := "$objecttransient";
> x.n_nodes := 0;
862c909,913
< IF (NOT p.isTraced) THEN M3Buf.PutText (x.buf, "-UNTRACED") END;
---
> IF p.isTraced THEN
> IF p.isTransient THEN M3Buf.PutText (x.buf, "-TRANSIENT") END;
> ELSE
> M3Buf.PutText (x.buf, "-UNTRACED");
> END;
1005a1057
> TROOT_ID := Type.GlobalUID (ObjectTransient.T);
1008c1060
< IF (t_id = NIL_ID) OR (t_id = ROOT_ID) OR (t_id = UROOT_ID) THEN
---
> IF t_id = NIL_ID OR t_id = ROOT_ID OR t_id = UROOT_ID OR t_id = TROOT_ID THEN
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/OpaqueType.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/OpaqueType.m3
19a20
> isTransient: BOOLEAN;
81a83
> p.isTransient := info.isTransient;
96a99
> p.info.isTransient := info.isTransient;
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/OpenArrayType.i3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/OpenArrayType.i3
13c13
< PROCEDURE New (element: Type.T): Type.T;
---
> PROCEDURE New (transient: BOOLEAN; element: Type.T): Type.T;
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/OpenArrayType.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/OpenArrayType.m3
20a21
> transient : BOOLEAN;
34c35
< PROCEDURE New (element: Type.T): Type.T =
---
> PROCEDURE New (transient: BOOLEAN; element: Type.T): Type.T =
42a44
> p.transient := transient;
118a121,125
> IF p.transient AND elt_info.isTransient THEN
> Error.Warn (1, "array type already transient, <*TRANSIENT*> ignored");
> END;
> p.info.isTransient := p.transient OR elt_info.isTransient;
>
276c283
< refs_only: BOOLEAN) =
---
> refs_only, transient: BOOLEAN) =
281c288,289
< Type.GenMap (OpenType (p), a, p.elt_pack, refs_only);
---
> Type.GenMap (OpenType (p), a, p.elt_pack, refs_only,
> p.transient OR transient);
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/PackedType.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/PackedType.m3
118a119
> p.info.isTransient := info.isTransient;
169c170
< PROCEDURE GenMap (p: P; offset, size: INTEGER; refs_only: BOOLEAN) =
---
> PROCEDURE GenMap (p: P; offset, size: INTEGER; refs_only, transient: BOOLEAN) =
172c173
< Type.GenMap (p.baseType, offset, size, refs_only);
---
> Type.GenMap (p.baseType, offset, size, refs_only, transient);
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/ProcType.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/ProcType.m3
218a219
> p.info.isTransient := TRUE;
473c474,475
< PROCEDURE GenMap (<*UNUSED*> p: P; offset, size: INTEGER; refs_only: BOOLEAN) =
---
> PROCEDURE GenMap (<*UNUSED*> p: P; offset, size: INTEGER; refs_only: BOOLEAN;
> <*UNUSED*> transient: BOOLEAN) =
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/RecordType.i3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/RecordType.i3
13c13
< PROCEDURE Parse (): Type.T;
---
> PROCEDURE Parse (transient: BOOLEAN): Type.T;
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/RecordType.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/RecordType.m3
14a15
> IMPORT Scanner;
21a23
> transient : BOOLEAN;
35c37
< PROCEDURE Parse (): Type.T =
---
> PROCEDURE Parse (transient: BOOLEAN): Type.T =
44a47
> p.transient := transient;
57c60,66
< WHILE (cur.token = TK.tIDENT) DO
---
> LOOP
> info.transient := FALSE;
> IF cur.token = TK.tTRANSIENT THEN
> GetToken (); Match (TK.tENDPRAGMA); (* <*TRANSIENT*> *)
> info.transient := TRUE;
> END;
> IF cur.token # TK.tIDENT THEN EXIT; END;
77,80c86,94
< FOR i := 0 TO n - 1 DO
< info.name := Ident.stack [j + i];
< info.index := nFields; INC (nFields);
< Scope.Insert (Field.New (info));
---
> VAR save := Scanner.offset;
> BEGIN
> FOR i := 0 TO n - 1 DO
> info.name := Ident.stack [j + i];
> Scanner.offset := Ident.offset [j + i];
> info.index := nFields; INC (nFields);
> Scope.Insert (Field.New (info));
> END;
> Scanner.offset := save;
129a144
> p.info.isTransient := TRUE;
137a153,154
> p.info.isTransient :=
> p.info.isTransient AND (info.isTransient OR field.transient);
143a161,165
> IF p.transient AND p.info.isTransient THEN
> Error.Warn (1, "record type already transient, <*TRANSIENT*> ignored");
> END;
> p.info.isTransient := p.transient OR p.info.isTransient;
>
378c400
< refs_only: BOOLEAN) =
---
> refs_only, transient: BOOLEAN) =
383c405,406
< Type.GenMap (field.type, offset + field.offset, -1, refs_only);
---
> Type.GenMap (field.type, offset + field.offset, -1, refs_only,
> p.transient OR field.transient OR transient);
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/RefType.i3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/RefType.i3
16c16,17
< PROCEDURE New (target: Type.T; traced: BOOLEAN; brand: Expr.T): Type.T;
---
> PROCEDURE New (target: Type.T; traced, transient: BOOLEAN; brand: Expr.T;
> warn := TRUE): Type.T;
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/RefType.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/RefType.m3
12c12
< IMPORT Null, Reff, Addr, Error, Expr, Module, M3Buf, TextExpr;
---
> IMPORT Null, Reff, ReffTransient, Addr, Error, Expr, Module, M3Buf, TextExpr;
14c14,15
< IMPORT ProcType, ObjectAdr, Word, M3RT;
---
> IMPORT ProcType, ObjectAdr, ObjectTransient, Word, M3RT;
> IMPORT RecordType, ArrayType;
17c18
< P = Type.T BRANDED "RefType.T"OBJECT
---
> P = Type.T BRANDED "RefType.T" OBJECT
21a23
> isTransient: BOOLEAN;
22a25
> warn : BOOLEAN;
44c47
< VAR root : M3ID.T := M3ID.NoID;
---
> VAR root, refany: M3ID.T := M3ID.NoID;
56c59
< VAR brand: Expr.T; traced: BOOLEAN; super: Type.T;
---
> VAR brand: Expr.T; traced, transient: BOOLEAN; super: Type.T;
58a62
> transient := FALSE;
73a78,100
> transient := TRUE;
> ELSIF Scanner.cur.token = Token.T.tTRANSIENT THEN
> Scanner.GetToken(); Scanner.Match(Token.T.tENDPRAGMA);(* <*TRANSIENT*> *)
> IF Scanner.cur.token = Token.T.tIDENT THEN
> IF refany = M3ID.NoID THEN refany := M3ID.Add ("REFANY"); END;
> IF Scanner.cur.id = refany THEN
> Scanner.GetToken (); (* REFANY *)
> RETURN ReffTransient.T;
> END;
> IF root = M3ID.NoID THEN root := M3ID.Add ("ROOT"); END;
> IF Scanner.cur.id # root THEN
> Error.ID (Scanner.cur.id, "expected <*TRANSIENT*> ROOT/REFANY");
> END;
> Scanner.GetToken (); (* ROOT *)
> super := ObjectTransient.T;
> IF Scanner.cur.token # Token.T.tOBJECT
> AND Scanner.cur.token # Token.T.tBRANDED THEN RETURN super END;
> ELSIF Scanner.cur.token = Token.T.tRECORD THEN
> RETURN RecordType.Parse (transient := TRUE);
> ELSIF Scanner.cur.token = Token.T.tARRAY THEN
> RETURN ArrayType.Parse (transient := TRUE);
> END;
> transient := TRUE;
79c106,114
< RETURN New (Type.Parse (), traced, brand);
---
> VAR origin := Scanner.offset;
> t := Type.Parse();
> save := Scanner.offset;
> BEGIN
> Scanner.offset := origin;
> t := New (t, traced, transient, brand);
> Scanner.offset := save;
> RETURN t;
> END;
84c119,122
< RETURN ObjectType.Parse (super, traced, brand);
---
> IF super = NIL AND transient THEN
> Error.Msg ("expected <*TRANSIENT*> ROOT OBJECT");
> END;
> RETURN ObjectType.Parse (super, traced, transient, brand);
88c126,128
< PROCEDURE New (target: Type.T; traced: BOOLEAN; brand: Expr.T): Type.T =
---
> PROCEDURE New (target: Type.T; traced, transient: BOOLEAN; brand: Expr.T;
> warn := TRUE):
> Type.T =
93,97c133,139
< p.isTraced := traced;
< p.brandE := brand;
< p.brand := NIL;
< p.target := target;
< p.user_name := NIL;
---
> p.isTraced := traced;
> p.isTransient := transient;
> p.brandE := brand;
> p.brand := NIL;
> p.target := target;
> p.user_name := NIL;
> p.warn := warn;
227,236c269,279
< p.info.size := Target.Address.size;
< p.info.min_size := Target.Address.size;
< p.info.alignment := Target.Address.align;
< p.info.mem_type := CG.Type.Addr;
< p.info.stk_type := CG.Type.Addr;
< p.info.class := Type.Class.Ref;
< p.info.isTraced := p.isTraced;
< p.info.isEmpty := FALSE;
< p.info.isSolid := TRUE;
< p.info.hash := hash;
---
> p.info.size := Target.Address.size;
> p.info.min_size := Target.Address.size;
> p.info.alignment := Target.Address.align;
> p.info.mem_type := CG.Type.Addr;
> p.info.stk_type := CG.Type.Addr;
> p.info.class := Type.Class.Ref;
> p.info.isTraced := p.isTraced;
> p.info.isTransient := p.isTransient;
> p.info.isEmpty := FALSE;
> p.info.isSolid := TRUE;
> p.info.hash := hash;
245,246c288,296
< IF (NOT p.isTraced) AND (info.isTraced) AND Module.IsSafe() THEN
< Error.Msg ("unsafe: untraced ref type to a traced type");
---
> IF p.isTraced THEN
> IF p.warn
> AND p.isTransient AND info.isTraced AND NOT info.isTransient THEN
> Error.Warn (1, "transient ref type to a non-transient type");
> END;
> ELSE
> IF info.isTraced AND Module.IsSafe() THEN
> Error.Msg ("unsafe: untraced ref type to a traced type");
> END;
258c308
< brand, p.isTraced);
---
> brand, p.isTraced, p.isTransient);
323c373,377
< CG.Init_intt (offset + M3RT.TC_traced, isz, 1);
---
> IF p.isTransient THEN
> CG.Init_intt (offset + M3RT.TC_traced, isz, 3);
> ELSE
> CG.Init_intt (offset + M3RT.TC_traced, isz, 1);
> END;
354c408
< PROCEDURE GenTypeMap (p: P; refs_only: BOOLEAN): INTEGER =
---
> PROCEDURE GenTypeMap (p: P; refs_only: BOOLEAN): INTEGER =
358c412
< Type.GenMap (p.target, 0, -1, refs_only);
---
> Type.GenMap (p.target, 0, -1, refs_only, transient := FALSE);
408a463
> AND (a.isTransient = b.isTransient)
424a480,481
> OR ((a.isTraced) AND (a.isTransient)
> AND Type.IsEqual (b, ReffTransient.T, NIL))
435c492,493
< IF Type.IsEqual (p, Reff.T, NIL) THEN
---
> IF Type.IsEqual (p, Reff.T, NIL) OR
> Type.IsEqual (p, ReffTransient.T, NIL) THEN
450a509,511
> ELSIF Type.IsEqual (p, ReffTransient.T, NIL) THEN
> x.tag := "$refanytransient";
> x.n_nodes := 0;
459c520,524
< IF (NOT p.isTraced) THEN M3Buf.PutText (x.buf, "-UNTRACED") END;
---
> IF p.isTraced THEN
> IF p.isTransient THEN M3Buf.PutText (x.buf, "-TRANSIENT") END;
> ELSE
> M3Buf.PutText (x.buf, "-UNTRACED");
> END;
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/SetType.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/SetType.m3
72a73
> p.info.isTransient := TRUE;
114c115
< <*UNUSED*> refs_only: BOOLEAN) =
---
> <*UNUSED*> refs_only, transient: BOOLEAN) =
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/SubrangeType.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/SubrangeType.m3
161a162
> p.info.isTransient := TRUE;
299c300,301
< PROCEDURE GenMap (p: P; offset, size: INTEGER; refs_only: BOOLEAN) =
---
> PROCEDURE GenMap (p: P; offset, size: INTEGER; refs_only: BOOLEAN;
> <*UNUSED*> transient: BOOLEAN) =
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/Type.i3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/Type.i3
31,40c31,41
< size : INTEGER; (* size in bits, -1 if variable sized *)
< min_size : INTEGER; (* minimum size in bits. *)
< alignment : INTEGER; (* minimum alignment in bits *)
< hash : INTEGER; (* internal hash code *)
< stk_type : CG.Type; (* code generator representation on operator stack *)
< mem_type : CG.Type; (* code generator representation as a variable *)
< class : Class;
< isTraced : M3.Flag;
< isEmpty : M3.Flag;
< isSolid : M3.Flag;
---
> size : INTEGER; (* size in bits, -1 if variable sized *)
> min_size : INTEGER; (* minimum size in bits. *)
> alignment : INTEGER; (* minimum alignment in bits *)
> hash : INTEGER; (* internal hash code *)
> stk_type : CG.Type; (* code generator representation on operator stack *)
> mem_type : CG.Type; (* code generator representation as a variable *)
> class : Class;
> isTraced : M3.Flag;
> isTransient: M3.Flag;
> isEmpty : M3.Flag;
> isSolid : M3.Flag;
145c146
< PROCEDURE GenMap (t: T; offset, size: INTEGER; refs_only: BOOLEAN);
---
> PROCEDURE GenMap (t: T; offset, size: INTEGER; refs_only, transient: BOOLEAN);
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/Type.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/Type.m3
16a17
> IMPORT ObjectTransient, ReffTransient;
87c88
< | TK.tARRAY => t := ArrayType.Parse ();
---
> | TK.tARRAY => t := ArrayType.Parse (transient := FALSE);
92c93,94
< | TK.tOBJECT => t := ObjectType.Parse (NIL, TRUE, NIL);
---
> | TK.tTRANSIENT => t := RefType.Parse ();
> | TK.tOBJECT => t := ObjectType.Parse (NIL, TRUE, FALSE, NIL);
95c97
< | TK.tRECORD => t := RecordType.Parse ();
---
> | TK.tRECORD => t := RecordType.Parse (transient := FALSE);
104c106
< t := ObjectType.Parse (t, FALSE, RefType.ParseBrand ());
---
> t := ObjectType.Parse (t, FALSE, FALSE, RefType.ParseBrand ());
106c108
< t := ObjectType.Parse (t, FALSE, NIL);
---
> t := ObjectType.Parse (t, FALSE, FALSE, NIL);
593a596
> EVAL TypeTbl.Put (compiled, Check(ObjectTransient.T), ObjectTransient.T);
596a600
> EVAL TypeTbl.Put (compiled, Check(ReffTransient.T), ReffTransient.T);
662c666
< PROCEDURE GenMap (t: T; offset, size: INTEGER; refs_only: BOOLEAN) =
---
> PROCEDURE GenMap (t: T; offset, size: INTEGER; refs_only, transient: BOOLEAN) =
667c671
< u.mapper (offset, MIN (size, nat_sz), refs_only);
---
> u.mapper (offset, MIN (size, nat_sz), refs_only, transient);
829c833,834
< PROCEDURE GenRefMap (t: T; offset, size: INTEGER; refs_only: BOOLEAN) =
---
> PROCEDURE GenRefMap (t: T; offset, size: INTEGER;
> refs_only, transient: BOOLEAN) =
834c839,843
< TipeMap.Add (offset, TipeMap.Op.Ref, 0);
---
> IF u.info.isTransient OR transient THEN
> TipeMap.Add (offset, TipeMap.Op.TransientRef, 0);
> ELSE
> TipeMap.Add (offset, TipeMap.Op.Ref, 0);
> END;
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/TypeRep.i3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/types/TypeRep.i3
39c39
< mapper (offset, size: INTEGER; refs: BOOLEAN);
---
> mapper (offset, size: INTEGER; refs, transient: BOOLEAN);
56,57c56,58
< PROCEDURE GenRefMap (t: TT; offset, size: INTEGER; refs_only: BOOLEAN);
< (* == TypeMap.Add (offset, Op.{Untraced}Ref, 0) *)
---
> PROCEDURE GenRefMap (t: TT; offset, size: INTEGER;
> refs_only, transient: BOOLEAN);
> (* == TypeMap.Add (offset, Op.{Untraced|Transient}Ref, 0) *)
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/values/Exceptionz.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/values/Exceptionz.m3
160c160
< t.refTipe := RefType.New (t.tipe, TRUE, NIL);
---
> t.refTipe := RefType.New (t.tipe, TRUE, FALSE, NIL);
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/values/Field.i3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/values/Field.i3
18a19
> transient: BOOLEAN;
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/values/Field.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/values/Field.m3
19a20
> transient: BOOLEAN;
44a46
> t.transient := info.transient;
64a67
> info.transient := t.transient;
111a115,118
>
> IF t.transient AND info.isTransient THEN
> Error.Warn (1, "field type already transient, <*TRANSIENT*> ignored");
> END;
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/values/Formal.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/values/Formal.m3
189c189,190
< t.refType := RefType.New (t.tipe, traced := TRUE, brand := NIL);
---
> t.refType := RefType.New (t.tipe, traced := TRUE, transient := TRUE,
> brand := NIL, warn := TRUE);
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/values/Variable.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3front/src/values/Variable.m3
661c661
< proc := Runtime.LookUpProc (Runtime.Hook.NewTracedArray);
---
> proc := Runtime.LookUpProc (Runtime.Hook.NewTransientArray);
748c748,749
< Type.GenMap (t.tipe, 0, -1, refs_only := TRUE);
---
> Type.GenMap (t.tipe, 0, -1, refs_only := TRUE,
> transient := FALSE);
752c753,754
< Type.GenMap (t.tipe, t.offset, -1, refs_only := TRUE);
---
> Type.GenMap (t.tipe, t.offset, -1, refs_only := TRUE,
> transient := FALSE);
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3tests/src/p1/p108/Main.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3compiler/m3tests/src/p1/p108/Main.m3
32c32
< * $Header: /home/cvsroot/m3/pm3/language/modula3/m3compiler/m3tests/src/p1/p108/Main.m3,v 1.1.1.1 1997/01/16 21:31:15 ldd Exp $
---
> * $Header: /u/u84/hosking/CVS/pm3/language/modula3/m3compiler/m3tests/src/p1/p108/Main.m3,v 1.1.1.1 1998/10/28 21:33:44 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/gnuemacs/src/flex-bison/lex.yy.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/gnuemacs/src/flex-bison/lex.yy.c
4c4
< * $Header: /home/cvsroot/m3/pm3/language/modula3/m3tools/gnuemacs/src/flex-bison/lex.yy.c,v 1.2 1997/01/24 19:53:09 ldd Exp $
---
> * $Header: /u/u84/hosking/CVS/pm3/language/modula3/m3tools/gnuemacs/src/flex-bison/lex.yy.c,v 1.1.1.1 1998/10/28 21:34:29 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3browser/src/Main.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3browser/src/Main.m3
10c10
< (* in interfaces with their implmentations. - Mar 7, 1995 *)
---
> (* in interfaces with their implementations. - Mar 7, 1995 *)
119a120
> TREFANY_UID = 16_51e4b739;
121a123
> TROOT_UID = 16_a973d3a6;
642c644,649
< | 'U', 'V' =>
---
> | 'p' =>
> start := cur-1;
> uid := ReadUID (buf, cur);
> NoteType (s, uid, buf, start, cur_unit, c);
> NoteSubtype (s, uid, TREFANY_UID);
> | 'U', 'V', 'v' =>
852a860
> & "?51e4b739 TRANSIENT-REFANY\n"
857a866,867
> & "va973d3a6 00000000 0 0 0 4\n" (* <*TRANSIENT*> ROOT *)
> & "Ea973d3a6 TRANSIENT-ROOT\n"
871a882,883
> NoteSubtype (s, TREFANY_UID,REFANY_UID); (* TRANSIENT-REFANY <: REFANY *)
> NoteSubtype (s, TROOT_UID, TREFANY_UID); (* TRANSIENT-ROOT <: TRANSIENT-REFANY *)
2149c2161
< traced : BOOLEAN := FALSE;
---
> traced, transient: BOOLEAN := FALSE;
2211c2223
< IF (ch # 'U') AND (ch # 'V') THEN RETURN END;
---
> IF (ch # 'U') AND (ch # 'V') AND (ch # 'v') THEN RETURN END;
2212a2225
> IF (ch = 'v') THEN info.traced := TRUE; info.transient := TRUE END;
2283c2296,2297
< IF (NOT info.traced) THEN fmt.putText ("UNTRACED "); END;
---
> IF (NOT info.traced) THEN fmt.putText ("UNTRACED ROOT "); END;
> IF (info.transient) THEN fmt.putText ("<*TRANSIENT*> ROOT "); END;
2390c2404
< IF (t.class = 'V') OR (t.class = 'U') OR
---
> IF (t.class = 'V') OR (t.class = 'U') OR (t.class = 'v') OR
2560c2574
< | 'O', 'P' => (* untraced ref *)
---
> | 'O', 'P', 'p' => (* untraced/traced/transient ref *)
2566a2581,2582
> ELSIF (ch = 'p') THEN
> fmt.putText ("<*TRANSIENT*> ");
2639c2655
< | 'U', 'V' => (* untraced obj, obj *)
---
> | 'U', 'V', 'v' => (* untraced obj, obj, transient obj *)
2660c2676,2677
< IF (ch = 'U') THEN fmt.putText ("UNTRACED "); END;
---
> IF (ch = 'U') THEN fmt.putText ("UNTRACED ROOT "); END;
> IF (ch = 'v') THEN fmt.putText ("<*TRANSIENT*> ROOT "); END;
2815c2832,2833
< RETURN (t.class = 'P') OR (t.class = 'V')
---
> RETURN (t.class = 'P') OR (t.class = 'p')
> OR (t.class = 'V') OR (t.class = 'v')
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/bfd/doc/bfd.texinfo Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/bfd/doc/bfd.texinfo
3c3
< @c $Id: bfd.texinfo,v 1.3 1998/11/03 17:36:04 dagenais Exp $
---
> @c $Id: bfd.texinfo,v 1.1.1.2 1998/11/05 23:28:25 hosking Exp $
70c70
< \xdef\manvers{\$Revision: 1.3 $} % For use in headers, footers too
---
> \xdef\manvers{\$Revision: 1.1.1.2 $} % For use in headers, footers too
Only in Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/bfd: VERSION
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/configure Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/configure
86c86
< version="$Revision: 1.3 $"
---
> version="$Revision: 1.1.1.2 $"
Only in Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb: COPYING.NEWLIB
Only in Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb: .cvsignore
Only in Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb: CYGNUS
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/doc/gdbint.texinfo Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/doc/gdbint.texinfo
3c3
< @c $Id: gdbint.texinfo,v 1.3 1998/11/03 17:36:39 dagenais Exp $
---
> @c $Id: gdbint.texinfo,v 1.1.1.2 1998/11/05 23:31:08 hosking Exp $
45c45
< \xdef\manvers{\$Revision: 1.3 $} % For use in headers, footers too
---
> \xdef\manvers{\$Revision: 1.1.1.2 $} % For use in headers, footers too
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/doc/stabs.texinfo Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/doc/stabs.texinfo
46c46
< \xdef\manvers{\$Revision: 1.3 $} % For use in headers, footers too
---
> \xdef\manvers{\$Revision: 1.1.1.2 $} % For use in headers, footers too
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/eval.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/eval.c
1688a1689
> || TYPE_CODE (t) == TYPE_CODE_M3_TRANSIENT_REFANY
1690c1691,1692
< || TYPE_CODE (t) == TYPE_CODE_M3_ROOT) {
---
> || TYPE_CODE (t) == TYPE_CODE_M3_ROOT
> || TYPE_CODE (t) == TYPE_CODE_M3_TRANSIENT_ROOT) {
1762a1765
> || TYPE_CODE (arg1_type) == TYPE_CODE_M3_TRANSIENT_REFANY
1763a1767
> || TYPE_CODE (arg1_type) == TYPE_CODE_M3_TRANSIENT_ROOT
1791c1795,1796
< if (TYPE_CODE (arg1_type) == TYPE_CODE_M3_REFANY) {
---
> if (TYPE_CODE (arg1_type) == TYPE_CODE_M3_REFANY
> || TYPE_CODE (arg1_type) == TYPE_CODE_M3_TRANSIENT_REFANY) {
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/gdb.1 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/gdb.1
3c3
< .\" $Id: gdb.1,v 1.2 1997/02/27 15:58:48 ldd Exp $
---
> .\" $Id: gdb.1,v 1.1.1.1 1998/10/28 21:35:12 hosking Exp $
Only in Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb: .gdbinit
Only in Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb: gdbtk.c
Only in Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb: gdbtk.tcl
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/gdbtypes.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/gdbtypes.h
141a142
> TYPE_CODE_M3_TRANSIENT_REFANY,
142a144
> TYPE_CODE_M3_TRANSIENT_ROOT,
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/m3-lang.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/m3-lang.c
784a785
> struct type *builtin_type_m3_transient_root;
790a792
> struct type *builtin_type_m3_transient_refany;
835a838,842
> builtin_type_m3_transient_root =
> init_type (TYPE_CODE_M3_TRANSIENT_ROOT, TARGET_PTR_BIT / HOST_CHAR_BIT, 0,
> "TRANSIENT_ROOT", (struct objfile *) NULL);
> TYPE_M3_SIZE (builtin_type_m3_transient_root) = TARGET_PTR_BIT;
>
865a873,877
> builtin_type_m3_transient_refany =
> init_type (TYPE_CODE_M3_TRANSIENT_REFANY, TARGET_PTR_BIT / HOST_CHAR_BIT, 0,
> "TRANSIENT_REFANY", (struct objfile *) NULL);
> TYPE_M3_SIZE (builtin_type_m3_transient_refany) = TARGET_PTR_BIT;
>
1284a1297
> else if (uid_val == 0xa973d3a6) { return builtin_type_m3_transient_root; }
1290a1304
> else if (uid_val == 0x51e4b739) { return builtin_type_m3_transient_refany; }
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/m3-typeprint.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/m3-typeprint.c
198a199,200
> else if (sc == TYPE_CODE_M3_TRANSIENT_ROOT) {
> fprintf_filtered (stream, "TRANSIENT "); }
340a343,346
> case TYPE_CODE_M3_TRANSIENT_REFANY:
> fprintf_filtered (stream, "TRANSIENT REFANY");
> break;
>
350a357,360
> break;
>
> case TYPE_CODE_M3_TRANSIENT_ROOT:
> fprintf_filtered (stream, "TRANSIENT ROOT");
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/m3-valprint.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/m3-valprint.c
133a134
> || TYPE_CODE (this_obj) == TYPE_CODE_M3_TRANSIENT_ROOT
534a536
> case TYPE_CODE_M3_TRANSIENT_ROOT:
544c546,547
< case TYPE_CODE_M3_REFANY: {
---
> case TYPE_CODE_M3_REFANY:
> case TYPE_CODE_M3_TRANSIENT_REFANY: {
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/adperr.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/adperr.h
12c12
< * $Date: 1998/10/20 17:25:36 $
---
> * $Date: 1998/11/05 23:33:57 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/adp.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/adp.h
12c12
< * $Date: 1998/10/20 17:25:35 $
---
> * $Date: 1998/11/05 23:33:57 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/angel.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/angel.h
17c17
< * $Date: 1998/10/20 17:25:36 $
---
> * $Date: 1998/11/05 23:33:57 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/ardi.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/ardi.c
15c15
< * $Date: 1998/10/20 17:25:36 $
---
> * $Date: 1998/11/05 23:33:57 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/ardi.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/ardi.h
14c14
< * $Date: 1998/10/20 17:25:36 $
---
> * $Date: 1998/11/05 23:33:57 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/armdbg.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/armdbg.h
15c15
< * Checkin $Date: 1998/10/20 17:25:36 $
---
> * Checkin $Date: 1998/11/05 23:33:57 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/buffers.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/buffers.h
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:57 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/bytesex.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/bytesex.c
16c16
< * Checkin $Date: 1998/10/20 17:25:37 $
---
> * Checkin $Date: 1998/11/05 23:33:57 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/bytesex.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/bytesex.h
15c15
< * Checkin $Date: 1998/10/20 17:25:37 $
---
> * Checkin $Date: 1998/11/05 23:33:57 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/chandefs.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/chandefs.h
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:57 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/channels.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/channels.h
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:57 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/chanpriv.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/chanpriv.h
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:57 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/crc.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/crc.c
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:57 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/crc.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/crc.h
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:57 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/dbg_conf.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/dbg_conf.h
15c15
< * Checkin $Date: 1998/10/20 17:25:37 $
---
> * Checkin $Date: 1998/11/05 23:33:57 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/dbg_cp.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/dbg_cp.h
15c15
< * Checkin $Date: 1998/10/20 17:25:37 $
---
> * Checkin $Date: 1998/11/05 23:33:58 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/dbg_hif.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/dbg_hif.h
19c19
< * Checkin $Date: 1998/10/20 17:25:37 $
---
> * Checkin $Date: 1998/11/05 23:33:58 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/dbg_rdi.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/dbg_rdi.h
15c15
< * Checkin $Date: 1998/10/20 17:25:37 $
---
> * Checkin $Date: 1998/11/05 23:33:58 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/devclnt.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/devclnt.h
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:58 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/devices.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/devices.h
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:58 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/devsw.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/devsw.c
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:58 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/devsw.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/devsw.h
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:58 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/drivers.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/drivers.c
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:58 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/drivers.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/drivers.h
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:58 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/endian.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/endian.h
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:58 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/etherdrv.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/etherdrv.c
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:58 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/ethernet.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/ethernet.h
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:58 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/hostchan.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/hostchan.c
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:58 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/hostchan.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/hostchan.h
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:58 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/hsys.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/hsys.c
13c13
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:58 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/hsys.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/hsys.h
13c13
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:58 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/logging.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/logging.c
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:58 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/logging.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/logging.h
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:59 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/msgbuild.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/msgbuild.c
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:59 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/msgbuild.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/msgbuild.h
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:59 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/params.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/params.c
12c12
< * $Date: 1998/10/20 17:25:37 $
---
> * $Date: 1998/11/05 23:33:59 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/params.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/params.h
12c12
< * $Date: 1998/10/20 17:25:38 $
---
> * $Date: 1998/11/05 23:33:59 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/rx.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/rx.c
12c12
< * $Date: 1998/10/20 17:25:38 $
---
> * $Date: 1998/11/05 23:33:59 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/rxtx.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/rxtx.h
12c12
< * $Date: 1998/10/20 17:25:38 $
---
> * $Date: 1998/11/05 23:33:59 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/serdrv.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/serdrv.c
12c12
< * $Date: 1998/10/20 17:25:38 $
---
> * $Date: 1998/11/05 23:33:59 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/serpardr.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/serpardr.c
12c12
< * $Date: 1998/10/20 17:25:38 $
---
> * $Date: 1998/11/05 23:33:59 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/sys.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/sys.h
14c14
< * $Date: 1998/10/20 17:25:38 $
---
> * $Date: 1998/11/05 23:33:59 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/tx.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/tx.c
12c12
< * $Date: 1998/10/20 17:25:38 $
---
> * $Date: 1998/11/05 23:33:59 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/unixcomm.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/unixcomm.c
12c12
< * $Date: 1998/10/20 17:25:38 $
---
> * $Date: 1998/11/05 23:33:59 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/unixcomm.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/rdi-share/unixcomm.h
12c12
< * $Date: 1998/10/20 17:25:38 $
---
> * $Date: 1998/11/05 23:33:59 $
Only in Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb: README.GDBTK
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/sol-thread.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/sol-thread.c
965c965
< ps_pstop (const struct ps_prochandle *ph)
---
> ps_pstop (struct ps_prochandle *ph)
971c971
< ps_pcontinue (const struct ps_prochandle *ph)
---
> ps_pcontinue (struct ps_prochandle *ph)
977c977
< ps_lstop (const struct ps_prochandle *ph, lwpid_t lwpid)
---
> ps_lstop (struct ps_prochandle *ph, lwpid_t lwpid)
983c983
< ps_lcontinue (const struct ps_prochandle *ph, lwpid_t lwpid)
---
> ps_lcontinue (struct ps_prochandle *ph, lwpid_t lwpid)
989c989
< ps_pglobal_lookup (const struct ps_prochandle *ph, const char *ld_object_name,
---
> ps_pglobal_lookup (struct ps_prochandle *ph, const char *ld_object_name,
1049c1049
< ps_pdread (const struct ps_prochandle *ph, paddr_t addr, char *buf, int size)
---
> ps_pdread (struct ps_prochandle *ph, paddr_t addr, void *buf, size_t size)
1055c1055
< ps_pdwrite (const struct ps_prochandle *ph, paddr_t addr, char *buf, int size)
---
> ps_pdwrite (struct ps_prochandle *ph, paddr_t addr, const void *buf, size_t size)
1061c1061
< ps_ptread (const struct ps_prochandle *ph, paddr_t addr, char *buf, int size)
---
> ps_ptread (struct ps_prochandle *ph, paddr_t addr, void *buf, size_t size)
1067c1067
< ps_ptwrite (const struct ps_prochandle *ph, paddr_t addr, char *buf, int size)
---
> ps_ptwrite (struct ps_prochandle *ph, paddr_t addr, const void *buf, size_t size)
1075c1075
< ps_lgetregs (const struct ps_prochandle *ph, lwpid_t lwpid,
---
> ps_lgetregs (struct ps_prochandle *ph, lwpid_t lwpid,
1098c1098
< ps_lsetregs (const struct ps_prochandle *ph, lwpid_t lwpid,
---
> ps_lsetregs (struct ps_prochandle *ph, lwpid_t lwpid,
1131c1131
< ps_lgetxregsize (const struct ps_prochandle *ph, lwpid_t lwpid, int *xregsize)
---
> ps_lgetxregsize (struct ps_prochandle *ph, lwpid_t lwpid, int *xregsize)
1159c1159
< ps_lgetxregs (const struct ps_prochandle *ph, lwpid_t lwpid, caddr_t xregset)
---
> ps_lgetxregs (struct ps_prochandle *ph, lwpid_t lwpid, caddr_t xregset)
1182c1182
< ps_lsetxregs (const struct ps_prochandle *ph, lwpid_t lwpid, caddr_t xregset)
---
> ps_lsetxregs (struct ps_prochandle *ph, lwpid_t lwpid, caddr_t xregset)
1205c1205
< ps_lgetfpregs (const struct ps_prochandle *ph, lwpid_t lwpid,
---
> ps_lgetfpregs (struct ps_prochandle *ph, lwpid_t lwpid,
1228c1228
< ps_lsetfpregs (const struct ps_prochandle *ph, lwpid_t lwpid,
---
> ps_lsetfpregs (struct ps_prochandle *ph, lwpid_t lwpid,
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/values.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/gdb/values.c
1285a1286
> case TYPE_CODE_M3_TRANSIENT_REFANY:
1288a1290
> case TYPE_CODE_M3_TRANSIENT_ROOT:
1338a1341
> case TYPE_CODE_M3_TRANSIENT_REFANY:
1341a1345
> case TYPE_CODE_M3_TRANSIENT_ROOT:
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/mmalloc/mmalloc.texi Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/mmalloc/mmalloc.texi
50c50
< \xdef\manvers{\$Revision: 1.2 $} % For use in headers, footers too
---
> \xdef\manvers{\$Revision: 1.1.1.1 $} % For use in headers, footers too
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/sim/mips/gencode.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/sim/mips/gencode.c
16,18c16,18
< $Revision: 1.3 $
< $Author: dagenais $
< $Date: 1998/11/03 17:36:55 $
---
> $Revision: 1.1.1.2 $
> $Author: hosking $
> $Date: 1998/11/05 23:37:17 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/sim/mips/interp.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/sim/mips/interp.c
16,18c16,18
< $Revision: 1.3 $
< $Author: dagenais $
< $Date: 1998/11/03 17:36:56 $
---
> $Revision: 1.1.1.2 $
> $Author: hosking $
> $Date: 1998/11/05 23:37:18 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/sim/mips/support.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/sim/mips/support.h
16,18c16,18
< $Revision: 1.2 $
< $Author: ldd $
< $Date: 1997/02/27 15:59:09 $
---
> $Revision: 1.1.1.1 $
> $Author: hosking $
> $Date: 1998/10/28 21:37:07 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/texinfo/cygnus/texinfo.tex Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/texinfo/cygnus/texinfo.tex
1c1
< %$Id: texinfo.tex,v 1.2 1997/02/27 15:59:10 ldd Exp $
---
> %$Id: texinfo.tex,v 1.1.1.1 1998/10/28 21:37:26 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/texinfo/cygnus/texiplus.tex Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/texinfo/cygnus/texiplus.tex
5c5
< %%$Id: texiplus.tex,v 1.2 1997/02/27 15:59:10 ldd Exp $
---
> %%$Id: texiplus.tex,v 1.1.1.1 1998/10/28 21:37:26 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/texinfo/texinfo.tex Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/texinfo/texinfo.tex
2c2
< %% $Id: texinfo.tex,v 1.3 1998/11/03 17:36:59 dagenais Exp $
---
> %% $Id: texinfo.tex,v 1.1.1.2 1998/11/05 23:38:16 hosking Exp $
39c39
< \deftexinfoversion$Revision: 1.3 $
---
> \deftexinfoversion$Revision: 1.1.1.2 $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/texinfo/util/texi2dvi Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/texinfo/util/texi2dvi
6c6
< # $Id: texi2dvi,v 1.2 1997/02/27 15:59:12 ldd Exp $
---
> # $Id: texi2dvi,v 1.1.1.1 1998/10/28 21:37:31 hosking Exp $
50c50
< rcs_revision='$Revision: 1.2 $'
---
> rcs_revision='$Revision: 1.1.1.1 $'
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/mondfe/Makefile.in Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/mondfe/Makefile.in
19c19
< # $Id: Makefile.in,v 1.2 1997/02/27 15:59:13 ldd Exp $
---
> # $Id: Makefile.in,v 1.1.1.1 1998/10/28 21:37:36 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/montip/Makefile.in Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/montip/Makefile.in
19c19
< # $Id: Makefile.in,v 1.2 1997/02/27 15:59:13 ldd Exp $
---
> # $Id: Makefile.in,v 1.1.1.1 1998/10/28 21:37:37 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/dos2udip.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/dos2udip.c
25c25
< * $Id: dos2udip.c,v 1.2 1997/02/27 15:59:14 ldd Exp $
---
> * $Id: dos2udip.c,v 1.1.1.1 1998/10/28 21:37:34 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/dos386c.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/dos386c.c
23c23
< * $Id: dos386c.c,v 1.2 1997/02/27 15:59:14 ldd Exp $
---
> * $Id: dos386c.c,v 1.1.1.1 1998/10/28 21:37:34 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/dos386c.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/dos386c.h
23c23
< * $Id: dos386c.h,v 1.2 1997/02/27 15:59:14 ldd Exp $
---
> * $Id: dos386c.h,v 1.1.1.1 1998/10/28 21:37:34 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/dosdfe.asm Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/dosdfe.asm
23c23
< ;* $Id: dosdfe.asm,v 1.2 1997/02/27 15:59:14 ldd Exp $
---
> ;* $Id: dosdfe.asm,v 1.1.1.1 1998/10/28 21:37:34 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/dostip.asm Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/dostip.asm
24c24
< ;* $Id: dostip.asm,v 1.2 1997/02/27 15:59:14 ldd Exp $
---
> ;* $Id: dostip.asm,v 1.1.1.1 1998/10/28 21:37:35 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/Makefile.in Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/Makefile.in
19c19
< # $Id: Makefile.in,v 1.2 1997/02/27 15:59:14 ldd Exp $
---
> # $Id: Makefile.in,v 1.1.1.1 1998/10/28 21:37:34 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/udidos.ah Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/udidos.ah
23c23
< ;* $Id: udidos.ah,v 1.2 1997/02/27 15:59:15 ldd Exp $
---
> ;* $Id: udidos.ah,v 1.1.1.1 1998/10/28 21:37:35 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/udidos.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/udidos.h
23c23
< * $Id: udidos.h,v 1.2 1997/02/27 15:59:15 ldd Exp $
---
> * $Id: udidos.h,v 1.1.1.1 1998/10/28 21:37:35 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/udip2dos.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/udip2dos.c
23c23
< * $Id: udip2dos.c,v 1.2 1997/02/27 15:59:15 ldd Exp $
---
> * $Id: udip2dos.c,v 1.1.1.1 1998/10/28 21:37:35 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/udiphdos.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/udiphdos.h
23c23
< * $Id: udiphdos.h,v 1.2 1997/02/27 15:59:15 ldd Exp $
---
> * $Id: udiphdos.h,v 1.1.1.1 1998/10/28 21:37:35 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/udiphsun.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/udiphsun.h
23c23
< * $Id: udiphsun.h,v 1.2 1997/02/27 15:59:15 ldd Exp $
---
> * $Id: udiphsun.h,v 1.1.1.1 1998/10/28 21:37:35 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/udiproc.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/udiproc.h
30c30
< * $Id: udiproc.h,v 1.2 1997/02/27 15:59:15 ldd Exp $
---
> * $Id: udiproc.h,v 1.1.1.1 1998/10/28 21:37:35 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/udipt29k.h Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3gdb/gdb/utils/amd-udi/udi/udipt29k.h
23c23
< * $Id: udipt29k.h,v 1.2 1997/02/27 15:59:15 ldd Exp $
---
> * $Id: udipt29k.h,v 1.1.1.1 1998/10/28 21:37:35 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/m3tk/src/files/Common/M3PathElemList.i3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/m3tk/src/files/Common/M3PathElemList.i3
9,10c9
< INTERFACE M3PathElemList = List(M3PathElem)
< END M3PathElemList.
---
> INTERFACE M3PathElemList = List(Root, M3PathElem) END M3PathElemList.
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/pp/src/ExceptionArg.i3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/pp/src/ExceptionArg.i3
6c6
< $Id: ExceptionArg.i3,v 1.1.1.1 1997/01/16 21:31:50 ldd Exp $
---
> $Id: ExceptionArg.i3,v 1.1.1.1 1998/10/28 21:38:21 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/pp/src/FBE.i3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/pp/src/FBE.i3
7c7
< $Id: FBE.i3,v 1.1.1.1 1997/01/16 21:31:50 ldd Exp $
---
> $Id: FBE.i3,v 1.1.1.1 1998/10/28 21:38:21 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/pp/src/FBEPostScript.i3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/pp/src/FBEPostScript.i3
7c7
< $Id: FBEPostScript.i3,v 1.1.1.1 1997/01/16 21:31:50 ldd Exp $
---
> $Id: FBEPostScript.i3,v 1.1.1.1 1998/10/28 21:38:21 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/pp/src/FBEPostScript.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/pp/src/FBEPostScript.m3
7c7
< $Id: FBEPostScript.m3,v 1.1.1.1 1997/01/16 21:31:50 ldd Exp $
---
> $Id: FBEPostScript.m3,v 1.2 1998/12/01 21:05:40 hosking Exp $
35c35
< AFMDir = "/usr/local/lib/ps/";
---
> AFMDir = "/usr/openwin/lib/X11/fonts/F3/afm/";
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/pp/src/FBEWr.i3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/pp/src/FBEWr.i3
7c7
< $Id: FBEWr.i3,v 1.1.1.1 1997/01/16 21:31:50 ldd Exp $
---
> $Id: FBEWr.i3,v 1.1.1.1 1998/10/28 21:38:21 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/pp/src/FBEWr.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/pp/src/FBEWr.m3
7c7
< $Id: FBEWr.m3,v 1.1.1.1 1997/01/16 21:31:50 ldd Exp $
---
> $Id: FBEWr.m3,v 1.1.1.1 1998/10/28 21:38:21 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/pp/src/flex-bison/lex.yy.c Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/pp/src/flex-bison/lex.yy.c
4c4
< * $Header: /home/cvsroot/m3/pm3/language/modula3/m3tools/pp/src/flex-bison/lex.yy.c,v 1.1.1.1 1997/01/16 21:31:50 ldd Exp $
---
> * $Header: /u/u84/hosking/CVS/pm3/language/modula3/m3tools/pp/src/flex-bison/lex.yy.c,v 1.1.1.1 1998/10/28 21:38:22 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/language/modula3/m3tools/showheap/src/ShowHeap.m3 Persistent_M3/pm3-1.1.15-unpacked/language/modula3/m3tools/showheap/src/ShowHeap.m3
18c18
< FROM RTHeapRep IMPORT Desc, Generation, Note, Page, Space;
---
> FROM RTHeapRep IMPORT Desc, Generation, Note, Page, Space, Access;
30c30
< TYPE Counter = {None, New, Copied, Immobile, Older};
---
> TYPE Counter = {None, New, Copied, Immobile, Older, Persistent};
39c39,40
< d.space, d.generation, d.pure, d.note, d.gray, d.protected];
---
> d.space, d.generation, d.pure, d.note, d.gray, d.access,
> d.resident, d.dirty];
65,66c66,68
< BOOLEAN (* gray *), BOOLEAN (* protected *) OF
< Color.T;
---
> BOOLEAN (* gray *), Access,
> BOOLEAN (* resident *),
> BOOLEAN (* dirty *) OF Color.T;
68,69c70,72
< BOOLEAN (* gray *), BOOLEAN (* protected *) OF
< PaintOp.T;
---
> BOOLEAN (* gray *), Access,
> BOOLEAN (* resident *),
> BOOLEAN (* dirty *) OF PaintOp.T;
71,72c74,76
< BOOLEAN (* gray *), BOOLEAN (* protected *) OF
< Counter;
---
> BOOLEAN (* gray *), Access,
> BOOLEAN (* resident *),
> BOOLEAN (* dirty *) OF Counter;
95c99,101
< FOR protected := FIRST(BOOLEAN) TO LAST(BOOLEAN) DO
---
> FOR access := FIRST(Access) TO LAST(Access) DO
> FOR resident := FIRST(BOOLEAN) TO LAST(BOOLEAN) DO
> FOR dirty := FIRST(BOOLEAN) TO LAST(BOOLEAN) DO
98,99c104,106
< rgb[space, generation, pure, note, gray, protected] :=
< Color.T{0.0, 0.0, 0.0};
---
> rgb[space, generation, pure, note, gray, access,
> resident, dirty] :=
> Color.T{0.0, 0.0, 0.0};
101,102c108,109
< space, generation, pure, note, gray, protected] :=
< Counter.None;
---
> space, generation, pure, note, gray, access,
> resident, dirty] := Counter.None;
104,105c111,113
< rgb[space, generation, pure, note, gray, protected] :=
< Color.T{1.0, 1.0, 1.0};
---
> rgb[space, generation, pure, note, gray, access,
> resident, dirty] :=
> Color.T{1.0, 1.0, 1.0};
107,108c115,116
< space, generation, pure, note, gray, protected] :=
< Counter.None;
---
> space, generation, pure, note, gray, access,
> resident, dirty] := Counter.None;
110,111c118,120
< rgb[space, generation, pure, note, gray, protected] :=
< Color.T{0.25, 0.25, 0.25};
---
> rgb[space, generation, pure, note, gray, access,
> resident, dirty] :=
> Color.T{0.25, 0.25, 0.25};
113,114c122,123
< space, generation, pure, note, gray, protected] :=
< Counter.None;
---
> space, generation, pure, note, gray, access,
> resident, dirty] := Counter.None;
118,119c127,129
< rgb[space, generation, pure, note, gray, protected] :=
< Color.T{0.730, 0.730, 1.0};
---
> rgb[space, generation, pure, note, gray, access,
> resident, dirty] :=
> Color.T{0.730, 0.730, 1.0};
121,122c131,132
< space, generation, pure, note, gray, protected] :=
< Counter.New;
---
> space, generation, pure, note, gray, access,
> resident, dirty] := Counter.New;
125,127c135,137
< rgb[
< space, generation, pure, note, gray, protected] :=
< Color.T{1.0, 0.343, 0.343};
---
> rgb[space, generation, pure, note, gray, access,
> resident, dirty] :=
> Color.T{1.0, 0.343, 0.343};
129,131c139,141
< rgb[
< space, generation, pure, note, gray, protected] :=
< Color.T{0.75, 0.421, 0.421};
---
> rgb[space, generation, pure, note, gray, access,
> resident, dirty] :=
> Color.T{0.75, 0.421, 0.421};
134,135c144,145
< space, generation, pure, note, gray, protected] :=
< Counter.Copied;
---
> space, generation, pure, note, gray, access,
> resident, dirty] := Counter.Copied;
138,140c148,150
< rgb[
< space, generation, pure, note, gray, protected] :=
< Color.T{0.0, 0.812, 0.0};
---
> rgb[space, generation, pure, note, gray, access,
> resident, dirty] :=
> Color.T{0.0, 0.812, 0.0};
142,144c152,154
< rgb[
< space, generation, pure, note, gray, protected] :=
< Color.T{0.275, 0.676, 0.275};
---
> rgb[space, generation, pure, note, gray, access,
> resident, dirty] :=
> Color.T{0.275, 0.676, 0.275};
147,148c157,158
< space, generation, pure, note, gray, protected] :=
< Counter.Immobile;
---
> space, generation, pure, note, gray, access,
> resident, dirty] := Counter.Immobile;
151,153c161,163
< rgb[
< space, generation, pure, note, gray, protected] :=
< Color.T{0.0, 0.812, 0.0};
---
> rgb[space, generation, pure, note, gray, access,
> resident, dirty] :=
> Color.T{0.0, 0.812, 0.0};
155,157c165,167
< rgb[
< space, generation, pure, note, gray, protected] :=
< Color.T{0.275, 0.676, 0.275};
---
> rgb[space, generation, pure, note, gray, access,
> resident, dirty] :=
> Color.T{0.275, 0.676, 0.275};
160,161c170,171
< space, generation, pure, note, gray, protected] :=
< Counter.Immobile;
---
> space, generation, pure, note, gray, access,
> resident, dirty] := Counter.Immobile;
164,166c174,176
< rgb[
< space, generation, pure, note, gray, protected] :=
< Color.T{1.0, 0.198, 1.0};
---
> rgb[space, generation, pure, note, gray, access,
> resident, dirty] :=
> Color.T{1.0, 0.198, 1.0};
168,170c178,180
< rgb[
< space, generation, pure, note, gray, protected] :=
< Color.T{0.725, 0.225, 0.725};
---
> rgb[space, generation, pure, note, gray, access,
> resident, dirty] :=
> Color.T{0.725, 0.225, 0.725};
173,174c183,198
< space, generation, pure, note, gray, protected] :=
< Counter.Older;
---
> space, generation, pure, note, gray, access,
> resident, dirty] := Counter.Older;
> | Note.Persistent =>
> IF gray THEN
> rgb[space, generation, pure, note, gray, access,
> resident, dirty] :=
> Color.T{1.0, 0.75, 0.0};
> ELSE
> rgb[space, generation, pure, note, gray, access,
> resident, dirty] :=
> Color.T{1.0, 0.75, 0.0};
> END;
> counterOf[
> space, generation, pure, note, gray, access,
> resident, dirty] :=
> Counter.Persistent;
177,180c201,205
< WITH rgb = rgb[space, generation, pure, note, gray,
< protected] DO
< tint[space, generation, pure, note, gray, protected] :=
< PaintOp.FromRGB(rgb.r, rgb.g, rgb.b);
---
> WITH rgb = rgb[space, generation, pure, note, gray, access,
> resident, dirty] DO
> tint[space, generation, pure, note, gray, access,
> resident, dirty] :=
> PaintOp.FromRGB(rgb.r, rgb.g, rgb.b);
182c207,209
< END;
---
> END
> END
> END
220a248,256
> VAR
> rgb := Color.T{1.0, 0.75, 0.0};
> quad := PaintOp.MakeColorQuad(
> PaintOp.FromRGB(rgb.r, rgb.g, rgb.b), PaintOp.Bg);
> BEGIN
> countVBT[Counter.Persistent] := TextVBT.New("", bgFg := quad);
> countTextVBT[Counter.Persistent] := TextVBT.New("persistent",
> bgFg := quad);
> END;
301c337,338
< d.note, d.gray, d.protected]);
---
> d.note, d.gray, d.access, d.resident,
> d.dirty]);
330c367,368
< t := tint[d.space, d.generation, d.pure, d.note, d.gray, d.protected];
---
> t := tint[d.space, d.generation, d.pure, d.note, d.gray, d.access,
> d.resident, d.dirty];
410c448,449
< countVBT[Counter.Older], countTextVBT[Counter.Older]);
---
> countVBT[Counter.Older], countTextVBT[Counter.Older],
> countVBT[Counter.Persistent], countTextVBT[Counter.Persistent]);
Only in Persistent_M3/pm3-1.1.15-unpacked/libs: bag
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/atom/Atom.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/atom/Atom.i3
24c24
< TYPE T <: REFANY;
---
> TYPE T <: <*TRANSIENT*> REFANY;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/atom/Atom.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/atom/Atom.m3
5,6c5
< (* Last modified on Thu Mar 10 16:10:31 PST 1994
< by kalsow *)
---
> (* Last modified on Thu Mar 10 16:10:31 PST 1994 by kalsow *)
14,15c13,14
< T = BRANDED Brand REF RECORD
< text : TEXT;
---
> T = <*TRANSIENT*> BRANDED Brand REF RECORD
> <*TRANSIENT*> text : TEXT;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/formatter/Formatter.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/formatter/Formatter.m3
26,27c26,28
< REVEAL
< T = BRANDED REF RECORD
---
> REVEAL T = T_;
> TYPE
> T_ = <*TRANSIENT*> BRANDED REF RECORD
29c30
<
---
>
55c56
< failureCode: REFANY;
---
> <*TRANSIENT*> failureCode: REFANY;
112c113
< ExprBuf = REF ARRAY OF REFANY;
---
> ExprBuf = <*TRANSIENT*> REF <*TRANSIENT*> ARRAY OF REFANY;
116c117
< ConsumerThreadClosure = Thread.SizedClosure OBJECT t: T; METHODS END;
---
> ConsumerThreadClosure = Thread.SizedClosure OBJECT t: T_; METHODS END;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/list/List.ig Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/list/List.ig
14c14
< GENERIC INTERFACE List(Elem);
---
> GENERIC INTERFACE List(Super, Elem);
29c29
< CONST Brand = "(List " & Elem.Brand & ")";
---
> CONST Brand = "(" & Super.Brand & " List " & Elem.Brand & ")";
31c31
< TYPE T = OBJECT head: Elem.T; tail: T END;
---
> TYPE T = Super.T OBJECT head: Elem.T; tail: T END;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/list/list.tmpl Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/list/list.tmpl
13c13
< build_generic_intf (list, "List", [elt], VISIBLE)
---
> build_generic_intf (list, "List", ["Root", elt], VISIBLE)
19c19,31
< build_generic_intf (list, "List", [elt], HIDDEN)
---
> build_generic_intf (list, "List", ["Root", elt], HIDDEN)
> build_generic_impl (list, "List", [elt])
> end
>
> readonly proc TransientList (nm, elt) is
> local list = nm & "List"
> build_generic_intf (list, "List", ["RootTransient", elt], VISIBLE)
> build_generic_impl (list, "List", [elt])
> end
>
> readonly proc transientList (nm, elt) is
> local list = nm & "List"
> build_generic_intf (list, "List", ["RootTransient", elt], HIDDEN)
31a44,57
> build_generic_impl (list, "ListSort", [elt])
> end
>
> readonly proc TransientList_sort (nm, elt) is
> local list = nm & "ListSort"
> local eltlist = nm & "List"
> build_generic_intf (list, "ListSort", [elt, eltlist], VISIBLE)
> build_generic_impl (list, "ListSort", [elt])
> end
>
> readonly proc transientList_sort (nm, elt) is
> local list = nm & "ListSort"
> local eltlist = nm & "List"
> build_generic_intf (list, "ListSort", [elt, eltlist], HIDDEN)
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/list/m3makefile Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/list/m3makefile
18d17
< List ("Atom", "Atom")
23c22,26
< List_sort ("Atom", "Atom")
---
> TransientList ("Atom", "Atom")
> TransientList ("IntTransient", "Integer")
> TransientList ("RefTransient", "RefanyTransient")
> TransientList ("TextTransient", "Text")
>
26a30,34
>
> TransientList_sort ("Atom", "Atom")
> TransientList_sort ("IntTransient", "Integer")
> TransientList_sort ("RefTransient", "RefanyTransient")
> TransientList_sort ("TextTransient", "Text")
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/os/Common/File.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/os/Common/File.i3
38c38
< Public = OBJECT METHODS
---
> Public = <*TRANSIENT*> ROOT OBJECT METHODS
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/os/Common/Pathname.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/os/Common/Pathname.i3
13c13
< IMPORT TextSeq;
---
> IMPORT TextTransientSeq AS TextSeq;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/os/POSIX/FSPosix.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/os/POSIX/FSPosix.m3
14c14,15
< OSErrorPosix, Pathname, Process, Time, Text, TextSeq, Unix,
---
> OSErrorPosix, Pathname, Process, Time, Text,
> TextTransientSeq AS TextSeq, Unix,
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/pickle/ConvertPacking.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/pickle/ConvertPacking.i3
45c45
< Public = OBJECT METHODS
---
> Public = <*TRANSIENT*> ROOT OBJECT METHODS
81c81
< RVPublic = OBJECT METHODS
---
> RVPublic = <*TRANSIENT*> ROOT OBJECT METHODS
96c96
< WVPublic = OBJECT METHODS
---
> WVPublic = <*TRANSIENT*> ROOT OBJECT METHODS
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/pickle/ConvertPacking.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/pickle/ConvertPacking.m3
19,22c19,22
< * $Source: /home/cvsroot/m3/pm3/libs/libm3/src/pickle/ConvertPacking.m3,v $
< * $Date: 1998/02/26 16:37:33 $
< * $Author: dagenais $
< * $Revision: 1.1 $
---
> * $Source: /u/u84/hosking/CVS/pm3/libs/libm3/src/pickle/ConvertPacking.m3,v $
> * $Date: 1999/03/25 22:22:36 $
> * $Author: hosking $
> * $Revision: 1.3 $
24a25,33
> * Revision 1.3 1999/03/25 22:22:36 hosking
> * Cleaned up some template types to allow transient instances.
> *
> * Revision 1.2 1999/01/18 18:00:47 hosking
> * Added check for <*TRANSIENT*> ROOT alongside that for ROOT.
> *
> * Revision 1.1.1.1 1998/10/28 21:38:58 hosking
> * Polytechnique de Montreal Modula-3
> *
457c466
< field := NEW(REF ARRAY OF CARDINAL,
---
> field := NEW(<*TRANSIENT*> REF ARRAY OF CARDINAL,
548c557
< field := NEW(REF ARRAY OF CARDINAL, 1)) DO
---
> field := NEW(<*TRANSIENT*> REF ARRAY OF CARDINAL, 1)) DO
595c604
< WITH new_field = NEW(REF ARRAY OF CARDINAL,
---
> WITH new_field = NEW(<*TRANSIENT*> REF ARRAY OF CARDINAL,
631c640,641
< field := NEW(REF ARRAY OF CARDINAL, count)) DO
---
> field := NEW(<*TRANSIENT*> REF ARRAY OF CARDINAL,
> count)) DO
646c656,657
< field := NEW(REF ARRAY OF CARDINAL, extraCnt)) DO
---
> field := NEW(<*TRANSIENT*> REF ARRAY OF CARDINAL,
> extraCnt)) DO
848c859
< ref : REFANY;
---
> ref : <*TRANSIENT*> REFANY;
881c892
< ref : REFANY;
---
> ref : <*TRANSIENT*> REFANY;
1245c1256,1257
< IF o.super.typecode = TYPECODE(ROOT) THEN
---
> IF o.super.typecode = TYPECODE(ROOT)
> OR o.super.typecode = TYPECODE(<*TRANSIENT*> ROOT) THEN
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/pickle/m3makefile Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/pickle/m3makefile
9c9
< sequence ("PklAction", "PklAction")
---
> transientSequence ("PklAction", "PklAction")
11c11
< table ("Packing", "PackingTypeCode", "Refany")
---
> transientTable ("Packing", "PackingTypeCode", "RefanyTransient")
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/pickle/PackingTypeCode.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/pickle/PackingTypeCode.i3
19,22c19,22
< * $Source: /home/cvsroot/m3/pm3/libs/libm3/src/pickle/PackingTypeCode.i3,v $
< * $Date: 1998/02/26 16:37:33 $
< * $Author: dagenais $
< * $Revision: 1.1 $
---
> * $Source: /u/u84/hosking/CVS/pm3/libs/libm3/src/pickle/PackingTypeCode.i3,v $
> * $Date: 1998/10/28 21:38:58 $
> * $Author: hosking $
> * $Revision: 1.1.1.1 $
24a25,27
> * Revision 1.1.1.1 1998/10/28 21:38:58 hosking
> * Polytechnique de Montreal Modula-3
> *
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/pickle/PackingTypeCode.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/pickle/PackingTypeCode.m3
19,22c19,22
< * $Source: /home/cvsroot/m3/pm3/libs/libm3/src/pickle/PackingTypeCode.m3,v $
< * $Date: 1998/02/26 16:37:34 $
< * $Author: dagenais $
< * $Revision: 1.1 $
---
> * $Source: /u/u84/hosking/CVS/pm3/libs/libm3/src/pickle/PackingTypeCode.m3,v $
> * $Date: 1998/10/28 21:38:58 $
> * $Author: hosking $
> * $Revision: 1.1.1.1 $
24a25,27
> * Revision 1.1.1.1 1998/10/28 21:38:58 hosking
> * Polytechnique de Montreal Modula-3
> *
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/pickle/Pickle.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/pickle/Pickle.i3
131c131
< WriterPublic = OBJECT
---
> WriterPublic = <*TRANSIENT*> ROOT OBJECT
198c198
< ReaderPublic = OBJECT
---
> ReaderPublic = <*TRANSIENT*> ROOT OBJECT
312c312
< SpecialPublic = OBJECT
---
> SpecialPublic = <*TRANSIENT*> ROOT OBJECT
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/pickle/Pickle.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/pickle/Pickle.m3
84c84
< RefTable = REF ARRAY OF RECORD
---
> RefTable = <*TRANSIENT*> REF ARRAY OF RECORD
86c86
< r: REFANY := NIL; (* the Ref *)
---
> <*TRANSIENT*> r: REFANY := NIL; (* the Ref *)
92c92
< RefArray = REF ARRAY OF REFANY;
---
> RefArray = <*TRANSIENT*> REF <*TRANSIENT*> ARRAY OF REFANY;
94c94
< TypeTable = REF ARRAY OF INTEGER;
---
> TypeTable = <*TRANSIENT*> REF ARRAY OF INTEGER;
99c99
< SpecialTable = REF ARRAY OF Special;
---
> SpecialTable = <*TRANSIENT*> REF ARRAY OF Special;
184a185
> RTTypeMap.Kind.TransientRef,
748c749
< IF kind = RTTypeMap.Kind.Ref THEN
---
> IF kind = RTTypeMap.Kind.Ref OR kind = RTTypeMap.Kind.TransientRef THEN
853c854
< IF kind = RTTypeMap.Kind.Ref THEN
---
> IF kind = RTTypeMap.Kind.Ref OR kind = RTTypeMap.Kind.TransientRef THEN
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/pickle/PickleRd.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/pickle/PickleRd.i3
19,22c19,22
< * $Source: /home/cvsroot/m3/pm3/libs/libm3/src/pickle/PickleRd.i3,v $
< * $Date: 1998/02/26 16:37:34 $
< * $Author: dagenais $
< * $Revision: 1.1 $
---
> * $Source: /u/u84/hosking/CVS/pm3/libs/libm3/src/pickle/PickleRd.i3,v $
> * $Date: 1998/10/28 21:38:59 $
> * $Author: hosking $
> * $Revision: 1.1.1.1 $
24a25,27
> * Revision 1.1.1.1 1998/10/28 21:38:59 hosking
> * Polytechnique de Montreal Modula-3
> *
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/pickle/PickleStubs.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/pickle/PickleStubs.i3
19,22c19,22
< * $Source: /home/cvsroot/m3/pm3/libs/libm3/src/pickle/PickleStubs.i3,v $
< * $Date: 1998/02/26 16:37:34 $
< * $Author: dagenais $
< * $Revision: 1.1 $
---
> * $Source: /u/u84/hosking/CVS/pm3/libs/libm3/src/pickle/PickleStubs.i3,v $
> * $Date: 1998/10/28 21:38:59 $
> * $Author: hosking $
> * $Revision: 1.1.1.1 $
24a25,27
> * Revision 1.1.1.1 1998/10/28 21:38:59 hosking
> * Polytechnique de Montreal Modula-3
> *
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/pickle/PickleStubs.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/pickle/PickleStubs.m3
19,22c19,22
< * $Source: /home/cvsroot/m3/pm3/libs/libm3/src/pickle/PickleStubs.m3,v $
< * $Date: 1998/02/26 16:37:34 $
< * $Author: dagenais $
< * $Revision: 1.1 $
---
> * $Source: /u/u84/hosking/CVS/pm3/libs/libm3/src/pickle/PickleStubs.m3,v $
> * $Date: 1998/10/28 21:38:59 $
> * $Author: hosking $
> * $Revision: 1.1.1.1 $
24a25,27
> * Revision 1.1.1.1 1998/10/28 21:38:59 hosking
> * Polytechnique de Montreal Modula-3
> *
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/pickle/PklAction.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/pickle/PklAction.i3
19,22c19,22
< * $Source: /home/cvsroot/m3/pm3/libs/libm3/src/pickle/PklAction.i3,v $
< * $Date: 1998/02/26 16:37:34 $
< * $Author: dagenais $
< * $Revision: 1.1 $
---
> * $Source: /u/u84/hosking/CVS/pm3/libs/libm3/src/pickle/PklAction.i3,v $
> * $Date: 1999/03/25 22:22:36 $
> * $Author: hosking $
> * $Revision: 1.2 $
24a25,30
> * Revision 1.2 1999/03/25 22:22:36 hosking
> * Cleaned up some template types to allow transient instances.
> *
> * Revision 1.1.1.1 1998/10/28 21:38:59 hosking
> * Polytechnique de Montreal Modula-3
> *
38c44
< T = OBJECT kind: Kind; length: INTEGER END;
---
> T = <*TRANSIENT*> ROOT OBJECT kind: Kind; length: INTEGER END;
79c85
< field : REF ARRAY OF CARDINAL;
---
> field : <*TRANSIENT*> REF ARRAY OF CARDINAL;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/pickle/PklTipeMap.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/pickle/PklTipeMap.i3
19,22c19,22
< * $Source: /home/cvsroot/m3/pm3/libs/libm3/src/pickle/PklTipeMap.i3,v $
< * $Date: 1998/02/26 16:37:34 $
< * $Author: dagenais $
< * $Revision: 1.1 $
---
> * $Source: /u/u84/hosking/CVS/pm3/libs/libm3/src/pickle/PklTipeMap.i3,v $
> * $Date: 1998/10/28 21:38:59 $
> * $Author: hosking $
> * $Revision: 1.1.1.1 $
24a25,27
> * Revision 1.1.1.1 1998/10/28 21:38:59 hosking
> * Polytechnique de Montreal Modula-3
> *
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/pickle/PklTipeMap.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/pickle/PklTipeMap.m3
19,22c19,22
< * $Source: /home/cvsroot/m3/pm3/libs/libm3/src/pickle/PklTipeMap.m3,v $
< * $Date: 1998/02/26 16:37:34 $
< * $Author: dagenais $
< * $Revision: 1.1 $
---
> * $Source: /u/u84/hosking/CVS/pm3/libs/libm3/src/pickle/PklTipeMap.m3,v $
> * $Date: 1998/12/15 22:42:30 $
> * $Author: hosking $
> * $Revision: 1.2 $
24a25,30
> * Revision 1.2 1998/12/15 22:42:30 hosking
> * Added new TransientRef opcode in type maps.
> *
> * Revision 1.1.1.1 1998/10/28 21:39:00 hosking
> * Polytechnique de Montreal Modula-3
> *
114c120,121
< "Set" (* bit set *)
---
> "Set", (* bit set *)
> "TransientRef"
133c140,141
< RTTypeMap.Kind.Set
---
> RTTypeMap.Kind.Set,
> RTTypeMap.Kind.TransientRef
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/pqueue/m3makefile Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/pqueue/m3makefile
8a9
> Generic_interface ("PQueueTransientRep")
12d12
< Pqueue ("Atom", "Atom")
15a16,20
>
> TransientPqueue ("Atom", "Atom")
> TransientPqueue ("IntTransient", "Integer")
> TransientPqueue ("RefTransient", "RefanyTransient")
> TransientPqueue ("TextTransient", "Text")
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/pqueue/PQueue.ig Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/pqueue/PQueue.ig
12c12
< GENERIC INTERFACE PQueue(Priority);
---
> GENERIC INTERFACE PQueue(Super, Priority);
28c28
< EltBrand = "(PQueueElt " & Priority.Brand & ")";
---
> EltBrand = "(" & Super.Brand & " PQueueElt " & Priority.Brand & ")";
32c32
< Elt <: OBJECT
---
> Elt <: Super.T OBJECT
51c51
< T = OBJECT METHODS
---
> T = Super.T OBJECT METHODS
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/pqueue/PQueue.mg Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/pqueue/PQueue.mg
6c6
< GENERIC MODULE PQueue(Priority, PQ, PQRep);
---
> GENERIC MODULE PQueue(Super, Priority, PQ, PQRep);
10c10
< EltPub = OBJECT
---
> EltPub = Super.T OBJECT
79c79
< THEN pq.heap := NEW(REF ARRAY OF Elt, sizeHint + 1)
---
> THEN pq.heap := NEW(PQRep.EltsArray, sizeHint + 1)
90c90
< THEN pq.heap := NEW(REF ARRAY OF Elt, newSz + 1)
---
> THEN pq.heap := NEW(PQRep.EltsArray, newSz + 1)
106c106
< VAR new := NEW(REF ARRAY OF Elt, NUMBER(pq.heap^) * 2); BEGIN
---
> VAR new := NEW(PQRep.EltsArray, NUMBER(pq.heap^) * 2); BEGIN
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/pqueue/pqueue.tmpl Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/pqueue/pqueue.tmpl
14c14
< build_generic_intf (pq, "PQueue", [elt], vis)
---
> build_generic_intf (pq, "PQueue", ["Root", elt], vis)
16c16,24
< build_generic_impl (pq, "PQueue", [elt, pq, rep])
---
> build_generic_impl (pq, "PQueue", ["Root", elt, pq, rep])
> end
>
> readonly proc _build_transient_pqueue(nm, elt, vis) is
> local pq = nm & "PQ"
> local rep = pq & "Rep"
> build_generic_intf (pq, "PQueue", ["RootTransient", elt], vis)
> build_generic_intf (rep, "PQueueTransientRep", [pq], vis)
> build_generic_impl (pq, "PQueue", ["RootTransient", elt, pq, rep])
24a33,40
> end
>
> readonly proc transientPqueue (nm, elt) is
> _build_transient_pqueue(nm, elt, HIDDEN)
> end
>
> readonly proc TransientPqueue (nm, elt) is
> _build_transient_pqueue(nm, elt, VISIBLE)
Only in Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/pqueue: PQueueTransientRep.ig
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/random/Common/Random.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/random/Common/Random.i3
22c22
< T = OBJECT METHODS
---
> T = ROOT OBJECT METHODS
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/rw/Common/FileRd.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/rw/Common/FileRd.m3
19c19
< TYPE CharBuffer = REF ARRAY OF CHAR;
---
> TYPE CharBuffer = <*TRANSIENT*> REF ARRAY OF CHAR;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/rw/Common/FileWr.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/rw/Common/FileWr.m3
45c45
< TYPE CharBuffer = REF ARRAY OF CHAR;
---
> TYPE CharBuffer = <*TRANSIENT*> REF ARRAY OF CHAR;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/rw/Common/NullWr.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/rw/Common/NullWr.m3
32c32
< wr.buff := NEW(REF ARRAY OF CHAR, BuffSize);
---
> wr.buff := NEW(<*TRANSIENT*> REF ARRAY OF CHAR, BuffSize);
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/rw/Common/RdClass.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/rw/Common/RdClass.i3
27c27
< Private <: ROOT;
---
> Private <: <*TRANSIENT*> ROOT;
33c33
< buff : REF ARRAY OF CHAR;
---
> buff : <*TRANSIENT*> REF ARRAY OF CHAR;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/rw/Common/Rd.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/rw/Common/Rd.i3
98c98
< TYPE T <: ROOT;
---
> TYPE T <: <*TRANSIENT*> ROOT;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/rw/Common/TextRd.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/rw/Common/TextRd.m3
27c27
< rd.buff := NEW(REF ARRAY OF CHAR, len);
---
> rd.buff := NEW(<*TRANSIENT*> REF ARRAY OF CHAR, len);
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/rw/Common/TextWr.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/rw/Common/TextWr.m3
33,34c33,34
< Buffer = REF ARRAY OF CHAR;
< BufferList = REF ARRAY OF Buffer;
---
> Buffer = <*TRANSIENT*> REF ARRAY OF CHAR;
> BufferList = <*TRANSIENT*> REF ARRAY OF Buffer;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/rw/Common/WrClass.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/rw/Common/WrClass.i3
79c79
< Private <: ROOT;
---
> Private <: <*TRANSIENT*> ROOT;
83c83
< buff : REF ARRAY OF CHAR;
---
> buff : <*TRANSIENT*> REF ARRAY OF CHAR;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/rw/Common/Wr.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/rw/Common/Wr.i3
104c104
< TYPE T <: ROOT;
---
> TYPE T <: <*TRANSIENT*> ROOT;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/sequence/m3makefile Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/sequence/m3makefile
13a14
> Generic_interface("SequenceTransientRep")
19d19
< Sequence ("Atom", "Atom")
22a23,27
>
> TransientSequence ("Atom", "Atom")
> TransientSequence ("IntTransient", "Integer")
> TransientSequence ("RefTransient", "RefanyTransient")
> TransientSequence ("TextTransient", "Text")
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/sequence/Sequence.ig Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/sequence/Sequence.ig
28c28
< GENERIC INTERFACE Sequence(Elem);
---
> GENERIC INTERFACE Sequence(Super, Elem);
41c41
< Brand = "(Sequence " & Elem.Brand & ")";
---
> Brand = "(" & Super.Brand & " Sequence " & Elem.Brand & ")";
45c45
< Public = OBJECT METHODS
---
> Public = Super.T OBJECT METHODS
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/sequence/sequence.tmpl Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/sequence/sequence.tmpl
17c17
< build_generic_intf (seq, "Sequence", [elt], vis)
---
> build_generic_intf (seq, "Sequence", ["Root", elt], vis)
27a28,44
> end
>
> readonly proc _build_transient_sequence (nm, elt, vis) is
> local seq = nm & "Seq"
> local rep = nm & "SeqRep"
>
> build_generic_intf (seq, "Sequence", ["RootTransient", elt], vis)
> build_generic_intf (rep, "SequenceTransientRep", [elt, seq], vis)
> build_generic_impl (seq, "Sequence", [elt, seq, rep])
> end
>
> readonly proc transientSequence (nm, elt) is
> _build_transient_sequence (nm, elt, HIDDEN)
> end
>
> readonly proc TransientSequence (nm, elt) is
> _build_transient_sequence (nm, elt, VISIBLE)
Only in Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/sequence: SequenceTransientRep.ig
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/sortedtable/m3makefile Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/sortedtable/m3makefile
9a10,11
> Generic_interface("SortedTableRep")
> Generic_interface("SortedTableTransientRep")
15,18c17,21
< Sorted_table ("AtomAtom", "Atom", "Atom")
< Sorted_table ("AtomInt", "Atom", "Integer")
< Sorted_table ("AtomRef", "Atom", "Refany")
< Sorted_table ("AtomText", "Atom", "Text")
---
> TransientSorted_table ("AtomAtom", "Atom", "Atom")
> TransientSorted_table ("AtomInt", "Atom", "Integer")
> TransientSorted_table ("AtomRefTransient", "Atom", "RefanyTransient")
> TransientSorted_table ("AtomRef", "Atom", "Refany")
> TransientSorted_table ("AtomText", "Atom", "Text")
20d22
< Sorted_table ("IntAtom", "Integer", "Atom")
25c27,31
< Sorted_table ("RefAtom", "Refany", "Atom")
---
> TransientSorted_table ("IntAtom", "Integer", "Atom")
> TransientSorted_table ("IntIntTransient", "Integer", "Integer")
> TransientSorted_table ("IntRefTransient", "Integer", "RefanyTransient")
> TransientSorted_table ("IntTextTransient", "Integer", "Text")
>
30c36,41
< Sorted_table ("TextAtom", "Text", "Atom")
---
> TransientSorted_table ("RefAtom", "Refany", "Atom")
> TransientSorted_table ("RefAtomTransient", "RefanyTransient", "Atom")
> TransientSorted_table ("RefIntTransient", "RefanyTransient", "Integer")
> TransientSorted_table ("RefRefTransient", "RefanyTransient", "RefanyTransient")
> TransientSorted_table ("RefTextTransient", "RefanyTransient", "Text")
>
33a45,49
>
> TransientSorted_table ("TextAtom", "Text", "Atom")
> TransientSorted_table ("TextIntTransient", "Text", "Integer")
> TransientSorted_table ("TextRefTransient", "Text", "RefanyTransient")
> TransientSorted_table ("TextTextTransient", "Text", "Text")
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/sortedtable/SortedTable.mg Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/sortedtable/SortedTable.mg
14c14
< GENERIC MODULE SortedTable (Key, Value, Tbl);
---
> GENERIC MODULE SortedTable (Key, Value, Tbl, Rep);
18a19
> FROM Rep IMPORT Node;
48,55d48
< END;
<
< TYPE
< Node = REF RECORD
< key : Key.T;
< value : Value.T;
< child := ARRAY [0..1] OF Node { NIL, NIL };
< priority: INTEGER (* random num; tree is a heap on these *)
Only in Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/sortedtable: SortedTableRep.ig
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/sortedtable/sortedtable.tmpl Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/sortedtable/sortedtable.tmpl
14a15
> local rep = tab & "Rep"
16c17,18
< build_generic_impl (tab, "SortedTable", [key, value, base])
---
> build_generic_intf (rep, "SortedTableRep", [key, value], VISIBLE)
> build_generic_impl (tab, "SortedTable", [key, value, base, rep])
21a24
> local rep = tab & "Rep"
23c26,45
< build_generic_impl (tab, "SortedTable", [key, value, base])
---
> build_generic_intf (rep, "SortedTableRep", [key, value], HIDDEN)
> build_generic_impl (tab, "SortedTable", [key, value, base, rep])
> end
>
> readonly proc TransientSorted_table (nm, key, value) is
> local base = nm & "Tbl"
> local tab = "Sorted" & base
> local rep = tab & "Rep"
> build_generic_intf (tab, "SortedTable", [key, base], VISIBLE)
> build_generic_intf (rep, "SortedTableTransientRep", [key, value], VISIBLE)
> build_generic_impl (tab, "SortedTable", [key, value, base, rep])
> end
>
> readonly proc transientSorted_table (nm, key, value) is
> local base = nm & "Tbl"
> local tab = "Sorted" & base
> local rep = tab & "Rep"
> build_generic_intf (tab, "SortedTable", [key, base], HIDDEN)
> build_generic_intf (rep, "SortedTableTransientRep", [key, value], HIDDEN)
> build_generic_impl (tab, "SortedTable", [key, value, base, rep])
Only in Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/sortedtable: SortedTableTransientRep.ig
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/sx/Sx.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/sx/Sx.m3
133,136c133,136
< MList = REF RECORD
< ch : CHAR;
< m : ReadMacro;
< next: MList := NIL
---
> MList = <*TRANSIENT*> REF RECORD
> ch: CHAR;
> <*TRANSIENT*> m: ReadMacro;
> next: MList := NIL
297,298c297,298
< buff := NEW (REF ARRAY OF CHAR, MAXLEN), lo := 0, st := 0,
< seekable := TRUE, intermittent := FALSE);
---
> buff := NEW (<*TRANSIENT*> REF ARRAY OF CHAR, MAXLEN),
> lo := 0, st := 0, seekable := TRUE, intermittent := FALSE);
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/table/m3makefile Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/table/m3makefile
7a8,9
> Generic_interface("TableRep")
> Generic_interface("TableTransientRep")
13,16c15,19
< Table ("AtomAtom", "Atom", "Atom")
< Table ("AtomInt", "Atom", "Integer")
< Table ("AtomRef", "Atom", "Refany")
< Table ("AtomText", "Atom", "Text")
---
> TransientTable ("AtomAtom", "Atom", "Atom")
> TransientTable ("AtomInt", "Atom", "Integer")
> TransientTable ("AtomRef", "Atom", "Refany")
> TransientTable ("AtomRefTransient", "Atom", "RefanyTransient")
> TransientTable ("AtomText", "Atom", "Text")
18d20
< Table ("IntAtom", "Integer", "Atom")
23c25,29
< Table ("RefAtom", "Refany", "Atom")
---
> TransientTable ("IntAtom", "Integer", "Atom")
> TransientTable ("IntIntTransient", "Integer", "Integer")
> TransientTable ("IntRefTransient", "Integer", "RefanyTransient")
> TransientTable ("IntTextTransient", "Integer", "Text")
>
28c34,39
< Table ("TextAtom", "Text", "Atom")
---
> TransientTable ("RefAtom", "Refany", "Atom")
> TransientTable ("RefAtomTransient", "RefanyTransient", "Atom")
> TransientTable ("RefIntTransient", "RefanyTransient", "Integer")
> TransientTable ("RefRefTransient", "RefanyTransient", "RefanyTransient")
> TransientTable ("RefTextTransient", "RefanyTransient", "Text")
>
32a44,47
> TransientTable ("TextAtom", "Text", "Atom")
> TransientTable ("TextIntTransient", "Text", "Integer")
> TransientTable ("TextRefTransient", "Text", "RefanyTransient")
> TransientTable ("TextTextTransient", "Text", "Text")
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/table/Table.ig Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/table/Table.ig
18c18
< GENERIC INTERFACE Table(Key, Value);
---
> GENERIC INTERFACE Table(Super, Key, Value);
45c45
< Brand = "(Table " & Key.Brand & " " & Value.Brand & ")";
---
> Brand = "(" & Super.Brand & " Table " & Key.Brand & " " & Value.Brand & ")";
50c50
< T = OBJECT METHODS
---
> T = Super.T OBJECT METHODS
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/table/Table.mg Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/table/Table.mg
14c14
< GENERIC MODULE Table(Key, Value);
---
> GENERIC MODULE Table(Key, Value, Rep);
18a19
> FROM Rep IMPORT BucketArray, EntryList;
30c31
< buckets: REF ARRAY OF EntryList;
---
> buckets: BucketArray;
46,51d46
< TYPE EntryList = REF RECORD
< key: Key.T;
< value: Value.T;
< tail: EntryList
< END;
<
209c204
< tbl.buckets := NEW(REF ARRAY OF EntryList, numBuckets);
---
> tbl.buckets := NEW(BucketArray, numBuckets);
Only in Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/table: TableRep.ig
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/table/table.tmpl Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/table/table.tmpl
13,14c13,16
< build_generic_intf (tab, "Table", [key, value], VISIBLE)
< build_generic_impl (tab, "Table", [key, value])
---
> local tabrep = nm & "TblRep"
> build_generic_intf (tab, "Table", ["Root", key, value], VISIBLE)
> build_generic_intf (tabrep, "TableRep", [key, value], VISIBLE)
> build_generic_impl (tab, "Table", [key, value, tabrep])
19,20c21,40
< build_generic_intf (tab, "Table", [key, value], HIDDEN)
< build_generic_impl (tab, "Table", [key, value])
---
> local tabrep = nm & "TblRep"
> build_generic_intf (tab, "Table", ["Root", key, value], HIDDEN)
> build_generic_intf (tabrep, "TableRep", [key, value], HIDDEN)
> build_generic_impl (tab, "Table", [key, value, tabrep])
> end
>
> readonly proc TransientTable (nm, key, value) is
> local tab = nm & "Tbl"
> local tabrep = nm & "TblRep"
> build_generic_intf (tab, "Table", ["RootTransient", key, value], VISIBLE)
> build_generic_intf (tabrep, "TableTransientRep", [key, value], VISIBLE)
> build_generic_impl (tab, "Table", [key, value, tabrep])
> end
>
> readonly proc transientTable (nm, key, value) is
> local tab = nm & "Tbl"
> local tabrep = nm & "TblRep"
> build_generic_intf (tab, "Table", ["RootTransient", key, value], HIDDEN)
> build_generic_intf (tabrep, "TableTransientRep", [key, value], HIDDEN)
> build_generic_impl (tab, "Table", [key, value, tabrep])
Only in Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/table: TableTransientRep.ig
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/types/m3makefile Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/types/m3makefile
20a21,23
> Module ("Root")
> Module ("RefanyTransient")
> Module ("RootTransient")
27a31,33
> HtmlInterface("Root")
> HtmlInterface("RefanyTransient")
> HtmlInterface("RootTransient")
Only in Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/types: RefanyTransient.i3
Only in Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/types: RefanyTransient.m3
Only in Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/types: Root.i3
Only in Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/types: Root.m3
Only in Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/types: RootTransient.i3
Only in Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/types: RootTransient.m3
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/libm3/src/uid/Common/Capability.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/libm3/src/uid/Common/Capability.m3
14c14
< VAR state := NEW(Thread.Mutex OBJECT r: Random.T := NIL; END);
---
> VAR state := NEW(Thread.Mutex OBJECT <*TRANSIENT*> r: Random.T := NIL; END);
Only in Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/C/FreeBSD3: Cstdio.i3.orig
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/Csupport/SUN386/waitpid.c Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/Csupport/SUN386/waitpid.c
31c31
< static char rcsid[] = "$Header: /home/cvsroot/m3/pm3/libs/m3core/src/Csupport/SUN386/waitpid.c,v 1.1.1.1 1997/01/16 21:30:02 ldd Exp $ SPRITE (Berkeley)";
---
> static char rcsid[] = "$Header: /u/u84/hosking/CVS/pm3/libs/m3core/src/Csupport/SUN386/waitpid.c,v 1.1.1.1 1998/10/28 21:39:46 hosking Exp $ SPRITE (Berkeley)";
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/fingerprint/Fingerprint.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/fingerprint/Fingerprint.i3
65a66,69
> PROCEDURE Compare(fp1, fp2: T): [-1..1];
> (* Return -1 if "fp1" occurs before "fp2", 0 if "Equal(fp1, fp2)", +1 if
> "fp1" occurs after "fp2" in lexicographic order. *)
>
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/fingerprint/Fingerprint.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/fingerprint/Fingerprint.m3
107a108,117
> PROCEDURE Compare(fp1, fp2: T): [-1..1] =
> BEGIN
> FOR i := 0 TO 7 DO
> IF fp1.byte[i] < fp2.byte[i] THEN RETURN -1;
> ELSIF fp1.byte[i] > fp2.byte[i] THEN RETURN +1;
> END;
> END;
> RETURN 0;
> END Compare;
>
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/ALPHA_OSF/RTHeapDepC.c Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/ALPHA_OSF/RTHeapDepC.c
1296c1296
< result = syscall(SYS_sigaction, signal, action, o_action);
---
> result = __sigaction(signal, action, o_action);
1307c1307
< result = syscall(SYS_sigpending, set);
---
> result = __sigpending(set);
1321c1321
< result = syscall(SYS_sigprocmask, how, set, o_set);
---
> result = __sigprocmask(how, set, o_set);
1368c1368
< result = syscall(SYS_sigsuspend, signal_mask);
---
> result = __sigsuspend(signal_mask);
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/ALPHA_OSF/RTHeapDep.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/ALPHA_OSF/RTHeapDep.m3
19,20c19,21
< PROCEDURE Fault (sig: Ctypes.int; code: Ctypes.int;
< scp: UNTRACED REF Usignal.struct_sigcontext) =
---
> PROCEDURE Fault (sig: Ctypes.int;
> sip: UNTRACED REF Usignal.siginfo_t;
> scp: UNTRACED REF Usignal.struct_sigcontext) =
23a25
> VAR sip_fault := LOOPHOLE(sip, UNTRACED REF Usignal.siginfo_t_fault);
26,29c28,32
< (* The field "sc_traparg_a0" of a "Usignal.struct_sigcontext"
< is the virtual address that caused the fault. *)
< IF scp # NIL AND RTHeapRep.Fault(LOOPHOLE(scp.sc_traparg_a0, ADDRESS)) THEN
< RETURN
---
> IF sig = Usignal.SIGSEGV AND sip # NIL THEN
> <*ASSERT sig = sip.si_signo*>
> IF RTHeapRep.Fault(sip_fault.si_addr) THEN
> RETURN;
> END
35c38
< Core(sig, code, scp);
---
> Core(sig, sip, scp);
37c40
< origSIGSEGV(sig, code, scp);
---
> origSIGSEGV(sig, sip, scp);
44,45c47,49
< PROCEDURE Core (sig: Ctypes.int; <*UNUSED*> code: Ctypes.int;
< <*UNUSED*> scp: UNTRACED REF Usignal.struct_sigcontext) =
---
> PROCEDURE Core (sig: Ctypes.int;
> <*UNUSED*> sip: UNTRACED REF Usignal.siginfo_t;
> <*UNUSED*> scp: UNTRACED REF Usignal.struct_sigcontext) =
50,54d53
< VAR
< (* default signal handler *)
< in_vec := Usignal.struct_sigvec{
< sv_handler := Usignal.SIG_DFL, sv_mask := 0, sv_flags := 0};
< dummy_vec: Usignal.struct_sigvec;
63,64c62,77
< EVAL Usignal.sigvec(sig, in_vec, (*OUT*) dummy_vec);
< EVAL Usignal.sigsetmask(0);
---
>
> (* establish default handler *)
> VAR
> new, old: Usignal.struct_sigaction;
> BEGIN
> new.sa_flags := 0;
> new.sa_handler := Usignal.SIG_DFL;
> EVAL Usignal.sigemptyset(new.sa_mask);
> EVAL Usignal.sigaction(sig, new, old);
> END;
>
> VAR set: Usignal.sigset_t;
> BEGIN
> EVAL Usignal.sigemptyset(set);
> EVAL Usignal.sigprocmask(Usignal.SIG_SETMASK, set);
> END;
77,79d89
< CONST
< (* block the "SIGVTALRM" signal when signal handlers are called *)
< Mask = Word.LeftShift(1, Usignal.SIGVTALRM - 1);
89,92c99
< in_vec := Usignal.struct_sigvec{
< sv_handler := Fault, sv_mask := Mask, sv_flags := 0};
< out_vec: Usignal.struct_sigvec;
< ret := Usignal.sigvec(Usignal.SIGSEGV, in_vec, (*OUT*) out_vec);
---
> new, old : Usignal.struct_sigaction;
94,95c101,117
< <* ASSERT ret = 0 *>
< origSIGSEGV := out_vec.sv_handler;
---
> new.sa_flags := Word.Or(Usignal.SA_NODEFER,
> Word.Or(Usignal.SA_RESTART, Usignal.SA_SIGINFO));
> new.sa_handler := Fault;
> WITH i = Usignal.sigemptyset(new.sa_mask) DO
> <*ASSERT i = 0*>
> END;
> (* block the "SIGVTALRM" signal when signal handlers are called *)
> WITH i = Usignal.sigaddset(new.sa_mask, Usignal.SIGVTALRM) DO
> <*ASSERT i = 0*>
> END;
> WITH i = Usignal.sigaddset(new.sa_mask, Usignal.SIGINT) DO
> <*ASSERT i = 0*>
> END;
> WITH i = Usignal.sigaction(Usignal.SIGSEGV, new, old) DO
> <*ASSERT i = 0*>
> END;
> origSIGSEGV := old.sa_handler;
100c122
< install a for "sig" that dumps core. *)
---
> install a handler for "sig" that dumps core. *)
102,105c124
< in_vec := Usignal.struct_sigvec{
< sv_handler := Core, sv_mask := Mask, sv_flags := 0};
< out_vec: Usignal.struct_sigvec;
< ret := Usignal.sigvec(sig, in_vec, (*OUT*) out_vec);
---
> new, old: Usignal.struct_sigaction;
107c126,136
< <* ASSERT ret = 0 *>
---
> new.sa_flags := Usignal.SA_SIGINFO;
> new.sa_handler := Core;
> WITH i = Usignal.sigemptyset(new.sa_mask) DO
> <*ASSERT i = 0*>
> END;
> WITH i = Usignal.sigaddset(new.sa_mask, Usignal.SIGVTALRM) DO
> <*ASSERT i = 0*>
> END;
> WITH i = Usignal.sigaction(sig, new, old) DO
> <*ASSERT i = 0*>
> END;
109,113c138,141
< IF out_vec.sv_handler # Usignal.SIG_DFL THEN
< VAR dummy_vec: Usignal.struct_sigvec; BEGIN
< ret := Usignal.sigvec(sig, out_vec, (*OUT*) dummy_vec);
< <* ASSERT ret = 0 *>
< END
---
> IF old.sa_handler # Usignal.SIG_DFL THEN
> WITH i = Usignal.sigaction(sig, old, new) DO
> <*ASSERT i = 0*>
> END;
155c183
< ret := Uresource.getrusage(Uresource.RUSAGE_SELF, (*OUT*) ADR(usage));
---
> ret := Uresource.getrusage(Uresource.RUSAGE_SELF, usage);
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/ALPHA_OSF/RTSignal.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/ALPHA_OSF/RTSignal.m3
14c14,15
< SigInfo = UNTRACED REF Usignal.struct_sigcontext;
---
> SigInfo = UNTRACED REF Usignal.siginfo_t;
> SigContext = UNTRACED REF Usignal.struct_sigcontext;
19c20
< initial_handlers : ARRAY [0..5] OF Usignal.struct_sigvec;
---
> initial_handlers : ARRAY [0..5] OF Usignal.struct_sigaction;
38c39
< VAR new: Usignal.struct_sigvec;
---
> VAR new: Usignal.struct_sigaction;
40,44c41,49
< new.sv_handler := LOOPHOLE (handler, Usignal.SignalHandler);
< new.sv_mask := Usignal.empty_sv_mask;
< new.sv_flags := 0;
< EVAL Usignal.sigvec (sig, new, initial_handlers[id]);
< IF (initial_handlers[id].sv_handler # DefaultHandler) THEN
---
> new.sa_handler := LOOPHOLE (handler, Usignal.SignalHandler);
> new.sa_flags := Usignal.SA_SIGINFO;
> WITH i = Usignal.sigemptyset(new.sa_mask) DO
> <*ASSERT i = 0*>
> END;
> WITH i = Usignal.sigaction (sig, new, initial_handlers[id]) DO
> <*ASSERT i = 0*>
> END;
> IF (initial_handlers[id].sa_handler # DefaultHandler) THEN
46c51,53
< EVAL Usignal.sigvec (sig, initial_handlers[id], new);
---
> WITH i = Usignal.sigaction (sig, initial_handlers[id], new) DO
> <*ASSERT i = 0*>
> END;
61c68
< VAR old: Usignal.struct_sigvec;
---
> VAR old: Usignal.struct_sigaction;
63c70
< EVAL Usignal.sigvec (sig, initial_handlers[id], old);
---
> EVAL Usignal.sigaction (sig, initial_handlers[id], old);
66,71c73,80
< PROCEDURE Shutdown (sig: int; <*UNUSED*> code: int; <*UNUSED*> scp: SigInfo) =
< VAR new, old: Usignal.struct_sigvec;
< BEGIN
< new.sv_handler := DefaultHandler;
< new.sv_mask := Usignal.empty_sv_mask;
< new.sv_flags := 0;
---
> PROCEDURE Shutdown (sig: int;
> <*UNUSED*> sip: SigInfo;
> <*UNUSED*> scp: SigContext) =
> VAR new, old: Usignal.struct_sigaction;
> BEGIN
> new.sa_handler := DefaultHandler;
> new.sa_flags := 0;
> EVAL Usignal.sigemptyset(new.sa_mask);
73c82
< EVAL Usignal.sigvec (sig, new, old); (* restore default handler *)
---
> EVAL Usignal.sigaction (sig, new, old); (* restore default handler *)
77c86
< PROCEDURE Interrupt (sig: int; code: int; scp: SigInfo) =
---
> PROCEDURE Interrupt (sig: int; sip: SigInfo; scp: SigContext) =
81c90
< Shutdown (sig, code, scp);
---
> Shutdown (sig, sip, scp);
88c97,99
< PROCEDURE Quit (<*UNUSED*> sig, code: int; scp: SigInfo) =
---
> PROCEDURE Quit (<*UNUSED*> sig: int;
> <*UNUSED*> sip: SigInfo;
> scp: SigContext) =
95c106,108
< PROCEDURE SegV (<*UNUSED*> sig, code: int; scp: SigInfo) =
---
> PROCEDURE SegV (<*UNUSED*> sig: int;
> <*UNUSED*> sip: SigInfo;
> scp: SigContext) =
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/ALPHA_OSF/RTThread.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/ALPHA_OSF/RTThread.m3
89a90,92
> VAR
> ThreadSwitchSignal: Usignal.sigset_t;
>
91c94
< VAR sv, osv: Usignal.struct_sigvec; i: INTEGER;
---
> VAR new, old: Usignal.struct_sigaction;
93,97c96,103
< sv.sv_handler := handler;
< sv.sv_mask := Usignal.empty_sv_mask;
< sv.sv_flags := 0;
< i := Usignal.sigvec (Usignal.SIGVTALRM, sv, osv);
< <*ASSERT i = 0*>
---
> new.sa_handler := handler;
> new.sa_flags := Word.Or(Usignal.SA_RESTART, Usignal.SA_SIGINFO);
> WITH i = Usignal.sigemptyset(new.sa_mask) DO
> <* ASSERT i = 0 *>
> END;
> WITH i = Usignal.sigaction (Usignal.SIGVTALRM, new, old) DO
> <* ASSERT i = 0 *>
> END;
101d106
< VAR i : Word.T;
103,105c108,110
< i := Usignal.sigsetmask (0);
< i := Word.And (i, Word.Not (Usignal.sigmask (Usignal.SIGVTALRM)));
< EVAL Usignal.sigsetmask (i);
---
> WITH i = Usignal.sigprocmask(Usignal.SIG_UNBLOCK, ThreadSwitchSignal) DO
> <* ASSERT i = 0 *>
> END;
109d113
< VAR i : Word.T;
111,113c115,117
< i := Usignal.sigsetmask (0);
< i := Word.Or (i, Usignal.sigmask (Usignal.SIGVTALRM));
< EVAL Usignal.sigsetmask (i);
---
> WITH i = Usignal.sigprocmask(Usignal.SIG_BLOCK, ThreadSwitchSignal) DO
> <* ASSERT i = 0 *>
> END;
116a121,126
> WITH i = Usignal.sigemptyset(ThreadSwitchSignal) DO
> <* ASSERT i = 0 *>
> END;
> WITH i = Usignal.sigaddset(ThreadSwitchSignal, Usignal.SIGVTALRM) DO
> <* ASSERT i = 0 *>
> END;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/m3makefile Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/m3makefile
24a25,26
> Interface ("RTHeapDB")
> Interface ("RTDB")
49a52
> Interface ("RTTxn")
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTAllocator.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTAllocator.m3
16c16,17
< FROM RTHeapRep IMPORT Header, RefHeader, AllocForNew, Malloc;
---
> FROM RTHeapRep
> IMPORT Header, RefHeader, AllocForNew, AllocForNewTransient, Malloc;
34c35,40
< RETURN Allocate(def);
---
> IF def.traced = 1 THEN
> RETURN Allocate(def);
> ELSE
> <* ASSERT def.traced = 3 *>
> RETURN AllocateTransient(def);
> END;
82c88,93
< RETURN AllocateOpenArray(def, s);
---
> IF def.traced = 1 THEN
> RETURN AllocateOpenArray(def, s);
> ELSE
> <* ASSERT def.traced = 3 *>
> RETURN AllocateTransientOpenArray(def, s);
> END;
148a160,198
> PROCEDURE AllocateTransient (defn: ADDRESS): REFANY =
> VAR
> def : RT0.TypeDefn := defn;
> tc : Typecode := def.typecode;
> res : ADDRESS;
> BEGIN
> RTOS.LockHeap();
> BEGIN
> WITH z = RT0u.alloc_cnts[tc] DO z := Word.Plus (z, 1) END;
> res := AllocForNewTransient(def.dataSize, def.dataAlignment);
> IF (tc <= LAST (initCache)) AND (initCache[tc] # NIL) THEN
> RTMisc.Copy(initCache[tc], res - ADRSIZE(Header),
> def.dataSize + BYTESIZE(Header));
> ELSE
> LOOPHOLE(res - ADRSIZE(Header), RefHeader)^ :=
> Header{typecode := tc, forwarded := FALSE};
> RTMisc.Zero(res, def.dataSize);
> IF def.defaultMethods # NIL THEN
> LOOPHOLE(res, UNTRACED REF ADDRESS)^ := def.defaultMethods;
> END;
> VAR d := def;
> BEGIN
> WHILE d # NIL DO
> IF d.initProc # NIL THEN d.initProc(res); END;
> d := d.parent;
> END;
> END;
> IF (def.dataSize <= BYTESIZE(def^)) AND (tc <= LAST (initCache)) THEN
> initCache[tc] := Malloc(def.dataSize + BYTESIZE(Header));
> RTMisc.Copy(res - ADRSIZE(Header), initCache[tc],
> BYTESIZE(Header) + def.dataSize);
> END;
> END;
> END;
> RTOS.UnlockHeap();
> IF (callback # NIL) THEN callback (LOOPHOLE (res, REFANY)); END;
> RETURN LOOPHOLE(res, REFANY);
> END AllocateTransient;
>
188a239
> <* ASSERT def.traced = 1 *>
194c245
< def.dataAlignment);
---
> def.dataAlignment);
211a263,296
>
> PROCEDURE AllocateTransientOpenArray (defn: ADDRESS; READONLY s: Shape):
> REFANY =
> VAR
> def : RT0.TypeDefn := defn;
> res : ADDRESS;
> nbElems := OpenArrayCount(s);
> nBytes := def.dataSize + nbElems * def.elementSize;
> tc : Typecode := def.typecode;
> BEGIN
> <* ASSERT def.traced = 3 *>
> RTOS.LockHeap();
> BEGIN
> WITH z = RT0u.alloc_cnts[tc] DO z := Word.Plus (z, 1) END;
> WITH z = RT0u.alloc_bytes[tc] DO z := Word.Plus (z, nBytes) END;
> res := AllocForNewTransient(RTMisc.Upper(nBytes, BYTESIZE(Header)),
> def.dataAlignment);
> LOOPHOLE(res - ADRSIZE(Header), RefHeader)^ :=
> Header{typecode := tc, forwarded := FALSE};
> LOOPHOLE(res, UNTRACED REF ADDRESS)^ := res + def.dataSize;
> FOR i := 0 TO NUMBER(s) - 1 DO
> LOOPHOLE(res + ADRSIZE(ADDRESS) + i * ADRSIZE(INTEGER),
> UNTRACED REF INTEGER)^ := s[i];
> END;
> RTMisc.Zero(res + def.dataSize, nbElems * def.elementSize);
> WHILE def # NIL DO
> IF def.initProc # NIL THEN def.initProc(res); END;
> def := def.parent;
> END;
> END;
> RTOS.UnlockHeap();
> IF (callback # NIL) THEN callback (LOOPHOLE (res, REFANY)); END;
> RETURN LOOPHOLE(res, REFANY);
> END AllocateTransientOpenArray;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTBuiltin.c Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTBuiltin.c
68a69,70
> _TYPECELL transient_root;
> _TYPECELL transient_refany;
198,205c200,201
< 0 /* next */
< }
<
< };
<
<
<
<
---
> &SELF.transient_root /* next */
> },
206a203,223
> /*--------- transient root -----------------*/
> /* FP ("$objecttransient") ==> 16_d43028af7d43fb09 => 16_a973d3a6 = -1452026970 */
> { 0, 0, /* typecode */
> -1452026970, /* selfID */
> { 0xd4, 0x30, 0x28, 0xaf, 0x7d, 0x43, 0xfb, 0x09 }, /* fingerprint */
> 3, /* traced, transient */
> 0, WSZ, WSZ, /* data offset, size, alignment */
> 0, WSZ, /* method offset, size */
> 0, 0, /* nDimensions, elementSize */
> 0, /* default methods */
> 0, /* type map */
> 0, /* gc map */
> 0, /* type desc */
> 0, /* initProc */
> 0, /* linkProc */
> 0, /* parent ID */
> 0, 0, 0, /* parent, children, sibling */
> 0, /* brand */
> "TRANSIENT ROOT", /* name */
> &SELF.transient_refany /* next */
> },
207a225,245
> /*--------- transient refany -----------------*/
> /* FP ("$refanytransient") ==> 16_28671e147983a92d => 16_51e4b739 = 1373943609 */
> { 0, 0, /* typecode */
> 1373943609, /* selfID */
> { 0x28, 0x67, 0x1e, 0x14, 0x79, 0x83, 0xa9, 0x2d }, /* fingerprint */
> 3, /* traced, transient */
> 0, WSZ, WSZ, /* data offset, size, alignment */
> 0, 0, /* method offset, size */
> 0, 0, /* nDimensions, elementSize */
> 0, /* default methods */
> 0, /* type map */
> 0, /* gc map */
> 0, /* type desc */
> 0, /* initProc */
> 0, /* linkProc */
> 0, /* parent ID */
> 0, 0, 0, /* parent, children, sibling */
> 0, /* brand */
> "TRANSIENT REFANY", /* name */
> 0 /* next */
> }
208a247
> };
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTBuiltin.m3x Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTBuiltin.m3x
31c31
< I0 1 9 0 0 0 0 0 2 0 0 24 0
---
> I0 1 9 0 0 0 0 0 2 0 0 26 0
70a71,76
>
> /* TRANSIENT ROOT */
> Ta973d3a6
>
> /* TRANSIENT REFANY */
> T51e4b739
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTCollector.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTCollector.m3
5a6
> (* portions Copyright 1998, Purdue Research Foundation *)
15c16
< RTHeapRep, RTWeakRef;
---
> RTHeapRep, RTWeakRef, RTHeapDB;
17c18
< IMPORT RT0, RT0u, RTHeapEvent, RTHeapDep, RTHeapMap, RTMachine;
---
> IMPORT RT0, RT0u, RTIO, RTHeapEvent, RTHeapDep, RTHeapMap, RTMachine;
19a21,22
> IMPORT RTDB, RTTxn, RTTypeMap, RTTypeFP, Fingerprint;
> IMPORT Text, TextF;
22c25,26
< FROM RTIO IMPORT PutText, PutInt;
---
> FROM RTIO IMPORT PutText, PutInt, PutChars;
> IMPORT Cstring;
168a173
> ThreadF.SuspendOthers();
170c175,187
< IF desc[p - p0].protected THEN Unprotect(p); END;
---
> IF ThreadF.myTxn = NIL
> OR map[p - p0] = NIL
> OR map[p - p0].writer = ThreadF.myTxn
> THEN
> IF desc[p - p0].access # Access.ReadWrite THEN
> desc[p - p0].dirty := TRUE;
> Unprotect(p);
> END
> ELSIF map[p - p0].lastReader = ThreadF.myTxn THEN
> IF desc[p - p0].access = Access.None THEN
> Protect(p, Access.ReadOnly);
> END
> END
171a189
> ThreadF.ResumeOthers();
305a324,349
> PROCEDURE OpenArraySize(h: RefHeader; def: TypeDefn): CARDINAL =
> (* the referent is an open array; it has the following layout:
> | pointer to the elements (ADDRESS)
> | size 1
> | ....
> | size n
> | optional padding
> | elements
> | ....
> where n is the number of open dimensions (given by the definition)
> and each size is the number of elements along the dimension *)
> VAR
> res: INTEGER;
> sizes: UNTRACED REF INTEGER := h + ADRSIZE(Header) + ADRSIZE(ADDRESS);
> (* ^ elt pointer*)
> BEGIN
> res := 1;
> FOR i := 0 TO def.nDimensions - 1 DO
> res := res * sizes^;
> INC(sizes, ADRSIZE(sizes^));
> END;
> res := res * def.elementSize;
> res := RTMisc.Upper(res + def.dataSize, BYTESIZE(Header));
> RETURN res;
> END OpenArraySize;
>
322,344c366,367
< (* ELSE, the referent is an open array; it has the following layout:
< | pointer to the elements (ADDRESS)
< | size 1
< | ....
< | size n
< | optional padding
< | elements
< | ....
< where n is the number of open dimensions (given by the definition)
< and each size is the number of elements along the dimension *)
< VAR
< sizes: UNTRACED REF INTEGER := h + ADRSIZE(Header) + ADRSIZE(ADDRESS);
< (* ^ elt pointer*)
< BEGIN
< res := 1;
< FOR i := 0 TO def.nDimensions - 1 DO
< res := res * sizes^;
< INC(sizes, ADRSIZE(sizes^));
< END;
< res := res * def.elementSize;
< END;
< res := RTMisc.Upper(res + def.dataSize, BYTESIZE(Header));
< RETURN res;
---
> (* ELSE, the referent is an open array *)
> RETURN OpenArraySize(h, def);
380a404,424
> PROCEDURE PageToData (p: Page): UNTRACED REF RTHeapDep.PageData =
> BEGIN
> RETURN LOOPHOLE(p * BytesPerPage, UNTRACED REF RTHeapDep.PageData);
> END PageToData;
>
> PROCEDURE RefPageMap (object: REFANY): RTDB.Page =
> VAR p: Page;
> BEGIN
> TRY
> RTOS.LockHeap();
> p := ReferentToPage(LOOPHOLE(object, RefReferent));
> IF p = Nil THEN
> RETURN NIL;
> ELSE
> RETURN map[p - p0];
> END
> FINALLY
> RTOS.UnlockHeap();
> END
> END RefPageMap;
>
383a428,458
> (* The inner-loop collector action is to pick a gray page and completely
> clean it (i.e., make its referents at least gray, so that the page
> becomes black). The current gray page, "impureCopy.page" is
> distinguished; it's the page that newly gray objects are copied to.
>
> To improve locality of referene in the new space, we keep the set of
> gray pages as a stack. This helps approximate a depth-first copy to
> newspace. The current page is not a member of the stack, but will
> become one when it becomes full. The current page is always the page
> that contains new.ptr.
>
> To reduce page faults, we separate the "pure" copy pages (those whose
> objects contain no REFs) from the "impure" ones (those with REFs). Only
> impure pages become gray, since pure pages can have no REFs into the old
> space (since they have no REFs at all). *)
>
> (* By analogy, we also maintain "pureCopy.page" and "pureCopy.stack". These
> are not used, but maintaining them simplifies the code. *)
>
> (* By analogy, we also maintain "new.page" and "new.stack". As with
> pureCopy.page and pureCopy.stack, these are not used, but maintaining them
> simplifies the code. *)
>
> TYPE
> AllocRec = RECORD
> ptr, boundary: RefHeader;
> page: Page := Nil; (* the current page *)
> stack: Page := Nil; (* threaded through the "link" field; ends at Nil *)
> db: RTDB.T;
> END;
>
385,386c460,461
< newPtr, newBoundary: RefHeader;
< (* memory in [newPtr, newBoundary) is available to AllocForNew *)
---
> new: AllocRec;
> (* memory in [new.ptr, new.boundary) is available to AllocForNew *)
388,389c463,468
< pureCopyPtr, pureCopyBoundary: RefHeader;
< (* memory in [pureCopyPtr, pureCopyBoundary) is available to AllocForCopy
---
> newTransient: AllocRec;
> (* memory in [newTransient.ptr, newTransient.boundary) is available to
> AllocForNewTransient *)
>
> pureCopy: AllocRec;
> (* memory in [pureCopy.ptr, pureCopy.boundary) is available to AllocForCopy
392,393c471,472
< impureCopyPtr, impureCopyBoundary: RefHeader;
< (* memory in [impureCopyPtr, impureCopyBoundary) is available to
---
> impureCopy: AllocRec;
> (* memory in [impureCopy.ptr, impureCopy.boundary) is available to
395a475,483
> pureTransientCopy: AllocRec;
> (* memory in [pureTransientCopy.ptr, pureTransientCopy.boundary) is available
> to AllocForCopy for pure objects (objects with no REFs) *)
>
> impureTransientCopy: AllocRec;
> (* memory in [impureTransientCopy.ptr, impureTransientCopy.boundary) is
> available to AllocForCopy for impure objects (objects with
> REFs) *)
>
417c505,525
< IF p + 1 < p1 AND desc[pi + 1].continued THEN
---
> IF map[pi] # NIL THEN
> (* if this is a persistent object, just promote the pages *)
> IF desc[pi].pure THEN
> PromotePage(
> p, Desc{space := Space.Current, generation := copyGeneration,
> pure := TRUE, note := Note.Persistent,
> gray := FALSE, access := desc[pi].access,
> continued := FALSE, resident := desc[pi].resident,
> dirty := FALSE});
> ELSE
> IF desc[pi].access # Access.ReadWrite THEN Unprotect(p) END;
> PromotePage(
> p, Desc{space := Space.Current, generation := copyGeneration,
> pure := FALSE, note := Note.Persistent,
> gray := TRUE, access := Access.ReadWrite,
> continued := FALSE, resident := TRUE,
> dirty := TRUE});
> desc[pi].link := impureCopy.stack;
> impureCopy.stack := p;
> END;
> ELSIF p + 1 < p1 AND desc[pi + 1].continued THEN
423,425c531,534
< p, Desc{space := Space.Current, generation := copyGeneration,
< pure := TRUE, note := Note.Large, gray := FALSE,
< protected := FALSE, continued := FALSE});
---
> p, Desc{space := Space.Current, generation := copyGeneration,
> pure := TRUE, note := Note.Large, gray := FALSE,
> access := Access.ReadWrite, continued := FALSE,
> resident := TRUE, dirty := FALSE});
428,432c537,548
< p, Desc{space := Space.Current, generation := copyGeneration,
< pure := FALSE, note := Note.Large, gray := TRUE,
< protected := FALSE, continued := FALSE});
< desc[pi].link := impureCopyStack;
< impureCopyStack := p;
---
> p, Desc{space := Space.Current, generation := copyGeneration,
> pure := FALSE, note := Note.Large, gray := TRUE,
> access := Access.ReadWrite, continued := FALSE,
> resident := TRUE, dirty := TRUE});
> IF def.traced = 1 THEN
> desc[pi].link := impureCopy.stack;
> impureCopy.stack := p;
> ELSE
> <*ASSERT def.traced = 3*>
> desc[pi].link := impureTransientCopy.stack;
> impureTransientCopy.stack := p;
> END;
446c562,571
< np := AllocForImpureCopy(dataSize, def.dataAlignment);
---
> IF def.traced = 1 THEN
> np := AllocForCopy(dataSize, def.dataAlignment,
> impureCopy,
> pure := FALSE);
> ELSE
> <* ASSERT def.traced = 3 *>
> np := AllocForCopy(dataSize, def.dataAlignment,
> impureTransientCopy,
> pure := FALSE);
> END
448,453c573,582
< np := AllocForPureCopy(dataSize, def.dataAlignment);
< END;
< VAR newHeader := HeaderOf(np);
< BEGIN
< RTMisc.Copy(
< oldHeader, newHeader, BYTESIZE(Header) + dataSize);
---
> IF def.traced = 1 THEN
> np := AllocForCopy(dataSize, def.dataAlignment,
> pureCopy,
> pure := TRUE);
> ELSE
> <* ASSERT def.traced = 3 *>
> np := AllocForCopy(dataSize, def.dataAlignment,
> pureTransientCopy,
> pure := TRUE);
> END
454a584
> RTMisc.Copy(oldHeader, HeaderOf(np), BYTESIZE(Header) + dataSize);
467a598,811
> TYPE TMover = RTHeapMap.Visitor OBJECT OVERRIDES apply := TMove END;
>
> PROCEDURE TMove (<*UNUSED*> self: TMover; cp: ADDRESS) =
> VAR
> refref := LOOPHOLE(cp, UNTRACED REF RefReferent);
> ref := refref^;
> BEGIN
> IF ref = NIL THEN RETURN; END;
> VAR p := ReferentToPage(ref);
> BEGIN
> IF p = Nil THEN RETURN; END;
> VAR
> pi := p - p0;
> oldHeader := HeaderOf(ref);
> BEGIN
> IF desc[pi].space # Space.Previous THEN
> RETURN; (* nothing to do *)
> END;
> IF p + 1 < p1 AND desc[pi + 1].continued THEN
> (* if this is a large object, just promote the pages *)
> VAR def := RTType.Get (oldHeader.typecode);
> BEGIN
> IF def.traced # 3 THEN RETURN END;
> <* ASSERT map[pi] = NIL *>
> IF (def.gc_map = NIL) AND (def.parent = NIL) THEN
> PromotePage(
> p, Desc{space := Space.Current, generation := copyGeneration,
> pure := TRUE, note := Note.Large, gray := FALSE,
> access := Access.ReadWrite, continued := FALSE,
> resident := TRUE, dirty := FALSE});
> ELSE
> PromotePage(
> p, Desc{space := Space.Current, generation := copyGeneration,
> pure := FALSE, note := Note.Large, gray := TRUE,
> access := Access.ReadWrite, continued := FALSE,
> resident := TRUE, dirty := TRUE});
> desc[pi].link := impureTransientCopy.stack;
> impureTransientCopy.stack := p;
> END;
> END;
> ELSIF oldHeader.forwarded THEN
> (* if already moved, just update the reference *)
> refref^ := LOOPHOLE(ref, UNTRACED REF RefReferent)^;
> ELSE
> (* move the object *)
> VAR
> def := RTType.Get(oldHeader.typecode);
> dataSize := ReferentSize(oldHeader);
> np : RefReferent;
> BEGIN
> IF def.traced # 3 THEN RETURN END;
> <* ASSERT map[pi] = NIL *>
> IF (def.gc_map # NIL) OR (def.parent # NIL) THEN
> np := AllocForCopy(dataSize, def.dataAlignment,
> impureTransientCopy,
> pure := FALSE);
> ELSE
> np := AllocForCopy(dataSize, def.dataAlignment,
> pureTransientCopy,
> pure := TRUE);
> END;
> RTMisc.Copy(oldHeader, HeaderOf(np), BYTESIZE(Header) + dataSize);
> IF def.nDimensions # 0 THEN
> (* open array: update the internal pointer *)
> LOOPHOLE(np, UNTRACED REF ADDRESS)^ := np + def.dataSize;
> END;
> oldHeader.forwarded := TRUE;
> LOOPHOLE(ref, UNTRACED REF RefReferent)^ := np;
> refref^ := np;
> END;
> END;
> END;
> END;
> END TMove;
>
> TYPE PMover = RTTypeMap.Visitor OBJECT
> db: RTDB.T
> OVERRIDES
> apply := PMove
> END;
>
> PROCEDURE PMove (self: PMover; cp: ADDRESS; k: RTTypeMap.Kind) =
> VAR
> refref := LOOPHOLE(cp, UNTRACED REF RefReferent);
> ref := refref^;
> text: TEXT;
> BEGIN
> IF ref = NIL THEN RETURN; END;
> <* ASSERT k = RTTypeMap.Kind.Ref *>
> VAR
> p := ReferentToPage(ref);
> oldHeader := HeaderOf(ref);
> BEGIN
> IF p = Nil THEN
> (* Must be statically allocated text constant. *)
> (* Get a copy in the heap *)
> <* ASSERT oldHeader.typecode = RT0.TextTypecode *>
> text := TextF.New(Text.Length(LOOPHOLE(ref, TEXT)));
> text^ := LOOPHOLE(ref, TEXT)^;
> (*
> text := NIL;
> self.db.mapText(LOOPHOLE(ref, TEXT), text);
> *)
> refref^ := LOOPHOLE(text, RefReferent);
> RETURN;
> END;
> VAR pi := p - p0;
> BEGIN
> IF desc[pi].space = Space.Current THEN
> IF map[pi] # NIL THEN
> (* check for cross file reference *)
> <* ASSERT self.db = map[pi].db *>
> ELSE
> (* page must be pinned by ambiguous root, make it persistent *)
> <* ASSERT desc[pi].note = Note.AmbiguousRoot *>
> VAR def := RTType.Get (oldHeader.typecode);
> BEGIN
> IF def.traced = 1 THEN
> WITH d = desc[pi] DO
> IF d.pure THEN
> d.link := pureCopy.stack;
> pureCopy.stack := p;
> ELSE
> d.link := impureCopy.stack;
> impureCopy.stack := p;
> END
> END;
> FOR i := 0 TO PageCount(p) - 1 DO
> VAR page := self.db.newPage();
> BEGIN
> map[pi + i] := page;
> page.p := p + i;
> page.lastReader := ThreadF.myTxn;
> page.writer := ThreadF.myTxn;
> WITH d = desc[pi + i] DO
> d.gray := TRUE;
> END;
> IF perfOn THEN PerfChange(p + i, 1); END;
> END
> END
> END
> END
> END;
> RETURN;
> END;
> <* ASSERT desc[pi].space = Space.Previous *>
> <* ASSERT map[pi] = NIL *>
> IF p + 1 < p1 AND desc[pi + 1].continued THEN
> (* if large, make persistent and promote to current space *)
> VAR def := RTType.Get (oldHeader.typecode);
> BEGIN
> IF def.traced = 1 THEN
> IF (def.gc_map = NIL) AND (def.parent = NIL) THEN
> PromotePage(
> p, Desc{space := Space.Current,
> generation := copyGeneration, pure := TRUE,
> note := Note.Large, gray := TRUE,
> access := Access.ReadWrite, continued := FALSE,
> resident := TRUE, dirty := FALSE});
> desc[pi].link := pureCopy.stack;
> pureCopy.stack := p;
> ELSE
> PromotePage(
> p, Desc{space := Space.Current,
> generation := copyGeneration, pure := FALSE,
> note := Note.Large, gray := TRUE,
> access := Access.ReadWrite, continued := FALSE,
> resident := TRUE, dirty := TRUE});
> desc[pi].link := impureCopy.stack;
> impureCopy.stack := p;
> END;
> FOR i := 0 TO PageCount(p) - 1 DO
> VAR page := self.db.newPage();
> BEGIN
> map[pi + i] := page;
> page.p := p + i;
> page.lastReader := ThreadF.myTxn;
> page.writer := ThreadF.myTxn;
> END
> END
> END
> END
> ELSIF oldHeader.forwarded THEN
> (* if already moved, just update the reference *)
> refref^ := LOOPHOLE(ref, UNTRACED REF RefReferent)^;
> ELSE
> (* move the object *)
> VAR
> def := RTType.Get(oldHeader.typecode);
> dataSize := ReferentSize(oldHeader);
> np : RefReferent;
> BEGIN
> IF def.traced # 1 THEN RETURN END;
> IF (def.gc_map = NIL) AND (def.parent = NIL) THEN
> np := AllocForCopy(dataSize, def.dataAlignment,
> pureCopy, pure := TRUE);
> ELSE
> np := AllocForCopy(dataSize, def.dataAlignment,
> impureCopy, pure := FALSE);
> END;
> RTMisc.Copy(oldHeader, HeaderOf(np), BYTESIZE(Header) + dataSize);
> IF def.nDimensions # 0 THEN
> (* open array: update the internal pointer *)
> LOOPHOLE(np, UNTRACED REF ADDRESS)^ := np + def.dataSize;
> END;
> oldHeader.forwarded := TRUE;
> LOOPHOLE(ref, UNTRACED REF RefReferent)^ := np;
> refref^ := np;
> END
> END
> END
> END
> END PMove;
>
513d856
< <* ASSERT desc[fp - p0].space = Space.Previous *>
516,518c859,864
< note := Note.AmbiguousRoot, gray :=
< FALSE, generation := copyGeneration,
< protected := FALSE, continued := FALSE});
---
> note := Note.AmbiguousRoot, gray := FALSE,
> generation := copyGeneration,
> access := desc[fp - p0].access,
> continued := FALSE,
> resident := desc[fp-p0].resident,
> dirty := FALSE});
519a866,868
> IF desc[fp - p0].access # Access.ReadWrite THEN
> Unprotect(fp);
> END;
521,525c870,877
< note := Note.AmbiguousRoot, gray :=
< TRUE, generation := copyGeneration,
< protected := FALSE, continued := FALSE});
< desc[fp - p0].link := impureCopyStack;
< impureCopyStack := fp;
---
> note := Note.AmbiguousRoot, gray := TRUE,
> generation := copyGeneration,
> access := Access.ReadWrite,
> continued := FALSE,
> resident := TRUE,
> dirty := TRUE});
> desc[fp - p0].link := impureTransientCopy.stack;
> impureTransientCopy.stack := fp;
572a925,979
> PROCEDURE Fill (VAR (*INOUT*) current: AllocRec) =
> BEGIN
> InsertFiller(current.ptr, current.boundary - current.ptr);
> current.page := Nil;
> current.stack := Nil;
> current.ptr := NIL;
> current.boundary := NIL;
> <* ASSERT current.db = NIL *>
> END Fill;
>
> PROCEDURE Close (VAR (*INOUT*) current: AllocRec; gray := FALSE) =
> VAR p := current.page;
> BEGIN
> InsertFiller(current.ptr, current.boundary - current.ptr);
> IF p # Nil THEN
> desc[p - p0].gray := gray;
> IF perfOn THEN PerfChange(p, 1); END;
> IF desc[p - p0].generation = Generation.Older AND NOT desc[p - p0].pure
> THEN
> <* ASSERT desc[p - p0].dirty *>
> <* ASSERT desc[p - p0].space = Space.Current *>
> <* ASSERT map[p - p0] = NIL OR map[p - p0].writer = ThreadF.myTxn *>
> desc[p - p0].dirty := FALSE;
> Protect(p, Access.ReadOnly);
> END;
> current.page := Nil;
> END;
> <* ASSERT current.stack = Nil *>
> current.ptr := NIL;
> current.boundary := NIL;
> END Close;
>
> PROCEDURE Push (VAR (*INOUT*) current: AllocRec; db: RTDB.T) =
> BEGIN
> IF current.db # db THEN
> IF current.page # Nil THEN
> InsertFiller(current.ptr, current.boundary - current.ptr);
> desc[current.page - p0].link := current.stack;
> current.stack := current.page;
> current.page := Nil;
> current.ptr := NIL;
> current.boundary := NIL;
> END;
> current.db := db;
> END;
> END Push;
>
> PROCEDURE SetDB (db: RTDB.T) =
> BEGIN
> pmover.db := db;
> Push(new, db);
> Push(pureCopy, db);
> Push(impureCopy, db);
> END SetDB;
>
599a1007,1617
> TYPE Unswizzler = RTHeapMap.Visitor OBJECT
> page: RTDB.Page;
> data: ADDRESS;
> OVERRIDES
> apply := Unswizzle
> END;
>
> PROCEDURE Unswizzle (self: Unswizzler; cp: ADDRESS) =
> VAR
> refref := LOOPHOLE(cp, UNTRACED REF RefReferent);
> ref := refref^;
> BEGIN
> IF ref = NIL THEN RETURN END;
> VAR
> p := Word.RightShift(LOOPHOLE(refref, INTEGER), LogBytesPerPage);
> pos := Word.And(LOOPHOLE(refref, INTEGER), BytesPerPage - 1);
> BEGIN
> IF p = self.page.p THEN
> LOOPHOLE(self.data + pos, UNTRACED REF RefReferent)^ :=
> UnswizzleRef(self.page.db, ref);
> END
> END;
> END Unswizzle;
>
> PROCEDURE UnswizzleRef (db: RTDB.T; ref: RefReferent): RefReferent =
> VAR p := ReferentToPage(ref);
> BEGIN
> IF p = Nil OR map[p - p0] = NIL THEN RETURN NIL END;
> VAR
> offset := ref - PageToAddress(p);
> targetDB := map[p - p0].db;
> nbPages := PageCount(p);
> page := map[p - p0];
> BEGIN
> <* ASSERT Word.And(offset, 3) = 0 *>
> <* ASSERT db = targetDB *>
> IF nbPages > 1 THEN
> CASE offset OF
> | 4 => offset := 2_0001;
> | 8 => offset := 2_0011;
> | 16 => offset := 2_0101;
> | 32 => offset := 2_0111;
> | 64 => offset := 2_1001;
> | 128 => offset := 2_1011;
> | 256 => offset := 2_1101;
> | 512 => offset := 2_1111;
> ELSE
> <* ASSERT FALSE *>
> END;
> IF nbPages >= Word.RightShift(BytesPerPage, 4) THEN
> nbPages := 0;
> ELSE
> nbPages := Word.LeftShift(nbPages, 4);
> END;
> INC(offset, nbPages);
> END;
> RETURN PageToAddress(page.id) + offset;
> END
> END UnswizzleRef;
>
> PROCEDURE UnswizzlePage(page: RTDB.Page; VAR data: RTHeapDep.PageData) =
> BEGIN
> ThreadF.SuspendOthers();
> VAR
> p := FirstPage(page.p);
> n := PageCount(p);
> d := ADR(data[0]);
> db := page.db;
> h := PageToHeader(p);
> he := PageToHeader(p+1);
> tc: Typecode;
> pos: INTEGER;
> referentSize: CARDINAL;
> def: TypeDefn;
> fpRef: REF Fingerprint.T;
> fpAdr: ADDRESS;
> BEGIN
> <* ASSERT desc[p - p0].space = Space.Current *>
> IF desc[p - p0].access = Access.None THEN
> <* ASSERT desc[p - p0].gray *>
> Unprotect(p);
> END;
> data := PageToData(page.p)^;
>
> unswizzler.page := page;
> unswizzler.data := d;
> IF n = 1 THEN
> WHILE h < he DO
> <* ASSERT NOT h.forwarded *>
> p := Word.RightShift(LOOPHOLE(h, INTEGER), LogBytesPerPage);
> pos := Word.And(LOOPHOLE(h, INTEGER), BytesPerPage - 1);
> tc := h.typecode;
> IF tc = Fill_1_type THEN
> LOOPHOLE(d + pos, UNTRACED REF ADDRESS)^ := LOOPHOLE(0, ADDRESS);
> referentSize := 0;
> ELSIF tc = Fill_N_type THEN
> LOOPHOLE(d + pos, UNTRACED REF ADDRESS)^ := LOOPHOLE(1, ADDRESS);
> referentSize := LOOPHOLE(h + ADRSIZE(Header), UNTRACED REF INTEGER)^;
> DEC(referentSize, ADRSIZE(Header));
> ELSE
> def := RTType.Get(tc);
> <* ASSERT def.traced = 1 *>
> fpRef := NIL;
> fpAdr := NIL;
> db.mapFP(LOOPHOLE(def.fp, Fingerprint.T), fpRef, fpAdr);
> IF fpAdr = NIL THEN
> <* ASSERT fpRef # NIL *>
> fpAdr := UnswizzleRef(db, LOOPHOLE(fpRef, RefReferent));
> db.mapFP(LOOPHOLE(def.fp, Fingerprint.T), fpRef, fpAdr);
> END;
> LOOPHOLE(d + pos, UNTRACED REF ADDRESS)^ := fpAdr;
> IF def.nDimensions = 0 THEN
> referentSize := def.dataSize;
> ELSE
> referentSize := OpenArraySize(h, def);
> END;
> IF stats.print AND desc[p - p0].note # Note.Persistent THEN
> WITH z = stats.objects[tc] DO z := Word.Plus(z, 1); END;
> WITH z = stats.bytes[tc] DO
> z := Word.Plus(z, BYTESIZE(Header) + referentSize)
> END;
> END;
> IF def.gc_map # NIL OR def.parent # NIL THEN
> RTHeapMap.DoWalkRef(def, h + ADRSIZE(Header), unswizzler);
> END
> END;
> INC(h, ADRSIZE(Header) + referentSize);
> END
> ELSE
> WHILE h < he DO
> <* ASSERT NOT h.forwarded *>
> p := Word.RightShift(LOOPHOLE(h, INTEGER), LogBytesPerPage);
> pos := Word.And(LOOPHOLE(h, INTEGER), BytesPerPage - 1);
> tc := h.typecode;
> IF tc = Fill_1_type THEN
> IF p = page.p THEN
> LOOPHOLE(d + pos, UNTRACED REF ADDRESS)^ := LOOPHOLE(0, ADDRESS);
> END;
> referentSize := 0;
> ELSIF tc = Fill_N_type THEN
> IF p = page.p THEN
> LOOPHOLE(d + pos, UNTRACED REF ADDRESS)^ := LOOPHOLE(1, ADDRESS);
> END;
> referentSize :=
> LOOPHOLE(h + ADRSIZE(Header), UNTRACED REF INTEGER)^;
> DEC(referentSize, ADRSIZE(Header));
> ELSE
> def := RTType.Get(tc);
> <* ASSERT def.traced = 1 *>
> IF p = page.p THEN
> fpRef := NIL;
> fpAdr := NIL;
> db.mapFP(LOOPHOLE(def.fp, Fingerprint.T), fpRef, fpAdr);
> IF fpAdr = NIL THEN
> <* ASSERT fpRef # NIL *>
> fpAdr := UnswizzleRef(db, LOOPHOLE(fpRef, RefReferent));
> db.mapFP(LOOPHOLE(def.fp, Fingerprint.T), fpRef, fpAdr);
> END;
> LOOPHOLE(d + pos, UNTRACED REF ADDRESS)^ := fpAdr;
> END;
> IF def.nDimensions = 0 THEN
> referentSize := def.dataSize;
> ELSE
> referentSize := OpenArraySize(h, def);
> END;
> IF stats.print AND desc[p - p0].note # Note.Persistent THEN
> WITH z = stats.objects[tc] DO z := Word.Plus(z, 1); END;
> WITH z = stats.bytes[tc] DO
> z := Word.Plus(z, BYTESIZE(Header) + referentSize)
> END
> END;
> IF def.gc_map # NIL OR def.parent # NIL THEN
> RTHeapMap.DoWalkRef(def, h + ADRSIZE(Header), unswizzler);
> END
> END;
> INC(h, ADRSIZE(Header) + referentSize);
> END
> END;
>
> p := FirstPage(page.p);
> IF desc[p - p0].gray THEN
> Protect(p, Access.None);
> END
> END;
> ThreadF.ResumeOthers();
> END UnswizzlePage;
>
> PROCEDURE Stabilize (bootstrapDB: RTDB.T) =
> BEGIN
> (* compute some costs relative to previous collection *)
> INC(cycleNews, smallNewPages + largeNewPages);
> VAR prefixAvgCost := cycleCost / FLOAT(cycleNews);
> BEGIN
> IF prefixAvgCost < minPrefixAvgCost THEN
> minPrefixAvgCost := prefixAvgCost;
> minCycleL := cycleL;
> END;
> END;
>
> (* we want to do full collection *)
> copyGeneration := Generation.Younger;
> partialCollection := FALSE;
> partialCollectionNext := TRUE;
>
> (* not partial collection *)
> cycleL := 1;
> cycleCost := 0.0;
> cycleNews := 0;
> minPrefixAvgCost := LAST(REAL);
> minCycleL := 0;
>
> InvokeMonitors (before := TRUE);
>
> IF perfOn THEN PerfBegin(); END;
>
> (* fill the rest of the current page *)
> Fill(new);
> Fill(newTransient);
>
> INC(collections);
>
> (* flip spaces; newspace becomes oldspace *)
> FOR p := p0 TO p1 - 1 DO
> IF desc[p - p0].space = Space.Current THEN
> desc[p - p0].space := Space.Previous;
> IF perfOn THEN PerfChange(p, 1); END;
> END;
> END;
>
> IF perfOn THEN PerfFlip(); END;
>
> (* The 'new' nextSpace is empty *)
> smallNewPages := 0;
> largeNewPages := 0;
> smallCopyPages := 0;
> largeCopyPages := 0;
> smallPromotionPages := 0;
> largePromotionPages := 0;
>
> FOR p := p0 TO p1 - 1 DO
> VAR d := desc[p - p0];
> BEGIN
> IF d.space = Space.Previous AND NOT d.continued THEN
> IF map[p - p0] # NIL THEN
> (* Promote ALL persistent pages: stabilize may trigger faults
> when accessing meta-data, which may swizzle references to
> previously unreachable pages, so we need to make sure these
> pages are retained. Also, updates to persistent pages during
> closure copying need to be captured when unswizzling. *)
> IF d.resident AND map[p - p0].writer # NIL THEN
> IF d.access # Access.ReadWrite THEN Unprotect(p) END;
> IF d.pure THEN
> PromotePage(
> p, Desc{space := Space.Current,
> generation := copyGeneration,
> pure := TRUE, note := Note.Persistent,
> gray := TRUE, access := Access.ReadWrite,
> continued := FALSE, resident := TRUE,
> dirty := FALSE});
> desc[p - p0].link := pureCopy.stack;
> pureCopy.stack := p;
> ELSE
> PromotePage(
> p, Desc{space := Space.Current,
> generation := copyGeneration,
> pure := FALSE, note := Note.Persistent,
> gray := TRUE, access := Access.ReadWrite,
> continued := FALSE, resident := TRUE,
> dirty := TRUE});
> desc[p - p0].link := impureCopy.stack;
> impureCopy.stack := p;
> END
> ELSE
> <* ASSERT d.access # Access.ReadWrite *>
> PromotePage(
> p, Desc{space := Space.Current, generation := copyGeneration,
> pure := d.pure, note := Note.Persistent,
> gray := NOT d.pure, access := d.access,
> continued := FALSE, resident := d.resident,
> dirty := FALSE});
> END
> ELSE
> (* non-persistent page *)
> <* ASSERT d.access # Access.None *>
> IF d.generation = Generation.Older THEN
> IF d.access # Access.ReadWrite THEN Unprotect(p) END;
> ELSE
> <* ASSERT d.access = Access.ReadWrite *>
> END
> END
> END
> END
> END;
>
> (* get these in the new space *)
> mover := NEW (Mover);
> unswizzler := NEW (Unswizzler);
> tmover := NEW (TMover);
> pmover := NEW (PMover);
>
> (* mark from roots *)
> ThreadF.SuspendOthers();
> BEGIN
> (* Examine the stacks for possible pointers *)
> ThreadF.ProcessStacks(NoteStackLocations);
>
> <* ASSERT impureTransientCopy.page = Nil *>
> <* ASSERT impureTransientCopy.ptr = NIL *>
> <* ASSERT impureTransientCopy.boundary = NIL *>
>
> <* ASSERT pureTransientCopy.page = Nil *>
> <* ASSERT pureTransientCopy.stack = Nil *>
> <* ASSERT pureTransientCopy.ptr = NIL *>
> <* ASSERT pureTransientCopy.boundary = NIL *>
>
> <* ASSERT impureCopy.page = Nil *>
> <* ASSERT impureCopy.ptr = NIL *>
> <* ASSERT impureCopy.boundary = NIL *>
>
> <* ASSERT pureCopy.page = Nil *>
> <* ASSERT pureCopy.ptr = NIL *>
> <* ASSERT pureCopy.boundary = NIL *>
>
> (* fill current page in preparation for persistent allocations *)
> Fill(new);
>
> (* Create root if this is a new database *)
> IF bootstrapDB # NIL THEN
> SetDB(bootstrapDB);
> bootstrapDB.createRoot();
> WITH ref = LOOPHOLE(bootstrapDB.root, RefReferent) DO
> bootstrapDB.newId(map[ReferentToPage(ref) - p0]);
> END;
> SetDB(NIL);
> END;
>
> (* Copy transient closure from globals and user-level page handles,
> since we may need them to access the database when unswizzling *)
> RTHeapMap.WalkGlobals(tmover);
> FOR p := p0 TO p1 - 1 DO
> WITH m = map[p - p0] DO
> IF m # NIL THEN
> TMove (NIL, ADR(m));
> END
> END
> END;
> WHILE CleanSome(impureTransientCopy, CleanTransient, gray:= TRUE) DO END;
> Close(impureTransientCopy, gray := TRUE);
> tmover := NIL;
>
> (* Copy persistence closure *)
> WHILE CleanSome(impureCopy, CleanPersistent, gray := TRUE) DO END;
> Close(impureCopy, gray := TRUE);
>
> (* now allocate metadata for pure pages *)
> WHILE CleanSome(pureCopy, CleanPersistent) DO END;
> Close(pureCopy);
>
> (* now the metadata itself *)
> WHILE CleanSome(new, CleanPersistent) DO END;
> Close(new);
>
> <* ASSERT impureTransientCopy.stack = Nil *>
> <* ASSERT impureTransientCopy.page = Nil *>
> <* ASSERT impureTransientCopy.ptr = NIL *>
> <* ASSERT impureTransientCopy.boundary = NIL *>
>
> <* ASSERT impureCopy.stack = Nil *>
> <* ASSERT impureCopy.page = Nil *>
> <* ASSERT impureCopy.ptr = NIL *>
> <* ASSERT impureCopy.boundary = NIL *>
>
> <* ASSERT pureCopy.page = Nil *>
> <* ASSERT pureCopy.stack = Nil *>
> <* ASSERT pureCopy.ptr = NIL *>
> <* ASSERT pureCopy.boundary = NIL *>
>
> SetDB(NIL);
> pmover := NIL;
>
> (* All modified persistent pages are in Space.Current *)
> FOR i := 0 TO p1 - p0 - 1 DO
> VAR d := desc[i];
> BEGIN
> IF d.space = Space.Current AND NOT d.continued THEN
> IF d.resident THEN
> IF map[i] # NIL THEN
> IF map[i].writer = ThreadF.myTxn THEN
> <* ASSERT d.access = Access.ReadWrite *>
> VAR p := p0 + i;
> BEGIN
> IF d.note = Note.AmbiguousRoot AND stats.print THEN
> INC(stats.ambiguousPages, PageCount(p));
> ELSIF d.note # Note.Persistent AND stats.print THEN
> INC(stats.accuratePages, PageCount(p));
> END;
> END
> END;
> IF d.gray THEN
> <* ASSERT d.resident AND NOT d.pure *>
> d.link := impureCopy.stack;
> desc[i] := d;
> impureCopy.stack := p0 + i;
> ELSIF ThreadF.myTxn # NIL AND map[i] # NIL THEN
> IF map[i].lastReader = ThreadF.myTxn THEN
> Protect(p0 + i, Access.ReadOnly);
> ELSIF map[i].writer # ThreadF.myTxn THEN
> Protect(p0 + i, Access.None);
> END
> END
> ELSIF d.gray THEN
> <* ASSERT d.resident AND NOT d.pure *>
> d.link := impureTransientCopy.stack;
> desc[i] := d;
> impureTransientCopy.stack := p0 + i;
> END
> ELSE
> <* ASSERT d.pure AND d.access = Access.None *>
> END
> END
> END
> END;
>
> IF stats.print THEN
> PutText("\nAccurate pages: "); PutInt(stats.accuratePages);
> PutText("\nAmbiguous pages: "); PutInt(stats.ambiguousPages);
> PutText("\n");
> stats.accuratePages := 0; stats.ambiguousPages := 0;
> FOR i := 0 TO RT0u.nTypes - 1 DO
> IF stats.objects[i] # 0 THEN
> VAR t := RTType.Get(i);
> str: ADDRESS := t.name;
> BEGIN
> IF str # NIL THEN
> PutChars(str, Cstring.strlen(str));
> ELSE
> PutText("");
> END;
> END;
> PutText(": ");
> PutInt(stats.objects[i]); PutText(" objects ");
> PutInt(stats.bytes[i]); PutText(" bytes\n");
> stats.objects[i] := 0;
> stats.bytes[i] := 0;
> END
> END;
> RTIO.Flush();
> END;
>
> WHILE CleanSome(impureTransientCopy) DO END;
> Close(impureTransientCopy);
>
> (* Examine the global variables for possible pointers *)
> RTHeapMap.WalkGlobals (mover);
> END;
> ThreadF.ResumeOthers();
>
> IF perfOn THEN PerfPromotedRoots(); END;
>
> collectorState := CollectorState.One;
> IF backgroundWaiting THEN signalBackground := TRUE END;
> END Stabilize;
>
> PROCEDURE Transfer(from: RTTxn.T; to: RTTxn.T) =
> BEGIN
> <* ASSERT to # NIL *>
> <* ASSERT from # to *>
> FOR i := 0 TO p1 - p0 - 1 DO
> VAR d := desc[i];
> BEGIN
> IF NOT d.continued THEN
> IF d.space = Space.Current OR d.space = Space.Previous THEN
> IF d.resident THEN
> IF map[i] # NIL THEN
> IF d.gray THEN
> <* ASSERT d.access = Access.None *>
> ELSIF map[i].writer = to THEN
> IF d.generation = Generation.Older THEN
> <* ASSERT d.space = Space.Current *>
> IF (d.dirty OR d.pure) AND d.access # Access.ReadWrite
> THEN
> Unprotect(p0 + i);
> ELSIF d.access = Access.None THEN
> Protect(p0 + i, Access.ReadOnly);
> END
> ELSIF d.access # Access.ReadWrite THEN
> Unprotect(p0 + i);
> END
> ELSIF d.access = Access.None AND map[i].lastReader = to THEN
> Protect(p0 + i, Access.ReadOnly);
> ELSIF d.access # Access.None THEN
> Protect(p0 + i, Access.None);
> END
> END
> ELSE
> <* ASSERT d.pure AND d.access = Access.None AND NOT d.gray *>
> END
> END
> END
> END
> END
> END Transfer;
>
> PROCEDURE Abort() =
> BEGIN
> FOR p := p0 TO p1 - 1 DO
> VAR
> pi := p - p0;
> d := desc[pi];
> BEGIN
> IF NOT d.continued THEN
> IF d.space = Space.Current OR d.space = Space.Previous THEN
> IF d.resident THEN
> IF map[pi] # NIL THEN
> IF map[pi].writer = ThreadF.myTxn THEN
> d.dirty := FALSE;
> d.resident := FALSE;
> d.gray := FALSE;
> d.pure := TRUE;
> desc[pi] := d;
> d.continued := TRUE;
> FOR i := 1 TO PageCount(p) - 1 DO
> desc[pi + i] := d;
> END;
> Protect(p, Access.None);
> ELSIF map[pi].lastReader = ThreadF.myTxn THEN
> Protect(p, Access.None);
> END
> END
> ELSE
> <* ASSERT d.pure AND d.access = Access.None AND NOT d.gray *>
> END
> END
> END
> END
> END
> END Abort;
>
> PROCEDURE Flush (db: RTDB.T)
> RAISES { Disabled, Thread.Aborted } =
> VAR page: RTDB.Page;
> BEGIN
> RTOS.LockHeap();
> IF disableCount + disableMotionCount > 0 THEN
> RTOS.UnlockHeap();
> RAISE Disabled;
> END;
> BEGIN
> CollectorOn();
> WHILE collectorState # CollectorState.Zero DO CollectSome(); END;
> Stabilize(db);
> IF NOT (incremental AND RTHeapDep.VM AND disableVMCount = 0) THEN
> REPEAT CollectSome(); UNTIL collectorState = CollectorState.Zero;
> END;
> CollectorOff();
> END;
> RTOS.UnlockHeap();
> DisableMotion();
> (* First pass to assign IDs *)
> FOR p := p0 TO p1 - 1 DO (* race here is OK *)
> RTOS.LockHeap();
> page := map[p - p0];
> RTOS.UnlockHeap();
> IF page # NIL AND page.id = Nil THEN page.db.newId(page); END
> END;
> (* Second pass to unswizzle *)
> FOR p := p0 TO p1 - 1 DO (* race here is OK *)
> RTOS.LockHeap();
> VAR
> d := desc[p - p0];
> BEGIN
> IF NOT d.continued THEN
> IF d.resident THEN
> page := map[p - p0];
> IF page # NIL AND page.writer = ThreadF.myTxn THEN
> TRY
> RTOS.UnlockHeap();
> Thread.Acquire(page);
> page.write(UnswizzlePage);
> FINALLY
> Thread.Release(page);
> RTOS.LockHeap();
> END;
> FOR i := 1 TO PageCount(p) - 1 DO
> page := map[p - p0 + i];
> TRY
> RTOS.UnlockHeap();
> Thread.Acquire(page);
> page.write(UnswizzlePage);
> FINALLY
> Thread.Release(page);
> RTOS.LockHeap();
> END
> END;
> FOR i := 0 TO PageCount(p) - 1 DO
> page := map[p - p0 + i];
> <* ASSERT page.writer = ThreadF.myTxn *>
> page.writer := NIL;
> END;
> IF NOT desc[p - p0].gray THEN
> Protect(p, Access.ReadOnly);
> END
> END
> END
> END
> END;
> RTOS.UnlockHeap();
> END;
> EnableMotion();
> END Flush;
>
646,649c1664,1672
< IF impureCopyPage # Nil THEN
< <* ASSERT desc[impureCopyPage - p0].gray *>
< <* ASSERT desc[impureCopyPage - p0].protected *>
< Unprotect(impureCopyPage);
---
> IF impureCopy.page # Nil THEN
> <* ASSERT desc[impureCopy.page - p0].gray *>
> <* ASSERT desc[impureCopy.page - p0].access = Access.None *>
> Unprotect(impureCopy.page);
> END;
> IF impureTransientCopy.page # Nil THEN
> <* ASSERT desc[impureTransientCopy.page - p0].gray *>
> <* ASSERT desc[impureTransientCopy.page - p0].access = Access.None *>
> Unprotect(impureTransientCopy.page);
657,660c1680,1692
< IF impureCopyPage # Nil THEN
< <* ASSERT desc[impureCopyPage - p0].gray *>
< <* ASSERT NOT desc[impureCopyPage - p0].protected *>
< Protect(impureCopyPage, readable := FALSE, writable := FALSE);
---
> IF impureCopy.page # Nil THEN
> <* ASSERT desc[impureCopy.page - p0].gray *>
> <* ASSERT desc[impureCopy.page - p0].access = Access.ReadWrite *>
> Protect(impureCopy.page, Access.None);
> END;
> VAR p := impureCopy.stack;
> BEGIN
> WHILE p # Nil DO
> IF desc[p - p0].gray AND desc[p - p0].access # Access.None THEN
> Protect(p, Access.None);
> END;
> p := desc[p - p0].link;
> END;
662c1694,1699
< VAR p := impureCopyStack;
---
> IF impureTransientCopy.page # Nil THEN
> <*ASSERT desc[impureTransientCopy.page - p0].gray *>
> <*ASSERT desc[impureTransientCopy.page - p0].access = Access.ReadWrite *>
> Protect(impureTransientCopy.page, Access.None);
> END;
> VAR p := impureTransientCopy.stack;
665,666c1702,1703
< IF desc[p - p0].gray AND NOT desc[p - p0].protected THEN
< Protect(p, readable := FALSE, writable := FALSE);
---
> IF desc[p - p0].gray AND desc[p - p0].access # Access.None THEN
> Protect(p, Access.None);
705a1743,1745
> tmover : TMover := NIL;
> pmover : PMover := NIL;
> unswizzler : Unswizzler := NIL;
759,763c1799,1800
< InsertFiller(newPtr, newBoundary - newPtr);
< newPage := Nil;
< newStack := Nil;
< newPtr := NIL;
< newBoundary := NIL;
---
> Fill(new);
> Fill(newTransient);
786,798c1823,1831
< IF desc[p - p0].space = Space.Previous
< AND NOT desc[p - p0].continued THEN
< IF desc[p - p0].generation = Generation.Older THEN
< IF partialCollection THEN
< <* ASSERT copyGeneration = Generation.Older *>
< IF desc[p - p0].protected THEN
< <* ASSERT NOT desc[p - p0].pure *>
< PromotePage(p, Desc{space := Space.Current, generation :=
< copyGeneration, pure := FALSE, note :=
< Note.OlderGeneration, gray := FALSE,
< protected := TRUE, continued := FALSE});
< ELSE
< IF desc[p - p0].pure THEN
---
> VAR d := desc[p - p0];
> BEGIN
> IF d.space = Space.Previous AND NOT d.continued THEN
> IF map[p - p0] # NIL THEN
> (* persistent page *)
> IF d.resident AND map[p - p0].writer # NIL THEN
> (* promote modified persistent pages to avoid deleting them *)
> IF d.pure OR partialCollection AND NOT d.dirty THEN
> <* ASSERT NOT d.dirty *>
800,804c1833,1839
< p, Desc{space := Space.Current, generation :=
< copyGeneration, pure := TRUE, note :=
< Note.OlderGeneration, gray := FALSE, protected :=
< FALSE, continued := FALSE});
< ELSE
---
> p, Desc{space := Space.Current,
> generation := copyGeneration, pure := d.pure,
> note := Note.Persistent, gray := FALSE,
> access := d.access, continued := FALSE,
> resident := TRUE, dirty := FALSE});
> ELSE (* impure, neither partial collection nor clean *)
> IF d.access # Access.ReadWrite THEN Unprotect(p) END;
806,813c1841,1880
< p, Desc{space := Space.Current, generation :=
< copyGeneration, pure := FALSE, note :=
< Note.OlderGeneration, gray := TRUE, protected :=
< FALSE, continued := FALSE});
< desc[p - p0].link := impureCopyStack;
< impureCopyStack := p;
< END;
< END;
---
> p, Desc{space := Space.Current,
> generation := copyGeneration, pure := FALSE,
> note := Note.Persistent, gray := TRUE,
> access := Access.ReadWrite, continued := FALSE,
> resident := TRUE, dirty := TRUE});
> desc[p - p0].link := impureCopy.stack;
> impureCopy.stack := p;
> END
> ELSIF d.generation = Generation.Older THEN
> IF partialCollection THEN
> <* ASSERT copyGeneration = Generation.Older *>
> IF d.pure THEN
> PromotePage(
> p, Desc{space := Space.Current,
> generation := copyGeneration, pure := TRUE,
> note := Note.OlderGeneration, gray := FALSE,
> access := d.access, continued := FALSE,
> resident := d.resident, dirty := FALSE});
> ELSIF d.dirty THEN
> <* ASSERT d.resident *>
> IF d.access # Access.ReadWrite THEN Unprotect(p) END;
> PromotePage(
> p, Desc{space := Space.Current,
> generation := copyGeneration, pure := FALSE,
> note := Note.OlderGeneration, gray := TRUE,
> access := Access.ReadWrite, continued := FALSE,
> resident := TRUE, dirty := TRUE});
> desc[p - p0].link := impureCopy.stack;
> impureCopy.stack := p;
> ELSE
> <* ASSERT d.access # Access.ReadWrite *>
> PromotePage(
> p, Desc{space := Space.Current,
> generation := copyGeneration, pure := FALSE,
> note := Note.OlderGeneration, gray := FALSE,
> access := d.access, continued := FALSE,
> resident := d.resident, dirty := FALSE});
> END
> END
> END
815,820c1882,1924
< IF desc[p - p0].protected THEN Unprotect(p); END;
< END;
< ELSE
< <* ASSERT NOT desc[p - p0].protected *>
< END;
< END;
---
> (* non-persistent page *)
> IF d.generation = Generation.Older THEN
> IF partialCollection THEN
> <* ASSERT copyGeneration = Generation.Older *>
> IF d.pure THEN
> <* ASSERT d.access = Access.ReadWrite *>
> PromotePage(
> p, Desc{space := Space.Current,
> generation := copyGeneration,
> pure := TRUE, note := Note.OlderGeneration,
> gray := FALSE, access := Access.ReadWrite,
> continued := FALSE, resident := TRUE,
> dirty := FALSE});
> ELSIF d.dirty THEN
> <* ASSERT d.access = Access.ReadWrite *>
> PromotePage(
> p, Desc{space := Space.Current,
> generation := copyGeneration,
> pure := FALSE, note := Note.OlderGeneration,
> gray := TRUE, access := Access.ReadWrite,
> continued := FALSE, resident := TRUE,
> dirty := TRUE});
> desc[p - p0].link := impureCopy.stack;
> impureCopy.stack := p;
> ELSE
> <* ASSERT d.access = Access.ReadOnly *>
> PromotePage(
> p, Desc{space := Space.Current,
> generation := copyGeneration,
> pure := FALSE, note := Note.OlderGeneration,
> gray := FALSE, access := Access.ReadOnly,
> continued := FALSE, resident := TRUE,
> dirty := FALSE});
> END
> ELSE
> IF d.access # Access.ReadWrite THEN Unprotect(p) END;
> END
> ELSE
> <* ASSERT d.access = Access.ReadWrite *>
> END
> END
> END
> END
825c1929,1931
< mover := NEW (Mover); (* get one in the new space *)
---
> (* get these in the new space *)
> mover := NEW (Mover);
> tmover := NEW(TMover);
832a1939,1950
> (* Copy closure from user-level page handles,
> since we need page information during GC, but drop roots *)
> FOR p := p0 TO p1 - 1 DO
> WITH m = map[p - p0] DO
> IF m # NIL THEN
> m.db.root := NIL;
> Move (NIL, ADR(m));
> END
> END
> END;
> WHILE CopySome() DO END;
>
870a1989,2015
> (* That's the last chance for unmodified persistent pages since
> they may contain WRNNC objects that are about to get finalized.
> Thus, we now unmap them so swizzling can't resurrect them. *)
> ThreadF.SuspendOthers();
> BEGIN
> FOR i := 0 TO p1 - p0 - 1 DO
> VAR
> d := desc[i];
> page := map[i];
> BEGIN
> IF d.space = Space.Previous AND page # NIL THEN
> IF NOT d.continued THEN
> <* ASSERT d.access # Access.ReadWrite *>
> <* ASSERT NOT d.resident OR map[i].writer = NIL *>
> Unprotect(p0 + i);
> END;
> (* unmap pages *)
> page.db.unmapPage(page.id);
> page.p := Nil;
> map[i] := NIL;
> IF perfOn THEN PerfChange(p0 + i, 1); END;
> END
> END
> END
> END;
> ThreadF.ResumeOthers();
>
893c2038
< <* ASSERT NOT desc[i].protected *>
---
> <* ASSERT desc[i].access = Access.ReadWrite *>
901,918c2046,2049
< InsertFiller(pureCopyPtr, pureCopyBoundary - pureCopyPtr);
< InsertFiller(impureCopyPtr, impureCopyBoundary - impureCopyPtr);
< IF impureCopyPage # Nil THEN
< desc[impureCopyPage - p0].gray := FALSE;
< IF perfOn THEN PerfChange(impureCopyPage, 1); END;
< IF desc[impureCopyPage - p0].generation = Generation.Older THEN
< <* ASSERT desc[impureCopyPage - p0].space = Space.Current *>
< Protect(impureCopyPage, readable := TRUE, writable := FALSE);
< END;
< impureCopyPage := Nil;
< END;
< <* ASSERT impureCopyStack = Nil *>
< pureCopyPage := Nil;
< pureCopyStack := Nil;
< impureCopyPtr := NIL;
< impureCopyBoundary := NIL;
< pureCopyPtr := NIL;
< pureCopyBoundary := NIL;
---
> Close(impureCopy);
> Close(impureTransientCopy);
> Fill(pureCopy);
> Fill(pureTransientCopy);
949c2080,2263
< PROCEDURE CopySome (): BOOLEAN =
---
> PROCEDURE CopySome (): BOOLEAN =
> VAR
> originalPage := impureCopy.page;
> originalBoundary := impureCopy.boundary;
> cleanTo := PageToHeader(impureCopy.page);
> originalTransientPage := impureTransientCopy.page;
> originalTransientBoundary := impureTransientCopy.boundary;
> cleanTransientTo := PageToHeader(impureTransientCopy.page);
> p: Page;
> BEGIN
> LOOP
> IF cleanTo < impureCopy.ptr THEN
> VAR ptr := impureCopy.ptr;
> BEGIN
> CleanBetween(cleanTo, ptr);
> cleanTo := ptr;
> END;
> ELSIF cleanTransientTo < impureTransientCopy.ptr THEN
> VAR ptr := impureTransientCopy.ptr;
> BEGIN
> CleanBetween(cleanTransientTo, ptr);
> cleanTransientTo := ptr;
> END;
> ELSE
> IF impureCopy.stack = Nil AND impureTransientCopy.stack = Nil THEN
> RETURN FALSE;
> END;
>
> p := impureCopy.stack;
> IF p # Nil THEN
> impureCopy.stack := desc[p - p0].link;
> IF desc[p - p0].gray THEN
> <* ASSERT desc[p - p0].resident *>
> IF desc[p - p0].access # Access.ReadWrite THEN Unprotect(p); END;
> CleanBetween(PageToHeader(p), PageToHeader(p + 1));
> FOR i := 0 TO PageCount(p) - 1 DO
> desc[p + i - p0].gray := FALSE;
> desc[p + i - p0].dirty := FALSE;
> END;
> IF perfOn THEN PerfChange(p, PageCount(p)) END;
> IF ThreadF.myTxn = NIL
> OR map[p - p0] = NIL
> OR map[p - p0].writer = ThreadF.myTxn
> THEN
> IF desc[p - p0].generation = Generation.Older THEN
> <* ASSERT desc[p - p0].space = Space.Current *>
> Protect(p, Access.ReadOnly);
> END
> ELSIF map[p - p0].lastReader = ThreadF.myTxn THEN
> Protect(p, Access.ReadOnly);
> ELSE
> Protect(p, Access.None);
> END;
> END;
> END;
>
> p := impureTransientCopy.stack;
> IF p # Nil THEN
> impureTransientCopy.stack := desc[p - p0].link;
> IF desc[p - p0].gray THEN
> <* ASSERT desc[p - p0].resident *>
> IF desc[p - p0].access # Access.ReadWrite THEN Unprotect(p); END;
> CleanBetween(PageToHeader(p), PageToHeader(p + 1));
> FOR i := 0 TO PageCount(p) - 1 DO
> desc[p + i - p0].gray := FALSE;
> desc[p + i - p0].dirty := FALSE;
> END;
> IF perfOn THEN PerfChange(p, PageCount(p)) END;
> IF ThreadF.myTxn = NIL
> OR map[p - p0] = NIL
> OR map[p - p0].writer = ThreadF.myTxn
> THEN
> IF desc[p - p0].generation = Generation.Older THEN
> <* ASSERT desc[p - p0].space = Space.Current *>
> Protect(p, Access.ReadOnly);
> END
> ELSIF map[p - p0].lastReader = ThreadF.myTxn THEN
> Protect(p, Access.ReadOnly);
> ELSE
> Protect(p, Access.None);
> END
> END
> END;
>
> END;
> IF impureCopy.page # originalPage
> OR impureTransientCopy.page # originalTransientPage THEN EXIT; END;
> END;
>
> p := originalPage;
> IF p # Nil AND p # impureCopy.page AND desc[p - p0].gray THEN
> (* originalPage is now in the stack; mark it not gray *)
> CleanBetween(cleanTo, originalBoundary);
> desc[p - p0].gray := FALSE;
> desc[p - p0].dirty := FALSE;
> IF perfOn THEN PerfChange(p, 1) END;
> IF ThreadF.myTxn = NIL
> OR map[p - p0] = NIL
> OR map[p - p0].writer = ThreadF.myTxn
> THEN
> IF desc[p - p0].generation = Generation.Older THEN
> <* ASSERT desc[p - p0].space = Space.Current *>
> Protect(p, Access.ReadOnly);
> END
> ELSIF map[p - p0].lastReader = ThreadF.myTxn THEN
> Protect(p, Access.ReadOnly);
> ELSE
> Protect(p, Access.None);
> END;
>
> p := originalTransientPage;
> IF p # Nil AND p # impureTransientCopy.page AND desc[p - p0].gray THEN
> (* originalTransientPage is now in the stack; mark it not gray *)
> CleanBetween(cleanTransientTo, originalTransientBoundary);
> desc[p - p0].gray := FALSE;
> desc[p - p0].dirty := FALSE;
> IF perfOn THEN PerfChange(p, 1) END;
> IF ThreadF.myTxn = NIL
> OR map[p - p0] = NIL
> OR map[p - p0].writer = ThreadF.myTxn
> THEN
> IF desc[p - p0].generation = Generation.Older THEN
> <* ASSERT desc[p - p0].space = Space.Current *>
> Protect(p, Access.ReadOnly);
> END
> ELSIF map[p - p0].lastReader = ThreadF.myTxn THEN
> Protect(p, Access.ReadOnly);
> ELSE
> Protect(p, Access.None);
> END
> END;
> RETURN TRUE;
> END;
>
> p := originalTransientPage;
> IF p # Nil AND p # impureTransientCopy.page AND desc[p - p0].gray THEN
> (* originalTransientPage is now in the stack; mark it not gray *)
> CleanBetween(cleanTransientTo, originalTransientBoundary);
> desc[p - p0].gray := FALSE;
> desc[p - p0].dirty := FALSE;
> IF perfOn THEN PerfChange(p, 1) END;
> IF ThreadF.myTxn = NIL
> OR map[p - p0] = NIL
> OR map[p - p0].writer = ThreadF.myTxn
> THEN
> IF desc[p - p0].generation = Generation.Older THEN
> <* ASSERT desc[p - p0].space = Space.Current *>
> Protect(p, Access.ReadOnly);
> END
> ELSIF map[p - p0].lastReader = ThreadF.myTxn THEN
> Protect(p, Access.ReadOnly);
> ELSE
> Protect(p, Access.None);
> END;
>
> p := originalPage;
> IF p # Nil AND p # impureCopy.page AND desc[p - p0].gray THEN
> (* originalPage is now in the stack; mark it not gray *)
> CleanBetween(cleanTo, originalBoundary);
> desc[p - p0].gray := FALSE;
> desc[p - p0].dirty := FALSE;
> IF perfOn THEN PerfChange(p, 1) END;
> IF ThreadF.myTxn = NIL
> OR map[p - p0] = NIL
> OR map[p - p0].writer = ThreadF.myTxn
> THEN
> IF desc[p - p0].generation = Generation.Older THEN
> <* ASSERT desc[p - p0].space = Space.Current *>
> Protect(p, Access.ReadOnly);
> END
> ELSIF map[p - p0].lastReader = ThreadF.myTxn THEN
> Protect(p, Access.ReadOnly);
> ELSE
> Protect(p, Access.None);
> END
> END;
> RETURN TRUE;
> END;
>
> RETURN TRUE;
> END CopySome;
>
> PROCEDURE CleanSome (VAR current: AllocRec; cleaner := CleanBetween;
> gray := FALSE): BOOLEAN =
951,953c2265,2268
< originalImpureCopyPage := impureCopyPage;
< originalBoundary := impureCopyBoundary;
< cleanTo := PageToHeader(impureCopyPage);
---
> originalPage := current.page;
> originalBoundary := current.boundary;
> cleanTo := PageToHeader(current.page);
> p: Page;
956,957c2271,2272
< IF cleanTo < impureCopyPtr THEN
< VAR ptr := impureCopyPtr;
---
> IF cleanTo < current.ptr THEN
> VAR ptr := current.ptr;
959c2274
< CleanBetween(cleanTo, ptr);
---
> cleaner(cleanTo, ptr);
963,979c2278,2287
< IF impureCopyStack = Nil THEN RETURN FALSE; END;
< VAR p := impureCopyStack;
< BEGIN
< impureCopyStack := desc[p - p0].link;
< <* ASSERT NOT desc[p - p0].pure *>
< IF desc[p - p0].gray THEN
< IF desc[p - p0].protected THEN Unprotect(p); END;
< CleanBetween(PageToHeader(p), PageToHeader(p + 1));
< FOR i := 0 TO PageCount(p) - 1 DO
< desc[p + i - p0].gray := FALSE;
< END;
< IF desc[p - p0].generation = Generation.Older THEN
< <* ASSERT desc[p - p0].space = Space.Current *>
< Protect(p, readable := TRUE, writable := FALSE);
< END;
< IF perfOn THEN PerfChange(p, PageCount(p)); END;
< END;
---
> p := current.stack;
> IF p = Nil THEN RETURN FALSE; END;
> current.stack := desc[p - p0].link;
> <* ASSERT desc[p - p0].gray *>
> <* ASSERT desc[p - p0].resident *>
> <* ASSERT desc[p - p0].access = Access.ReadWrite *>
> cleaner(PageToHeader(p), PageToHeader(p + 1));
> FOR i := 0 TO PageCount(p) - 1 DO
> desc[p + i - p0].gray := gray;
> desc[p + i - p0].dirty := FALSE;
980a2289
> IF perfOn THEN PerfChange(p, PageCount(p)) END;
982c2291
< IF impureCopyPage # originalImpureCopyPage THEN EXIT; END;
---
> IF current.page # originalPage THEN EXIT; END;
984,993c2293,2300
< CleanBetween(cleanTo, originalBoundary);
< (* originalImpureCopyPage is now in the stack; mark it not gray *)
< IF originalImpureCopyPage # Nil THEN
< desc[originalImpureCopyPage - p0].gray := FALSE;
< IF desc[originalImpureCopyPage - p0].generation = Generation.Older THEN
< <* ASSERT desc[originalImpureCopyPage - p0].space = Space.Current *>
< Protect(
< originalImpureCopyPage, readable := TRUE, writable := FALSE);
< END;
< IF perfOn THEN PerfChange(originalImpureCopyPage, 1); END;
---
> cleaner(cleanTo, originalBoundary);
>
> (* originalPage is now in the stack; mark it not gray *)
> p := originalPage;
> IF p # Nil THEN
> desc[p - p0].gray := gray;
> desc[p - p0].dirty := FALSE;
> IF perfOn THEN PerfChange(p, 1) END;
996c2303
< END CopySome;
---
> END CleanSome;
1009a2317,2385
> PROCEDURE CleanTransient (h, he: RefHeader) =
> BEGIN
> WHILE h < he DO
> <* ASSERT Word.And (LOOPHOLE (h, INTEGER), 3) = 0 *>
> <* ASSERT NOT h.forwarded *>
> h.marka := FALSE;
> h.markb := FALSE;
> RTHeapMap.WalkRef (h, tmover);
> INC(h, ADRSIZE(Header) + ReferentSize(h));
> END;
> END CleanTransient;
>
> PROCEDURE CleanPersistent (h, he: RefHeader) =
> VAR
> p: Page;
> pi: INTEGER;
> mapDB: RTDB.T;
> tc: Typecode;
> def: TypeDefn;
> pure: BOOLEAN;
> fpRef: REF Fingerprint.T;
> fpAdr: ADDRESS;
> page: RTDB.Page;
> BEGIN
> IF h < he THEN
> p := HeaderToPage(h);
> <* ASSERT p # Nil *>
> pi := p - p0;
> page := map[pi];
> <* ASSERT page # NIL *>
> IF page.writer # ThreadF.myTxn THEN RETURN END;
> pure := desc[pi].pure;
> mapDB := page.db;
> <* ASSERT mapDB # NIL *>
> SetDB(mapDB);
>
> REPEAT
> <* ASSERT Word.And (LOOPHOLE (h, INTEGER), 3) = 0 *>
> <* ASSERT NOT h.forwarded *>
> h.marka := FALSE;
> h.markb := FALSE;
> tc := h.typecode;
> IF tc = Fill_1_type THEN
> INC(h, ADRSIZE(Header));
> ELSIF tc = Fill_N_type THEN
> INC(h, LOOPHOLE(h + ADRSIZE(Header), UNTRACED REF INTEGER)^);
> ELSE
> def := RTType.Get(tc);
> <* ASSERT def.traced = 1 *>
> fpRef := NIL;
> fpAdr := NIL;
> mapDB.mapFP(LOOPHOLE(def.fp, Fingerprint.T), fpRef, fpAdr);
> IF NOT pure THEN
> <* FATAL ANY *>
> BEGIN
> RTTypeMap.DoWalkRef(def, h + ADRSIZE(Header),
> RTTypeMap.Mask{RTTypeMap.Kind.Ref}, pmover);
> END;
> END;
> IF def.nDimensions = 0 THEN
> INC(h, ADRSIZE(Header) + def.dataSize);
> ELSE
> INC(h, ADRSIZE(Header) + OpenArraySize(h, def));
> END;
> END;
> UNTIL NOT h < he;
> END;
> END CleanPersistent;
>
1035,1036c2411,2416
< InsertFiller(impureCopyPtr, impureCopyBoundary - impureCopyPtr);
< InsertFiller(pureCopyPtr, pureCopyBoundary - pureCopyPtr);
---
> InsertFiller(impureCopy.ptr, impureCopy.boundary - impureCopy.ptr);
> InsertFiller(pureCopy.ptr, pureCopy.boundary - pureCopy.ptr);
> InsertFiller(impureTransientCopy.ptr,
> impureTransientCopy.boundary - impureTransientCopy.ptr);
> InsertFiller(pureTransientCopy.ptr,
> pureTransientCopy.boundary - pureTransientCopy.ptr);
1132,1133c2512,2517
< InsertFiller(impureCopyPtr, impureCopyBoundary - impureCopyPtr);
< InsertFiller(pureCopyPtr, pureCopyBoundary - pureCopyPtr);
---
> InsertFiller(impureCopy.ptr, impureCopy.boundary - impureCopy.ptr);
> InsertFiller(pureCopy.ptr, pureCopy.boundary - pureCopy.ptr);
> InsertFiller(impureTransientCopy.ptr,
> impureTransientCopy.boundary - impureTransientCopy.ptr);
> InsertFiller(pureTransientCopy.ptr,
> pureTransientCopy.boundary - pureTransientCopy.ptr);
1228c2612
< data : REF ARRAY OF RefReferent;
---
> data : <*TRANSIENT*> REF ARRAY OF RefReferent;
1245c2629
< s.data := NEW(REF ARRAY OF RefReferent, 100);
---
> s.data := NEW(<*TRANSIENT*> REF ARRAY OF RefReferent, 100);
1268,1269c2652
< newStack: REF ARRAY OF RefReferent := NEW(REF ARRAY OF RefReferent,
< newStackN);
---
> newStack := NEW(<*TRANSIENT*> REF ARRAY OF RefReferent, newStackN);
1316c2699
< nextNewPtr: RefHeader;
---
> nextPtr : RefHeader;
1320,1321c2703,2704
< newPtr? *)
< VAR referentTry := newPtr + ADRSIZE(Header);
---
> new.ptr? *)
> VAR referentTry := new.ptr + ADRSIZE(Header);
1326c2709
< | nextNewPtr := LOOPHOLE (a + dataSize, RefHeader); END;
---
> | nextPtr := LOOPHOLE (a + dataSize, RefHeader); END;
1331c2714
< nextNewPtr := referentTry + (alignment + dataSize);
---
> nextPtr := referentTry + (alignment + dataSize);
1334,1335c2717,2718
< IF nextNewPtr > newBoundary THEN
< nextNewPtr := NIL; (* clear in case of GC *)
---
> IF nextPtr > new.boundary THEN
> nextPtr := NIL; (* clear in case of GC *)
1337,1339c2720
< res := LongAlloc(dataSize, dataAlignment, currentPtr := newPtr,
< currentBoundary := newBoundary,
< currentPage := newPage, stack := newStack,
---
> res := LongAlloc(dataSize, dataAlignment, new,
1348,1349c2729,2730
< InsertFiller(newPtr, alignment);
< newPtr := newPtr + alignment;
---
> InsertFiller(new.ptr, alignment);
> new.ptr := new.ptr + alignment;
1351c2732
< VAR res := LOOPHOLE(newPtr + ADRSIZE(Header), RefReferent);
---
> VAR res := LOOPHOLE(new.ptr + ADRSIZE(Header), RefReferent);
1353c2734
< newPtr := nextNewPtr;
---
> new.ptr := nextPtr;
1359,1360c2740
< (* AllocForPureCopy and AllocForImpureCopy allocate space to copy an object
< from oldspace; they have the same logic as AllocForNew. *)
---
> (* AllocForNewTransient allocates space for a NEW. *)
1362,1363c2742,2743
< PROCEDURE AllocForPureCopy (dataSize, dataAlignment: CARDINAL):
< RefReferent =
---
> PROCEDURE AllocForNewTransient (dataSize, dataAlignment: CARDINAL)
> : RefReferent =
1365,1367c2745,2746
< alignment : INTEGER;
< nextPureCopyPtr : RefHeader;
< res, referentTry: RefReferent;
---
> alignment : INTEGER;
> nextPtr : RefHeader;
1369d2747
< <* ASSERT collectorOn *>
1372,1380c2750,2751
< pureCopyPtr? *)
< referentTry := pureCopyPtr + ADRSIZE(Header);
<
< (* ---------------- see CheckTypes ---------------------------------
< | WITH a = RTMisc.Align (referentTry, dataAlignment) DO
< | alignment := a - referentTry;
< | nextPureCopyPtr := LOOPHOLE (a + dataSize, RefHeader); END;
< ------------------------------------------------------------------ *)
< VAR tmp := Word.And(LOOPHOLE(referentTry, INTEGER), MaxAlignMask);
---
> newTransient.ptr? *)
> VAR referentTry := newTransient.ptr + ADRSIZE(Header);
1382,1383c2753,2761
< alignment := align[tmp, dataAlignment];
< nextPureCopyPtr := referentTry + (alignment + dataSize);
---
> (* ---------------- see CheckTypes ---------------------------------
> | WITH a = RTMisc.Align (referentTry, dataAlignment) DO
> | alignment := a - referentTry;
> | nextPtr := LOOPHOLE (a + dataSize, RefHeader); END;
> ------------------------------------------------------------------ *)
> alignment :=
> align[Word.And(LOOPHOLE(referentTry, INTEGER), MaxAlignMask),
> dataAlignment];
> nextPtr := referentTry + (alignment + dataSize);
1385d2762
<
1387,1393c2764,2772
< IF nextPureCopyPtr > pureCopyBoundary THEN
< res := LongAlloc(dataSize, dataAlignment, currentPtr := pureCopyPtr,
< currentBoundary := pureCopyBoundary,
< currentPage := pureCopyPage, stack := pureCopyStack,
< allocMode := AllocMode.Copy, pure := TRUE);
< RTOS.UnlockHeap();
< RETURN res;
---
> IF nextPtr > newTransient.boundary THEN
> nextPtr := NIL; (* clear in case of GC *)
> VAR
> res := LongAlloc(dataSize, dataAlignment, newTransient,
> allocMode := AllocMode.New, pure := FALSE);
> BEGIN
> RTOS.UnlockHeap();
> RETURN res;
> END;
1395d2773
<
1398,1399c2776,2783
< InsertFiller(pureCopyPtr, alignment);
< pureCopyPtr := pureCopyPtr + alignment;
---
> InsertFiller(newTransient.ptr, alignment);
> newTransient.ptr := newTransient.ptr + alignment;
> END;
> VAR res := LOOPHOLE(newTransient.ptr + ADRSIZE(Header), RefReferent);
> BEGIN
> newTransient.ptr := nextPtr;
> RTOS.UnlockHeap();
> RETURN res;
1400a2785
> END AllocForNewTransient;
1402,1406c2787,2788
< res := LOOPHOLE(pureCopyPtr + ADRSIZE(Header), RefReferent);
< pureCopyPtr := nextPureCopyPtr;
< RTOS.UnlockHeap();
< RETURN res;
< END AllocForPureCopy;
---
> (* AllocForCopy allocates space to copy an object from oldspace; it has the
> same logic as AllocForNew. *)
1408,1409c2790,2792
< PROCEDURE AllocForImpureCopy (dataSize, dataAlignment: CARDINAL):
< RefReferent =
---
> PROCEDURE AllocForCopy (dataSize, dataAlignment: CARDINAL;
> VAR current: AllocRec;
> pure: BOOLEAN) : RefReferent =
1411,1413c2794,2796
< alignment : INTEGER;
< nextImpureCopyPtr: RefHeader;
< res, referentTry : RefReferent;
---
> alignment : INTEGER;
> nextPtr : RefHeader;
> res, referentTry: RefReferent;
1418,1419c2801,2802
< ImpureCopyPtr? *)
< referentTry := impureCopyPtr + ADRSIZE(Header);
---
> current.ptr? *)
> referentTry := current.ptr + ADRSIZE(Header);
1424c2807
< | nextImpureCopyPtr := LOOPHOLE (a + dataSize, RefHeader); END;
---
> | nextPtr := LOOPHOLE (a + dataSize, RefHeader); END;
1429c2812
< nextImpureCopyPtr := referentTry + (alignment + dataSize);
---
> nextPtr := referentTry + (alignment + dataSize);
1433,1438c2816,2818
< IF nextImpureCopyPtr > impureCopyBoundary THEN
< res :=
< LongAlloc(dataSize, dataAlignment, currentPtr := impureCopyPtr,
< currentBoundary := impureCopyBoundary,
< currentPage := impureCopyPage, stack := impureCopyStack,
< allocMode := AllocMode.Copy, pure := FALSE);
---
> IF nextPtr > current.boundary THEN
> res := LongAlloc(dataSize, dataAlignment, current,
> allocMode := AllocMode.Copy, pure := pure);
1445,1446c2825,2826
< InsertFiller(impureCopyPtr, alignment);
< impureCopyPtr := impureCopyPtr + alignment;
---
> InsertFiller(current.ptr, alignment);
> current.ptr := current.ptr + alignment;
1449,1450c2829,2830
< res := LOOPHOLE(impureCopyPtr + ADRSIZE(Header), RefReferent);
< impureCopyPtr := nextImpureCopyPtr;
---
> res := LOOPHOLE(current.ptr + ADRSIZE(Header), RefReferent);
> current.ptr := nextPtr;
1453c2833
< END AllocForImpureCopy;
---
> END AllocForCopy;
1457,1463c2837,2841
< PROCEDURE LongAlloc ( dataSize, dataAlignment : CARDINAL;
< VAR (*INOUT*) currentPtr, currentBoundary: RefHeader;
< VAR (*INOUT*) currentPage : Page;
< VAR (*INOUT*) stack : Page;
< allocMode : AllocMode;
< pure : BOOLEAN ):
< RefReferent =
---
> PROCEDURE LongAlloc ( dataSize, dataAlignment : CARDINAL;
> VAR (*INOUT*) current : AllocRec;
> allocMode : AllocMode;
> pure : BOOLEAN)
> : RefReferent =
1483c2861,2862
< gray := allocMode = AllocMode.Copy AND NOT pure;
---
> persistent := current.db # NIL;
> gray := persistent OR allocMode = AllocMode.Copy AND NOT pure;
1499,1500c2878
< IF generation = Generation.Older THEN <* ASSERT gray OR pure *>
< END;
---
> IF generation = Generation.Older THEN <* ASSERT gray OR pure *> END;
1504,1506c2882,2894
< Desc{space := Space.Current, generation := generation, pure :=
< pure, note := note, gray := gray, protected := FALSE,
< continued := FALSE};
---
> Desc{space := Space.Current, generation := generation,
> pure := pure, note := note, gray := gray,
> access := Access.ReadWrite, continued := FALSE,
> resident := TRUE, dirty := NOT pure};
> IF persistent THEN
> VAR page := current.db.newPage();
> BEGIN
> map[thisPage - p0] := page;
> page.p := thisPage;
> page.lastReader := ThreadF.myTxn;
> page.writer := ThreadF.myTxn;
> END
> END;
1519,1522c2907,2920
< Desc{space := Space.Current, generation := generation, pure :=
< pure, note := note, gray := gray, protected := FALSE,
< continued := TRUE};
< END;
---
> Desc{space := Space.Current, generation := generation,
> pure := pure, note := note, gray := gray,
> access := Access.ReadWrite, continued := TRUE,
> resident := TRUE, dirty := NOT pure};
> IF persistent THEN
> VAR page := current.db.newPage();
> BEGIN
> map[thisPage + i - p0] := page;
> page.p := thisPage;
> page.lastReader := ThreadF.myTxn;
> page.writer := ThreadF.myTxn;
> END
> END
> END
1527c2925
< IF thisBoundary - thisPtr > currentBoundary - currentPtr THEN
---
> IF thisBoundary - thisPtr > current.boundary - current.ptr THEN
1530,1534c2928,2932
< InsertFiller(currentPtr, currentBoundary - currentPtr);
< IF currentPage # Nil THEN
< <* ASSERT desc[currentPage - p0].space = Space.Current *>
< desc[currentPage - p0].link := stack;
< stack := currentPage;
---
> InsertFiller(current.ptr, current.boundary - current.ptr);
> IF current.page # Nil THEN
> <* ASSERT desc[current.page - p0].space = Space.Current *>
> desc[current.page - p0].link := current.stack;
> current.stack := current.page;
1536,1537c2934,2935
< <* ASSERT desc[currentPage - p0].gray
< OR desc[currentPage - p0].pure *>
---
> <* ASSERT desc[current.page - p0].gray
> OR desc[current.page - p0].pure *>
1540,1542c2938,2940
< currentPtr := thisPtr;
< currentBoundary := thisBoundary;
< currentPage := thisPage;
---
> current.ptr := thisPtr;
> current.boundary := thisBoundary;
> current.page := thisPage;
1547,1548c2945,2946
< desc[thisPage - p0].link := stack;
< stack := thisPage;
---
> desc[thisPage - p0].link := current.stack;
> current.stack := thisPage;
1552,1553c2950,2951
< desc[thisPage - p0].link := stack;
< stack := thisPage;
---
> desc[thisPage - p0].link := current.stack;
> current.stack := thisPage;
1622c3020
< IF desc[p - p0].protected THEN Unprotect(p); END;
---
> IF desc[p - p0].access # Access.ReadWrite THEN Unprotect(p); END;
1631c3029
<
---
>
1652c3050,3051
< | Space.Previous => <* ASSERT FALSE *>
---
> | Space.Previous =>
> <* ASSERT FALSE *>
1654,1677c3053,3059
< <* ASSERT NOT desc[p - p0].gray *>
< <* ASSERT NOT desc[p - p0].continued *>
< IF desc[p - p0].protected THEN
< <* ASSERT desc[p - p0].generation = Generation.Older *>
< END;
< (* visit the objects on the page *)
< VAR
< h := PageToHeader(p);
< he := PageToHeader(p + 1);
< BEGIN
< IF p = newPage THEN he := newPtr; END;
< WHILE h < he DO
< (* check the references in the object *)
< IF desc[p - p0].protected THEN
< RTHeapMap.WalkRef (h, protectedCheck);
< ELSE
< RTHeapMap.WalkRef (h, refCheck);
< END;
< INC(h, ADRSIZE(Header) + ReferentSize(h));
< END;
< IF h > he THEN
< <* ASSERT HeaderToPage(h - 1) = p + PageCount(p) - 1 *>
< ELSE
< <* ASSERT PageCount(p) = 1 *>
---
> <* ASSERT NOT desc[p - p0].gray *>
> <* ASSERT NOT desc[p - p0].continued *>
> IF desc[p - p0].resident THEN
> IF desc[p - p0].access # Access.None THEN
> IF map[p - p0] = NIL AND desc[p - p0].access = Access.ReadOnly THEN
> <* ASSERT NOT desc[p - p0].dirty *>
> <* ASSERT desc[p - p0].generation = Generation.Older *>
1679,1693c3061,3076
< END;
< VAR
< n := PageCount(p);
< d := desc[p - p0];
< BEGIN
< d.continued := TRUE;
< d.link := Nil;
< LOOP
< INC(p);
< DEC(n);
< IF n = 0 THEN EXIT; END;
< VAR dd := desc[p - p0];
< BEGIN
< dd.link := Nil;
< <* ASSERT dd = d *>
---
> (* visit the objects on the page *)
> VAR
> h := PageToHeader(p);
> he := PageToHeader(p + 1);
> BEGIN
> IF p = new.page THEN he := new.ptr;
> ELSIF p = newTransient.page THEN he := newTransient.ptr; END;
> WHILE h < he DO
> (* check the references in the object *)
> IF map[p - p0] = NIL AND desc[p - p0].access = Access.ReadOnly
> THEN
> RTHeapMap.WalkRef (h, protectedCheck);
> ELSE
> RTHeapMap.WalkRef (h, refCheck);
> END;
> INC(h, ADRSIZE(Header) + ReferentSize(h));
1695,1696c3078,3117
< END;
< END;
---
> IF h > he THEN
> <* ASSERT HeaderToPage(h - 1) = p + PageCount(p) - 1 *>
> ELSE
> <* ASSERT PageCount(p) = 1 *>
> END
> END
> ELSE
> (* don't visit objects since the page is protected *)
> END
> ELSE
> <* ASSERT desc[p - p0].access = Access.None *>
> <* ASSERT desc[p - p0].pure *>
> <* ASSERT map[p - p0].writer = NIL *>
> END;
>
> VAR
> n := PageCount(p);
> d := desc[p - p0];
> BEGIN
> <* ASSERT NOT d.continued *>
> LOOP
> INC(p);
> DEC(n);
> IF n = 0 THEN EXIT; END;
> VAR dd := desc[p - p0];
> BEGIN
> <* ASSERT dd.space = d.space *>
> <* ASSERT dd.generation = d.generation *>
> <* ASSERT dd.pure = d.pure *>
> <* ASSERT dd.note = d.note *>
> <* ASSERT dd.gray = d.gray *>
> <* ASSERT dd.access = d.access *>
> <* ASSERT dd.continued *>
> <* ASSERT dd.resident = d.resident *>
> (* ASSERT dd.dirty = d.dirty *)
> (* ASSERT dd.link = d.link *)
> <* ASSERT map[p - p0] = NIL OR map[p - p0].db # NIL *>
> END
> END
> END;
1698,1699c3119,3120
< <* ASSERT NOT desc[p - p0].continued *>
< INC(p);
---
> <* ASSERT NOT desc[p - p0].continued *>
> INC(p);
1710,1712c3131,3132
< p := ReferentToPage(ref);
< h := HeaderOf(ref);
< tc := h.typecode;
---
> p := ReferentToPage(ref);
> h := HeaderOf(ref);
1717,1723c3137,3147
< <* ASSERT (0 < tc AND tc < RT0u.nTypes)
< OR tc = Fill_1_type
< OR tc = Fill_N_type *>
< ELSE
< (* the compiler generates Text.T that are not in the traced
< heap *)
< <* ASSERT tc = 1 *>
---
> IF desc[p - p0].access # Access.None THEN
> VAR tc := h.typecode;
> BEGIN
> <* ASSERT (0 < tc AND tc < RT0u.nTypes)
> OR tc = Fill_1_type
> OR tc = Fill_N_type *>
> END
> END
> ELSE
> (* the compiler generates Text.T that are not in the traced heap *)
> <* ASSERT h.typecode = RT0.TextTypecode *>
1735,1737c3159,3160
< p := ReferentToPage(ref);
< h := HeaderOf(ref);
< tc := h.typecode;
---
> p := ReferentToPage(ref);
> h := HeaderOf(ref);
1743,1749c3166,3176
< <* ASSERT (0 < tc AND tc < RT0u.nTypes)
< OR tc = Fill_1_type
< OR tc = Fill_N_type *>
< ELSE
< (* the compiler generates Text.T that are not in the traced
< heap *)
< <* ASSERT tc = 1 *>
---
> IF desc[p - p0].access # Access.None THEN
> VAR tc := h.typecode;
> BEGIN
> <* ASSERT (0 < tc AND tc < RT0u.nTypes)
> OR tc = Fill_1_type
> OR tc = Fill_N_type *>
> END
> END;
> ELSE
> (* the compiler generates Text.T that are not in the traced heap *)
> <* ASSERT h.typecode = RT0.TextTypecode *>
1770c3197,3199
< WHILE h < he AND (p # newPage OR h < newPtr) DO
---
> IF p = new.page THEN he := new.ptr;
> ELSIF p = newTransient.page THEN he := newTransient.ptr; END;
> WHILE h < he DO
1791,1792c3220,3221
< tcs : REF ARRAY OF Typecode;
< counts : REF ARRAY OF CARDINAL;
---
> tcs : <*TRANSIENT*> REF ARRAY OF Typecode;
> counts : <*TRANSIENT*> REF ARRAY OF CARDINAL;
1800c3229
< counts : REF ARRAY OF CARDINAL;
---
> counts : <*TRANSIENT*> REF ARRAY OF CARDINAL;
2064,2075c3493,3506
< WITH entry = weakTable[ab.a] DO
< (* check the weak ref there *)
< IF entry.t = ab THEN
< <* ASSERT entry.r # NIL *>
< IF collectorState # CollectorState.Zero THEN
< VAR p := ReferentToPage(entry.r);
< BEGIN
< <* ASSERT p # Nil *>
< IF desc[p - p0].space = Space.Previous THEN
< CollectorOn();
< Move(NIL, ADR(entry.r));
< CollectorOff();
---
> IF ab.a < NUMBER(weakTable^) THEN
> WITH entry = weakTable[ab.a] DO
> (* check the weak ref there *)
> IF entry.t = ab THEN
> <* ASSERT entry.r # NIL *>
> IF collectorState # CollectorState.Zero THEN
> VAR p := ReferentToPage(entry.r);
> BEGIN
> <* ASSERT p # Nil *>
> IF desc[p - p0].space = Space.Previous THEN
> CollectorOn();
> Move(NIL, ADR(entry.r));
> CollectorOff();
> END;
2077a3509
> r := LOOPHOLE(entry.r, REFANY);
2079d3510
< r := LOOPHOLE(entry.r, REFANY);
2170,2171c3601,3603
< PROCEDURE Protect (p: Page; readable, writable: BOOLEAN) =
< VAR n := PageCount(p);
---
> PROCEDURE Protect (p: Page; access: Access) =
> VAR
> n := PageCount(p);
2173c3605
< <* ASSERT collectorOn OR (readable AND writable) *>
---
> <* ASSERT collectorOn OR access = Access.ReadWrite OR map[p-p0] # NIL *>
2176,2179c3608,3612
< RTHeapDep.Protect(p, n, readable, writable);
< VAR protected := NOT (readable AND writable);
< BEGIN
< FOR i := 0 TO n - 1 DO desc[p + i - p0].protected := protected; END;
---
> RTHeapDep.Protect(p, n,
> access # Access.None,
> access = Access.ReadWrite);
> FOR i := 0 TO n - 1 DO
> desc[p + i - p0].access := access;
2186c3619
< Protect(p, readable := TRUE, writable := TRUE);
---
> Protect(p, Access.ReadWrite);
2189,2199c3622,3650
< PROCEDURE Fault (addr: ADDRESS): BOOLEAN =
< VAR p := LOOPHOLE(addr, INTEGER) DIV BytesPerPage;
< BEGIN
< ThreadF.SuspendOthers();
< <* ASSERT RTHeapDep.VM *>
< <* NOWARN *><* ASSERT TRUE *>
< cycleCost :=
< cycleCost + RTHeapDep.VMFaultTime(); (* otherwise unaccounted for *)
< IF NOT (p0 <= p AND p < p1) OR desc[p - p0].space = Space.Unallocated THEN
< ThreadF.ResumeOthers();
< RETURN FALSE; (* not in heap *)
---
> TYPE Swizzler = RTTypeMap.Visitor OBJECT
> db: RTDB.T;
> page: RTDB.Page;
> METHODS
> swizzleRef(db: RTDB.T; ref: RefReferent): RefReferent RAISES {Thread.Aborted}
> := SwizzleRef;
> map(page: RTDB.Page; nbPages: CARDINAL) RAISES {Thread.Aborted} := Map;
> swizzleType(db: RTDB.T; ref: RefReferent): TypeDefn RAISES {Thread.Aborted}
> := SwizzleType;
> swizzlePage(): BOOLEAN RAISES {Thread.Aborted} := SwizzlePage;
> OVERRIDES
> apply := Swizzle
> END;
>
> PROCEDURE Swizzle (self: Swizzler; cp: ADDRESS; k: RTTypeMap.Kind)
> RAISES {Thread.Aborted} =
> VAR refref := LOOPHOLE(cp, UNTRACED REF RefReferent);
> BEGIN
> CASE k OF
> | RTTypeMap.Kind.UntracedRef, RTTypeMap.Kind.TransientRef =>
> refref^ := NIL;
> | RTTypeMap.Kind.Ref =>
> VAR ref := refref^;
> BEGIN
> IF ref # NIL THEN
> refref^ := self.swizzleRef(self.db, ref);
> END
> END
> ELSE
2201,2203c3652,3690
< IF NOT desc[p - p0].protected THEN
< ThreadF.ResumeOthers();
< RETURN TRUE; (* was protected, but not any more *)
---
> END Swizzle;
>
> PROCEDURE SwizzleRef (self: Swizzler; db: RTDB.T; ref: RefReferent)
> : RefReferent
> RAISES {Thread.Aborted} =
> VAR
> id: RTDB.Id := Word.RightShift(LOOPHOLE(ref, INTEGER), LogBytesPerPage);
> offset := Word.And(LOOPHOLE(ref, INTEGER), BytesPerPage - 1);
> nbPages := 1;
> p: Page;
> BEGIN
> (*
> Small object PID:
> +----------------+----------------+
> | page id | byte offset 00|
> +----------------+----------------+
>
> Large object PID:
> +----------------+-----------+----+
> | page id | # pages |xxx1|
> +----------------+-----------+----+
> The offset is encoded by the value of xxx.
> If # pages = 0 then object size can only be inferred from its type.
> *)
> IF Word.And(offset, 1) # 0 THEN
> (* large object *)
> nbPages := Word.RightShift(offset, 4);
> CASE Word.And(offset, 2_1111) OF
> | 2_0001 => offset := 4;
> | 2_0011 => offset := 8;
> | 2_0101 => offset := 16;
> | 2_0111 => offset := 32;
> | 2_1001 => offset := 64;
> | 2_1011 => offset := 128;
> | 2_1101 => offset := 256;
> | 2_1111 => offset := 512;
> ELSE
> <* ASSERT FALSE *>
> END;
2205,2210c3692,3710
< <* ASSERT NOT desc[p - p0].pure *>
< IF desc[p - p0].gray THEN
< CollectorOn();
< IF p = impureCopyPage THEN
< IF CopySome() THEN
< <* ASSERT NOT desc[p - p0].gray *>
---
>
> VAR page: RTDB.Page := db.mapPage(id);
> BEGIN
> IF page.p = Nil THEN
> self.map(page, nbPages);
> END;
> p := page.p;
> END;
>
> VAR pi := p - p0;
> BEGIN
> IF desc[pi].space = Space.Previous THEN
> IF desc[pi].pure THEN
> PromotePage(
> p, Desc{space := Space.Current, generation := copyGeneration,
> pure := TRUE, note := Note.Persistent,
> gray := FALSE, access := desc[pi].access,
> continued := FALSE, resident := desc[pi].resident,
> dirty := FALSE});
2212,2224c3712,3835
< IF desc[p - p0].gray THEN
< <* ASSERT p = impureCopyPage AND impureCopyStack = Nil *>
< InsertFiller(impureCopyPtr, impureCopyBoundary - impureCopyPtr);
< impureCopyPage := Nil;
< impureCopyStack := Nil;
< impureCopyPtr := NIL;
< impureCopyBoundary := NIL;
< FOR i := 0 TO PageCount(p) - 1 DO
< desc[p + i - p0].gray := FALSE;
< END;
< IF desc[p - p0].generation = Generation.Older THEN
< <* ASSERT desc[p - p0].space = Space.Current *>
< Protect(p, readable := TRUE, writable := FALSE);
---
> IF collectorOn THEN
> IF desc[pi].access # Access.ReadWrite THEN Unprotect(p) END;
> ELSE
> Protect(p, Access.None);
> END;
> PromotePage(
> p, Desc{space := Space.Current, generation := copyGeneration,
> pure := FALSE, note := Note.Persistent,
> gray := TRUE, access := desc[pi].access,
> continued := FALSE, resident := TRUE,
> dirty := TRUE});
> desc[pi].link := impureCopy.stack;
> impureCopy.stack := p;
> END
> END
> END;
> RETURN PageToAddress(p) + offset;
> END SwizzleRef;
>
> PROCEDURE Map (self: Swizzler; page: RTDB.Page; nbPages: CARDINAL)
> RAISES {Thread.Aborted} =
> (* page has not yet been mapped *)
> VAR
> p: Page;
> notAfter: SET OF Note := SET OF Note{Note.Allocated};
> d := Desc{space := Space.Current, generation := copyGeneration,
> pure := TRUE, note := Note.Persistent, gray := FALSE,
> access := Access.ReadWrite, continued := FALSE,
> resident := FALSE, dirty := FALSE};
> PROCEDURE PeekPageCount(page: RTDB.Page;
> READONLY data: RTHeapDep.PageData) =
> <*FATAL Thread.Aborted*>
> VAR
> h: RefHeader;
> type: ADDRESS;
> def: TypeDefn;
> dataSize, nbBytes: CARDINAL;
> BEGIN
> TRY
> ThreadF.SuspendOthers();
> h := LOOPHOLE(ADR(data[0]), RefHeader);
> type := LOOPHOLE(h, UNTRACED REF ADDRESS)^;
> IF type = LOOPHOLE(0, ADDRESS) THEN
> INC(h, ADRSIZE(Header));
> type := LOOPHOLE(h, UNTRACED REF ADDRESS)^;
> ELSIF type = LOOPHOLE(1, ADDRESS) THEN
> INC(h, LOOPHOLE(h + ADRSIZE(Header), UNTRACED REF INTEGER)^);
> type := LOOPHOLE(h, UNTRACED REF ADDRESS)^;
> END;
> def := self.swizzleType(page.db, type);
> IF def.nDimensions = 0 THEN
> dataSize := def.dataSize;
> ELSE
> dataSize := OpenArraySize(h, def);
> END;
> nbBytes := RTMisc.Upper(ADRSIZE(Header), def.dataAlignment) + dataSize;
> nbPages := (nbBytes + AdrPerPage - 1) DIV AdrPerPage;
> FINALLY
> ThreadF.ResumeOthers();
> END
> END PeekPageCount;
> BEGIN
> IF nbPages = 0 THEN
> (* large object of unknown size: get size from first page *)
> TRY
> IF self.page # NIL THEN
> Protect(self.page.p, Access.None);
> END;
> ThreadF.ResumeOthers();
> Thread.Acquire(page);
> page.peek(PeekPageCount);
> FINALLY
> Thread.Release(page);
> ThreadF.SuspendOthers();
> IF self.page # NIL THEN
> Unprotect(self.page.p);
> END
> END;
> END;
> p := FindFreePages(nbPages, notAfter := notAfter);
> desc[p - p0] := d;
> map[p - p0] := page;
> page.p := p;
> IF nbPages > 1 THEN
> d.continued := TRUE;
> FOR i := 1 TO nbPages - 1 DO
> desc[p + i - p0] := d;
> page := page.db.mapPage(page.id + 1);
> map[p + i - p0] := page;
> page.p := p + i;
> END
> END;
> Protect(p, Access.None);
> END Map;
>
> PROCEDURE SwizzleType (self: Swizzler; db: RTDB.T; ref: RefReferent): TypeDefn
> RAISES {Thread.Aborted} =
> VAR
> fpRef := LOOPHOLE(self.swizzleRef(db, ref), REF Fingerprint.T);
> fpAdr := ref;
> p: Page := Word.RightShift(LOOPHOLE(fpRef, INTEGER), LogBytesPerPage);
> fp: Fingerprint.T;
> PROCEDURE PeekType(page: RTDB.Page; READONLY data: RTHeapDep.PageData) =
> VAR p := page.p;
> BEGIN
> ThreadF.SuspendOthers();
> Unprotect(p);
> PageToData(p)^ := data;
> fp := fpRef^;
> Protect(p, Access.None);
> desc[p - p0].dirty := TRUE;
> ThreadF.ResumeOthers();
> END PeekType;
> BEGIN
> IF desc[p - p0].access # Access.ReadWrite THEN
> IF desc[p - p0].pure THEN
> (* don't fault page, just get fingerprint *)
> VAR page := map[p - p0];
> BEGIN
> <* ASSERT page # NIL *>
> <* ASSERT page # self.page *>
> TRY
> IF self.page # NIL THEN
> Protect(self.page.p, Access.None);
2226c3837,3908
< IF perfOn THEN PerfChange(p, 1); END;
---
> ThreadF.ResumeOthers();
> Thread.Acquire(page);
> ThreadF.SuspendOthers();
> IF desc[p - p0].resident THEN
> fp := fpRef^;
> <* ASSERT desc[p - p0].access = Access.ReadOnly *>
> ELSIF desc[p - p0].dirty THEN
> Unprotect(p);
> fp := fpRef^;
> Protect(p, Access.None);
> ELSE
> TRY
> ThreadF.ResumeOthers();
> page.peek(PeekType);
> FINALLY
> ThreadF.SuspendOthers();
> END
> END
> FINALLY
> ThreadF.ResumeOthers();
> Thread.Release(page);
> ThreadF.SuspendOthers();
> IF self.page # NIL THEN
> Unprotect(self.page.p);
> END
> END
> END
> ELSIF desc[p - p0].gray THEN
> (* don't clean page, just get fingerprint *)
> Unprotect(p);
> fp := fpRef^;
> Protect(p, Access.None);
> ELSE
> fp := fpRef^;
> <* ASSERT desc[p - p0].access = Access.ReadOnly *>
> END
> ELSE
> fp := fpRef^;
> END;
> db.mapFP(fp, fpRef, fpAdr);
> RETURN RTType.Get(RTTypeFP.FromFingerprint(fp));
> END SwizzleType;
>
> PROCEDURE SwizzlePage (self: Swizzler): BOOLEAN RAISES {Thread.Aborted} =
> VAR
> pure := TRUE;
> type: RefReferent;
> def: TypeDefn;
> referentSize: CARDINAL;
> p := self.page.p;
> h := PageToHeader(p);
> he := PageToHeader(p + 1);
> BEGIN
> WHILE h < he DO
> type := LOOPHOLE(h, UNTRACED REF ADDRESS)^;
> IF type = LOOPHOLE(0, ADDRESS) THEN
> h^ := Header{typecode := Fill_1_type};
> referentSize := 0;
> ELSIF type = LOOPHOLE(1, ADDRESS) THEN
> h^ := Header{typecode := Fill_N_type};
> referentSize := LOOPHOLE(h + ADRSIZE(Header), UNTRACED REF INTEGER)^;
> DEC(referentSize, ADRSIZE(Header));
> ELSE
> def := self.swizzleType(self.db, type);
> <* ASSERT def.traced = 1 *>
> h^ := Header{typecode := def.typecode};
> IF def.nDimensions = 0 THEN
> referentSize := def.dataSize;
> IF def.defaultMethods # NIL THEN
> (* object: set up methods pointer *)
> LOOPHOLE(h + ADRSIZE(Header), UNTRACED REF RT0.MethodSuite)^ :=
> def.defaultMethods;
2227a3910,3914
> ELSE
> (* open array: set up the internal pointer *)
> LOOPHOLE(h + ADRSIZE(Header), UNTRACED REF ADDRESS)^ :=
> h + ADRSIZE(Header) + def.dataSize;
> referentSize := OpenArraySize(h, def);
2229,2231c3916,3959
< ELSE
< p := FirstPage(p);
< Unprotect(p);
---
> IF def.gc_map # NIL OR def.parent # NIL THEN
> pure := FALSE;
> RTTypeMap.DoWalkRef(def, <*NOWARN*> (* Thread.Aborted *)
> h + ADRSIZE(Header),
> RTTypeMap.Mask{RTTypeMap.Kind.Ref,
> RTTypeMap.Kind.UntracedRef,
> RTTypeMap.Kind.TransientRef},
> self);
> END
> END;
> INC(h, ADRSIZE(Header) + referentSize);
> END;
> RETURN pure;
> END SwizzlePage;
>
> PROCEDURE SwizzleRoot (db: RTDB.T): REFANY =
> (* root should be first object on page 1 *)
> <*FATAL Thread.Aborted*>
> VAR
> rootId := LOOPHOLE(BytesPerPage, ADDRESS) + ADRSIZE(Header);
> swizzler := NEW(Swizzler, db := db, page := NIL);
> BEGIN
> TRY
> ThreadF.SuspendOthers();
> RETURN LOOPHOLE(swizzler.swizzleRef(db, rootId), REFANY);
> FINALLY
> ThreadF.ResumeOthers();
> END
> END SwizzleRoot;
>
> PROCEDURE GrayFault (p: Page) =
> BEGIN
> <* ASSERT desc[p - p0].resident *>
> <* ASSERT desc[p - p0].access = Access.None *>
> <* ASSERT NOT desc[p - p0].pure *>
> CollectorOn();
> IF p = impureCopy.page THEN
> EVAL CopySome();
> IF desc[p - p0].gray THEN
> <* ASSERT p = impureCopy.page *>
> InsertFiller(impureCopy.ptr, impureCopy.boundary - impureCopy.ptr);
> impureCopy.page := Nil;
> impureCopy.ptr := NIL;
> impureCopy.boundary := NIL;
2233,2238c3961,3975
< FOR i := 0 TO PageCount(p) - 1 DO
< desc[p + i - p0].gray := FALSE;
< END;
< IF desc[p - p0].generation = Generation.Older THEN
< <* ASSERT desc[p - p0].space = Space.Current *>
< Protect(p, readable := TRUE, writable := FALSE);
---
> desc[p - p0].gray := FALSE;
> desc[p - p0].dirty := FALSE;
> IF perfOn THEN PerfChange(p, 1) END;
> IF ThreadF.myTxn = NIL
> OR map[p - p0] = NIL
> OR map[p - p0].writer = ThreadF.myTxn
> THEN
> IF desc[p - p0].generation = Generation.Older THEN
> <* ASSERT desc[p - p0].space = Space.Current *>
> Protect(p, Access.ReadOnly);
> END
> ELSIF map[p - p0].lastReader = ThreadF.myTxn THEN
> Protect(p, Access.ReadOnly);
> ELSE
> Protect(p, Access.None);
2240d3976
< IF perfOn THEN PerfChange(p, PageCount(p)); END;
2242c3978,4005
< CollectorOff();
---
> ELSIF p = impureTransientCopy.page THEN
> EVAL CopySome();
> IF desc[p - p0].gray THEN
> <* ASSERT p = impureTransientCopy.page *>
> InsertFiller(
> impureTransientCopy.ptr,
> impureTransientCopy.boundary - impureTransientCopy.ptr);
> impureTransientCopy.page := Nil;
> impureTransientCopy.ptr := NIL;
> impureTransientCopy.boundary := NIL;
> CleanBetween(PageToHeader(p), PageToHeader(p + 1));
> desc[p - p0].gray := FALSE;
> desc[p - p0].dirty := FALSE;
> IF perfOn THEN PerfChange(p, 1); END;
> IF ThreadF.myTxn = NIL
> OR map[p - p0] = NIL
> OR map[p - p0].writer = ThreadF.myTxn
> THEN
> IF desc[p - p0].generation = Generation.Older THEN
> <* ASSERT desc[p - p0].space = Space.Current *>
> Protect(p, Access.ReadOnly);
> END
> ELSIF map[p - p0].lastReader = ThreadF.myTxn THEN
> Protect(p, Access.ReadOnly);
> ELSE
> Protect(p, Access.None);
> END
> END
2245d4007
< <* ASSERT desc[p - p0].generation = Generation.Older *>
2246a4009,4027
> CleanBetween(PageToHeader(p), PageToHeader(p + 1));
> FOR i := 0 TO PageCount(p) - 1 DO
> desc[p + i - p0].gray := FALSE;
> desc[p + i - p0].dirty := FALSE;
> END;
> IF perfOn THEN PerfChange(p, PageCount(p)) END;
> IF ThreadF.myTxn = NIL
> OR map[p - p0] = NIL
> OR map[p - p0].writer = ThreadF.myTxn
> THEN
> IF desc[p - p0].generation = Generation.Older THEN
> <* ASSERT desc[p - p0].space = Space.Current *>
> Protect(p, Access.ReadOnly);
> END
> ELSIF map[p - p0].lastReader = ThreadF.myTxn THEN
> Protect(p, Access.ReadOnly);
> ELSE
> Protect(p, Access.None);
> END
2248,2263c4029,4030
< ThreadF.ResumeOthers();
< RETURN TRUE; (* was protected, protection cleared *)
< END Fault;
<
< (* ----------------------------------------------------------------------- *)
<
< (* The inner-loop collector action is to pick a gray page and completely
< clean it (i.e., make its referents at least gray, so that the page
< becomes black). The current gray page, "impureCopyPage" is
< distinguished; it's the page that newly gray objects are copied to.
<
< To improve locality of referene in the new space, we keep the set of
< gray pages as a stack. This helps approximate a depth-first copy to
< newspace. The current page is not a member of the stack, but will
< become one when it becomes full. The current page is always the page
< that contains newPtr.
---
> CollectorOff();
> END GrayFault;
2265,2268c4032,4041
< To reduce page faults, we separate the "pure" copy pages (those whose
< objects contain no REFs) from the "impure" ones (those with REFs). Only
< impure pages become gray, since pure pages can have no REFs into the old
< space (since they have no REFs at all). *)
---
> PROCEDURE OlderFault (p: Page) =
> BEGIN
> <* ASSERT desc[p - p0].resident *>
> <* ASSERT NOT desc[p - p0].pure *>
> p := FirstPage(p);
> <* ASSERT NOT desc[p - p0].dirty *>
> <* ASSERT desc[p - p0].generation = Generation.Older *>
> desc[p - p0].dirty := TRUE;
> Unprotect(p);
> END OlderFault;
2270,2273c4043,4054
< VAR
< impureCopyPage: Page := Nil; (* the current impure copy page *)
< impureCopyStack: Page := Nil; (* threaded through the "link" field; ends
< at Nil *)
---
> PROCEDURE CopyPage (page: RTDB.Page; READONLY data: RTHeapDep.PageData) =
> VAR
> p := page.p;
> q := FirstPage(p);
> BEGIN
> ThreadF.SuspendOthers();
> Unprotect(q);
> PageToData(p)^ := data;
> desc[p - p0].dirty := TRUE;
> Protect(q, Access.None);
> ThreadF.ResumeOthers();
> END CopyPage;
2275,2276c4056,4097
< (* By analogy, we also maintain "pureCopyPage" and "pureCopyStack". These
< are not used, but maintaining them simplifies the code. *)
---
> PROCEDURE PersistentFault (p: Page) RAISES { Thread.Aborted } =
> VAR page: RTDB.Page;
> BEGIN
> p := FirstPage(p);
> page := map[p - p0];
> <*ASSERT desc[p - p0].space = Space.Current*>
> IF desc[p - p0].resident THEN
> IF desc[p - p0].access = Access.None THEN
> IF page.lastReader # ThreadF.myTxn THEN
> TRY
> ThreadF.ResumeOthers();
> Thread.Acquire(page);
> page.readAccess();
> FINALLY
> Thread.Release(page);
> ThreadF.SuspendOthers();
> END;
> IF NOT desc[p - p0].resident THEN RETURN END;
> IF desc[p - p0].access # Access.None THEN RETURN END;
> page.lastReader := ThreadF.myTxn;
> END;
> Protect(p, Access.ReadOnly);
> ELSE
> <* ASSERT desc[p - p0].access = Access.ReadOnly *>
> IF page.writer # ThreadF.myTxn THEN
> TRY
> ThreadF.ResumeOthers();
> Thread.Acquire(page);
> page.writeAccess();
> FINALLY
> Thread.Release(page);
> ThreadF.SuspendOthers();
> END;
> IF NOT desc[p - p0].resident THEN RETURN END;
> IF desc[p - p0].access # Access.ReadOnly THEN RETURN END;
> page.writer := ThreadF.myTxn;
> END;
> desc[p - p0].dirty := NOT desc[p - p0].pure;
> Unprotect(p);
> END;
> RETURN;
> END;
2278,2281c4099,4131
< VAR
< pureCopyPage: Page; (* the current pure copy page *)
< pureCopyStack: Page; (* threaded through the "link" field; ends
< at Nil *)
---
> (* non-resident, so fault the page(s) *)
> <* ASSERT desc[p - p0].pure *>
> desc[p - p0].dirty := FALSE;
> FOR pp := p TO p + PageCount(p) - 1 DO
> IF desc[pp - p0].resident THEN RETURN END;
> IF desc[pp - p0].dirty THEN RETURN END;
> page := map[pp - p0];
> TRY
> ThreadF.ResumeOthers();
> Thread.Acquire(page);
> page.readAccess();
> page.read(CopyPage);
> FINALLY
> Thread.Release(page);
> ThreadF.SuspendOthers();
> END
> END;
>
> <* ASSERT NOT desc[p - p0].resident *>
> <* ASSERT desc[p - p0].dirty *>
> page := map[p - p0];
> <* ASSERT p = page.p *>
> VAR swizzler := NEW(Swizzler, db := page.db, page := page);
> BEGIN
> TRY
> Unprotect(p);
> desc[p - p0].pure := swizzler.swizzlePage();
> EXCEPT
> | Thread.Aborted =>
> Protect(p, Access.None);
> RAISE Thread.Aborted;
> END
> END;
2283,2285c4133,4144
< (* By analogy, we also maintain "newPage" and "newStack". As with
< pureCopyPage and pureCopyStack, these are not used, but maintaining them
< simplifies the code. *)
---
> desc[p - p0].resident := TRUE;
> desc[p - p0].dirty := FALSE;
> VAR d := desc[p - p0];
> BEGIN
> d.continued := TRUE;
> FOR pp := p+1 TO p + PageCount(p) - 1 DO
> desc[pp - p0] := d;
> END
> END;
> map[p - p0].lastReader := ThreadF.myTxn;
> Protect(p, Access.ReadOnly);
> END PersistentFault;
2287,2294c4146,4183
< VAR
< newPage: Page; (* the current new page *)
< newStack: Page; (* threaded through the "link" field; ends
< at Nil *)
<
< (* Minimum number of bytes by which to grow the heap. Setting it higher
< reduces the number of system calls; setting it lower keeps the heap a
< little smaller. *)
---
> PROCEDURE Fault (addr: ADDRESS): BOOLEAN =
> VAR p := LOOPHOLE(addr, INTEGER) DIV BytesPerPage;
> BEGIN
> TRY
> ThreadF.SuspendOthers();
> <* ASSERT RTHeapDep.VM *>
> <* NOWARN *><* ASSERT TRUE *>
> cycleCost :=
> cycleCost + RTHeapDep.VMFaultTime(); (* otherwise unaccounted for *)
> IF NOT (p0 <= p AND p < p1)
> OR desc[p - p0].space = Space.Unallocated THEN
> RETURN FALSE; (* not in heap *)
> END;
> IF desc[p - p0].access = Access.ReadWrite THEN
> RETURN TRUE; (* was protected, but not any more *)
> END;
>
> IF desc[p - p0].gray THEN
> GrayFault(p);
> ELSIF map[p - p0] # NIL THEN
> IF ThreadF.myTxn = NIL THEN
> IF desc[p - p0].resident THEN
> desc[p - p0].dirty := NOT desc[p - p0].pure;
> Unprotect(p);
> ELSE
> RETURN FALSE
> END
> ELSE
> PersistentFault(p); <*NOWARN*> (* Thread.Aborted *)
> END
> ELSE
> OlderFault(p);
> END;
> RETURN TRUE; (* was protected, now cleared *)
> FINALLY
> ThreadF.ResumeOthers();
> END
> END Fault;
2601c4490,4491
< WITH newDesc = NEW(UNTRACED REF ARRAY OF Desc, newSideSpan) DO
---
> WITH newDesc = NEW(UNTRACED REF ARRAY OF Desc, newSideSpan) DO
> WITH newMap = NEW(UNTRACED REF ARRAY OF RTDB.Page, newSideSpan) DO
2602a4493
> <* ASSERT map # NIL *>
2604c4495,4496
< newDesc[i + p0 - newP0] := desc[i];
---
> newDesc [i + p0 - newP0] := desc[i];
> newMap [i + p0 - newP0] := map[i];
2607c4499,4500
< newDesc[i - newP0].space := Space.Unallocated;
---
> newDesc [i - newP0].space := Space.Unallocated;
> newMap [i - newP0] := NIL;
2610c4503,4504
< newDesc[i - newP0].space := Space.Unallocated;
---
> newDesc [i - newP0].space := Space.Unallocated;
> newMap [i - newP0] := NIL;
2612a4507
> DISPOSE(map);
2615c4510,4512
< END;
---
> map := newMap;
> END
> END
2674a4572,4578
> VAR
> stats: RECORD
> print := FALSE;
> accuratePages, ambiguousPages := 0;
> objects, bytes: UNTRACED REF ARRAY OF INTEGER;
> END;
>
2680a4585,4589
> IF RTParams.IsPresent("stats") THEN
> stats.print := TRUE;
> stats.objects := NEW(UNTRACED REF ARRAY OF INTEGER, RT0u.nTypes);
> stats.bytes := NEW(UNTRACED REF ARRAY OF INTEGER, RT0u.nTypes);
> END;
Only in Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common: RTDB.i3
Only in Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common: RTHeapDB.i3
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTHeapDebug.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTHeapDebug.m3
25,27c25,27
< Map = REF ARRAY OF Word.T;
< IntList = REF ARRAY OF INTEGER;
< WRList = REF ARRAY OF WeakRef.T;
---
> Map = <*TRANSIENT*> REF ARRAY OF Word.T;
> IntList = <*TRANSIENT*> REF ARRAY OF INTEGER;
> WRList = <*TRANSIENT*> REF ARRAY OF WeakRef.T;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTHeapDep.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTHeapDep.i3
25c25,28
< TYPE Page = [0 .. Word.Divide(-1, AdrPerPage)];
---
> TYPE
> Page = [0 .. Word.Divide(-1, AdrPerPage)];
> Byte = BITS 8 FOR [0..16_FF];
> PageData = ARRAY [0..BytesPerPage-1] OF Byte;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTHeapEvent.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTHeapEvent.i3
27,30c27,31
< space := RTHeapRep.Space.Unallocated, generation :=
< RTHeapRep.Generation.Younger, pure := FALSE, note :=
< RTHeapRep.Note.Allocated, gray := FALSE, protected :=
< FALSE, continued := FALSE};
---
> space := RTHeapRep.Space.Unallocated,
> generation := RTHeapRep.Generation.Younger,
> pure := FALSE, note := RTHeapRep.Note.Allocated,
> gray := FALSE, access := RTHeapRep.Access.ReadWrite,
> continued := FALSE, resident := TRUE, dirty := TRUE};
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTHeapMap.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTHeapMap.i3
15c15,16
< TYPE Visitor <: V_; V_ = OBJECT METHODS apply (a: ADDRESS) END;
---
> TYPE Visitor <: V_;
> V_ = <*TRANSIENT*> ROOT OBJECT METHODS apply (a: ADDRESS) END;
21a23,24
> PROCEDURE DoWalkRef (t: RT0.TypeDefn; A: ADDRESS; v: Visitor);
>
30d32
<
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTHeapMap.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTHeapMap.m3
10a11
> IMPORT RTParams;
187c188
< | Op.Ref =>
---
> | Op.Ref, Op.TransientRef =>
229a231
> IF RTParams.IsPresent("debugmaps") THEN DEBUG := TRUE; END;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTHeapRep.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTHeapRep.i3
18c18
< IMPORT RT0, RTHeapDep;
---
> IMPORT RT0, RTHeapDep, RTDB;
56c56,58
< VAR desc: UNTRACED REF ARRAY OF Desc;
---
> VAR
> desc: UNTRACED REF ARRAY OF Desc;
> map : UNTRACED REF ARRAY OF RTDB.Page;
65c67
< protected : BITS 1 FOR BOOLEAN;
---
> access : BITS 2 FOR Access;
66a69,70
> resident : BITS 1 FOR BOOLEAN;
> dirty : BITS 1 FOR BOOLEAN;
69a74,75
> TYPE Access = {None, ReadOnly, ReadWrite};
>
85a92,93
> Persistent, (* page promoted to current space because
> it is persistent *)
156a165,168
> PROCEDURE AllocForNewTransient (size, alignment: CARDINAL): ADDRESS;
> (* Return the address of "size" bytes of traced transientstorage on an
> "alignment" byte boundary. The storage is not zeroed. *)
>
209c221
< MonitorClosure <: OBJECT
---
> MonitorClosure <: <*TRANSIENT*> ROOT OBJECT
243c255
< RefVisitor = OBJECT
---
> RefVisitor = <*TRANSIENT*> ROOT OBJECT
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTHeapRep.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTHeapRep.m3
28c28
< PublicMonitorClosure = OBJECT
---
> PublicMonitorClosure = <*TRANSIENT*> ROOT OBJECT
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTHooks.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTHooks.i3
58a59,60
> PROCEDURE AllocateTransient (t: ADDRESS(*RT0.TypeDefn*)): REFANY;
>
60c62,65
< READONLY sizes: ArrayShape): REFANY;
---
> READONLY sizes: ArrayShape): REFANY;
>
> PROCEDURE AllocateTransientOpenArray (t: ADDRESS(*RT0.TypeDefn*);
> READONLY sizes: ArrayShape): REFANY;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTMapOp.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTMapOp.i3
32c32,33
< (*50*) SkipB_1, SkipB_2, SkipB_3, SkipB_4, SkipB_5, SkipB_6, SkipB_7, SkipB_8
---
> (*50*) SkipB_1, SkipB_2, SkipB_3, SkipB_4, SkipB_5, SkipB_6, SkipB_7, SkipB_8,
> (*58*) TransientRef
102c103,104
< Kind.Proc (* SkipB_8 *)
---
> Kind.Proc, (* SkipB_8 *)
> Kind.TransientRef (* TransientRef *)
166c168,169
< 8 (* SkipB_8 *)
---
> 8, (* SkipB_8 *)
> 0 (* TransientRef *)
228c231,232
< 0 (* SkipB_8 -> -n * Byte *)
---
> 0, (* SkipB_8 -> -n * Byte *)
> ADRSIZE(ADDRESS) (* TransientRef *)
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTTipe.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTTipe.i3
12c12
< T = OBJECT kind: Kind; size, align: INTEGER := 0; END;
---
> T = <*TRANSIENT*> ROOT OBJECT kind: Kind; size, align: INTEGER := 0; END;
39c39,41
< Field = REF RECORD type: T; next: Field; offset: INTEGER := 0; END;
---
> Field = <*TRANSIENT*> REF RECORD
> type: T; next: Field; offset: INTEGER := 0;
> END;
Only in Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common: RTTxn.i3
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTType.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTType.m3
118a119
> troot : RT0.TypeDefn;
381a383
> troot := FindType (16_ffffffffa973d3a6);
397a400
> AssignObjectTypecode (troot, next_typecode);
479a483
> FixObjectSizes (troot);
529a534
> SetupObject (troot);
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTTypeMap.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTTypeMap.i3
8a9,10
> IMPORT RT0;
>
27c29,30
< Set (* bit set *)
---
> Set, (* bit set *)
> TransientRef (* transient ref *)
31c34,35
< V_ = OBJECT METHODS apply (field: ADDRESS; k: Kind) RAISES ANY END;
---
> V_ = <*TRANSIENT*> ROOT OBJECT METHODS apply (field: ADDRESS; k: Kind)
> RAISES ANY END;
38c42,43
< END RTTypeMap.
---
> PROCEDURE DoWalkRef (t: RT0.TypeDefn; a: ADDRESS; m: Mask; v: Visitor)
> RAISES ANY;
39a45
> END RTTypeMap.
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTTypeMap.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTTypeMap.m3
103c103
< | Op.Ref, Op.UntracedRef, Op.Proc,
---
> | Op.Ref, Op.UntracedRef, Op.TransientRef, Op.Proc,
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTutils.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/common/RTutils.m3
26,28c26,28
< R = REF ARRAY OF TypeDesc;
< Map = REF ARRAY OF INTEGER;
< StatList = REF ARRAY OF Stat;
---
> R = <*TRANSIENT*> REF ARRAY OF TypeDesc;
> Map = <*TRANSIENT*> REF ARRAY OF INTEGER;
> StatList = <*TRANSIENT*> REF ARRAY OF Stat;
266a267
> p : INTEGER := LOOPHOLE(ref, INTEGER) DIV RTHeapRep.BytesPerPage;
277,285c278,288
< (* totals for this type on a per-site basis *)
< n_sites := RTAllocStats.NSites (tc);
< IF (n_sites >= 0) THEN
< IF (zz.sites = NIL) THEN zz.sites := NEW (StatList, n_sites+1); END;
< addr := LOOPHOLE (ref, ADDRESS);
< hdr := LOOPHOLE (addr - BYTESIZE(RT0.RefHeader), RTHeapRep.RefHeader);
< site := hdr.spare;
< INC (zz.sites[site].count);
< INC (zz.sites[site].size, size);
---
> IF NOT RTHeapRep.map[p - RTHeapRep.p0] # NIL THEN
> (* totals for this type on a per-site basis *)
> n_sites := RTAllocStats.NSites (tc);
> IF (n_sites >= 0) THEN
> IF (zz.sites = NIL) THEN zz.sites := NEW (StatList, n_sites+1); END;
> addr := LOOPHOLE (ref, ADDRESS);
> hdr := LOOPHOLE (addr - BYTESIZE(RT0.RefHeader), RTHeapRep.RefHeader);
> site := hdr.spare;
> INC (zz.sites[site].count);
> INC (zz.sites[site].size, size);
> END;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/FreeBSD/DEFS.h Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/FreeBSD/DEFS.h
38c38
< * $Id: DEFS.h,v 1.1.1.1 1997/01/16 21:29:56 ldd Exp $
---
> * $Id: DEFS.h,v 1.1.1.1 1998/10/28 21:39:58 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/FreeBSD2/DEFS.h Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/FreeBSD2/DEFS.h
38c38
< * $Id: DEFS.h,v 1.1.1.1 1997/01/16 21:29:56 ldd Exp $
---
> * $Id: DEFS.h,v 1.1.1.1 1998/10/28 21:39:58 hosking Exp $
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/LINUXELF/RTHeapDep.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/LINUXELF/RTHeapDep.m3
51,53c51,55
< sa_handler := newHandler, sa_mask :=
< Word.LeftShift(1, Usignal.SIGVTALRM - 1),
< sa_flags := Usignal.SA_RESTART,
---
> sa_handler := newHandler,
> sa_mask :=
> Word.Or(Word.LeftShift(1, Usignal.SIGVTALRM - 1),
> Word.LeftShift(1, Usignal.SIGINT - 1)),
> sa_flags := Word.Or(Usignal.SA_RESTART, Usignal.SA_NODEFER),
149c151
< VAR ret := Uresource.getrusage(Uresource.RUSAGE_SELF, ADR(usage));
---
> VAR ret := Uresource.getrusage(Uresource.RUSAGE_SELF, usage);
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/LINUXLIBC6/RTHeapDepC.c Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/LINUXLIBC6/RTHeapDepC.c
567c567
< int getitimer(enum __itimer_which which, struct itimerval *value)
---
> int getitimer(int which, struct itimerval *value)
613c613
< int getrlimit(enum __rlimit_resource resource, struct rlimit *rlp)
---
> int getrlimit(int resource, struct rlimit *rlim)
617,618c617,618
< MAKE_WRITABLE(rlp);
< result = syscall(SYS_getrlimit, resource, rlp);
---
> MAKE_WRITABLE(rlim);
> result = syscall(SYS_getrlimit, resource, rlim);
1275,1276c1275,1277
< int setitimer(enum __itimer_which which, const struct itimerval *value,
< struct itimerval *ovalue)
---
> int setitimer(int which,
> const struct itimerval *value,
> struct itimerval *ovalue)
1302c1303
< int setrlimit(enum __rlimit_resource resource, const struct rlimit *rlp)
---
> int setrlimit(int resource, const struct rlimit *rlim)
1306,1307c1307,1308
< MAKE_READABLE(rlp);
< result = syscall(SYS_setrlimit, resource, rlp);
---
> MAKE_READABLE(rlim);
> result = syscall(SYS_setrlimit, resource, rlim);
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/LINUXLIBC6/RTHeapDep.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/LINUXLIBC6/RTHeapDep.m3
53c53
< sa_flags := Usignal.SA_RESTART,
---
> sa_flags := Word.Or(Usignal.SA_RESTART, Usignal.SA_NODEFER),
59c59,60
< vec.sa_mask.val[0] := Word.LeftShift(1, Usignal.SIGVTALRM - 1);
---
> vec.sa_mask.val[0] := Word.Or(Word.LeftShift(1, Usignal.SIGVTALRM - 1),
> Word.LeftShift(1, Usignal.SIGINT - 1));
152c153
< VAR ret := Uresource.getrusage(Uresource.RUSAGE_SELF, ADR(usage));
---
> VAR ret := Uresource.getrusage(Uresource.RUSAGE_SELF, usage);
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/SOLgnu/RTHeapDep.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/SOLgnu/RTHeapDep.m3
54c54,55
< vec.sa_flags := Word.Or(Usignal.SA_RESTART, Usignal.SA_SIGINFO);
---
> vec.sa_flags := Word.Or(Usignal.SA_NODEFER,
> Word.Or(Usignal.SA_RESTART, Usignal.SA_SIGINFO));
58a60
> EVAL Usignal.sigaddset(vec.sa_mask, Usignal.SIGINT);
169c171
< ret := Uresource.getrusage(Uresource.RUSAGE_SELF, ADR(usage));
---
> ret := Uresource.getrusage(Uresource.RUSAGE_SELF, usage);
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/runtime/SOLsun/RTHeapDep.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/runtime/SOLsun/RTHeapDep.m3
54c54,55
< vec.sa_flags := Word.Or(Usignal.SA_RESTART, Usignal.SA_SIGINFO);
---
> vec.sa_flags := Word.Or(Usignal.SA_NODEFER,
> Word.Or(Usignal.SA_RESTART, Usignal.SA_SIGINFO));
58a60
> EVAL Usignal.sigaddset(vec.sa_mask, Usignal.SIGINT);
169c171
< ret := Uresource.getrusage(Uresource.RUSAGE_SELF, ADR(usage));
---
> ret := Uresource.getrusage(Uresource.RUSAGE_SELF, usage);
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/thread/Common/Thread.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/thread/Common/Thread.i3
13c13
< T <: ROOT;
---
> T <: <*TRANSIENT*> ROOT;
15c15
< Condition <: ROOT;
---
> Condition <: <*TRANSIENT*> ROOT;
23c23
< TYPE Closure = OBJECT METHODS apply(): REFANY END;
---
> TYPE Closure = <*TRANSIENT*> ROOT OBJECT METHODS apply(): REFANY END;
58a59,61
>
> EXCEPTION Aborted;
> (* Used to signal transaction abort. *)
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/thread/POSIX/ThreadF.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/thread/POSIX/ThreadF.i3
12c12
< IMPORT FloatMode, Thread;
---
> IMPORT FloatMode, Thread, RTTxn;
62c62
< Hooks = OBJECT METHODS
---
> Hooks = <*TRANSIENT*> ROOT OBJECT METHODS
78a79,86
>
> VAR (* READONLY *)
> myTxn: RTTxn.T;
> (* The txn of the currently running thread *)
>
> PROCEDURE TxnBegin(txn: RTTxn.T);
> PROCEDURE TxnCommit();
> PROCEDURE TxnAbort();
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/thread/POSIX/ThreadPosix.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/thread/POSIX/ThreadPosix.m3
18c18
< RTThread, RTIO, ThreadEvent, Time, TimePosix,
---
> RTThread, RTIO, RTTxn, RTHeapDB, ThreadEvent, Time, TimePosix,
29c29
< MUTEX = BRANDED "Mutex Posix-1.0" OBJECT
---
> MUTEX = <*TRANSIENT*> ROOT BRANDED "Mutex Posix-1.0" OBJECT
39c39
< Condition = BRANDED "Thread.Condition Posix-1.0" OBJECT
---
> Condition = <*TRANSIENT*> ROOT BRANDED "Thread.Condition Posix-1.0" OBJECT
69c69
< T = BRANDED "Thread.T Posix-1.6" OBJECT
---
> T = <*TRANSIENT*> ROOT BRANDED "Thread.T Posix-1.6" OBJECT
75c75
< result : REFANY := NIL;
---
> <*TRANSIENT*> result : REFANY := NIL;
101a102,104
> (* true if somebody aborted us and we did not TestAbort *)
> abortPending : BOOLEAN := FALSE;
>
114a118,120
>
> (* transaction support *)
> txn: RTTxn.T;
263a270,272
> (* and link into transaction *)
> t.txn := self.txn;
>
571c580
< FDS = REF ARRAY OF FDSet;
---
> FDS = <*TRANSIENT*> REF ARRAY OF FDSet;
816a826
> do_abort : BOOLEAN;
838c848,849
< IF t.alertable AND t.alertPending THEN
---
> IF t.alertable AND t.alertPending
> OR t.abortPending THEN
850a862,864
> IF t.abortPending THEN
> CanRun (t);
> EXIT; END;
853c867,868
< IF t.alertable AND t.alertPending THEN
---
> IF t.alertable AND t.alertPending
> OR t.abortPending THEN
869c884,885
< IF t.alertable AND t.alertPending THEN
---
> IF t.alertable AND t.alertPending
> OR t.abortPending THEN
938a955
> t.txn := NIL;
967,969c984,993
< do_alert := self.alertable AND self.alertPending;
< self.alertable := FALSE;
< IF do_alert THEN self.alertPending := FALSE END;
---
> do_abort := self.abortPending;
> IF do_abort THEN
> self.abortPending := FALSE;
> self.alertable := FALSE;
> self.alertPending := FALSE;
> ELSE
> do_alert := self.alertable AND self.alertPending;
> self.alertable := FALSE;
> IF do_alert THEN self.alertPending := FALSE END;
> END;
970a995
> IF do_abort THEN RAISE Aborted END; <*NOWARN*>
1210a1236,1238
> IF new_self.txn # NIL AND self.txn # new_self.txn THEN
> RTHeapDB.Transfer(self.txn, new_self.txn);
> END;
1212a1241
> myTxn := new_self.txn;
1267c1296
< OutT (" A* waiting for\n");
---
> OutT (" X A* waiting for\n");
1323a1353,1358
> (* abort status *)
> IF (t.abortPending)
> THEN OutT ("x ");
> ELSE OutT (" ");
> END;
>
1451c1486
< t := t.next;
---
> t := t.next;
1462a1498,1549
> (*------------------------------------------------------------- Txn hooks ---*)
>
> PROCEDURE TxnBegin(txn: RTTxn.T) =
> BEGIN
> INC (RT0u.inCritical);
> BEGIN
> txn.parent := self.txn;
> self.txn := txn;
> myTxn := self.txn;
> END;
> RTHeapDB.Transfer(txn.parent, txn);
> DEC (RT0u.inCritical);
> END TxnBegin;
>
> PROCEDURE TxnCommit() =
> VAR t: T;
> BEGIN
> INC (RT0u.inCritical);
> BEGIN
> t := self.next;
> WHILE t # self DO
> IF t.txn = self.txn THEN
> t.txn := t.txn.parent;
> END;
> t := t.next;
> END;
> self.txn := self.txn.parent;
> myTxn := self.txn;
> END;
> DEC (RT0u.inCritical);
> END TxnCommit;
>
> PROCEDURE TxnAbort() =
> VAR t: T;
> BEGIN
> INC (RT0u.inCritical);
> BEGIN
> t := self.next;
> WHILE t # self DO
> IF t.txn = self.txn THEN
> t.txn := t.txn.parent;
> t.abortPending := TRUE;
> END;
> t := t.next;
> END;
> self.txn := self.txn.parent;
> myTxn := self.txn;
> END;
> RTHeapDB.Abort();
> DEC (RT0u.inCritical);
> END TxnAbort;
>
1467a1555
> BEGIN
1476a1565
> myTxn := self.txn;
1481a1571
> END;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/thread/WIN32/ThreadWin32.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/thread/WIN32/ThreadWin32.m3
32c32
< Mutex = BRANDED "MUTEX Win32-1.0" OBJECT
---
> Mutex = <*TRANSIENT*> ROOT BRANDED "MUTEX Win32-1.0" OBJECT
39c39
< Condition = BRANDED "Thread.Condition Win32-1.0" OBJECT
---
> Condition = <*TRANSIENT*> BRANDED "Thread.Condition Win32-1.0" OBJECT
45c45
< T = BRANDED "Thread.T Win32-1.0" OBJECT
---
> T = <*TRANSIENT*> BRANDED "Thread.T Win32-1.0" OBJECT
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/time/WIN32/DateWin32.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/time/WIN32/DateWin32.m3
16c16,17
< REVEAL TimeZone = BRANDED OBJECT METHODS fromTime(t: Time.T): T END;
---
> REVEAL TimeZone
> = <*TRANSIENT*> ROOT BRANDED OBJECT METHODS fromTime(t: Time.T): T END;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/aix-3-2/Udir.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/aix-3-2/Udir.i3
15,16c15,16
< UdirRCSHeader = "$Header: /home/cvsroot/m3/pm3/libs/m3core/src/unix/aix-3-2/Udir.i3,v 1.1.1.1 1997/01/16 21:30:03 ldd Exp $";
< UdirDate = "$Date: 1997/01/16 21:30:03 $";
---
> UdirRCSHeader = "$Header: /u/u84/hosking/CVS/pm3/libs/m3core/src/unix/aix-3-2/Udir.i3,v 1.1.1.1 1998/10/28 21:40:21 hosking Exp $";
> UdirDate = "$Date: 1998/10/28 21:40:21 $";
67a68,70
> Revision 1.1.1.1 1998/10/28 21:40:21 hosking
> Polytechnique de Montreal Modula-3
>
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/aix-3-2/Udir.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/aix-3-2/Udir.m3
10,11c10,11
< UdirImplRCSHeader = "$Header: /home/cvsroot/m3/pm3/libs/m3core/src/unix/aix-3-2/Udir.m3,v 1.1.1.1 1997/01/16 21:30:03 ldd Exp $";
< UdirImplDate = "$Date: 1997/01/16 21:30:03 $";
---
> UdirImplRCSHeader = "$Header: /u/u84/hosking/CVS/pm3/libs/m3core/src/unix/aix-3-2/Udir.m3,v 1.1.1.1 1998/10/28 21:40:21 hosking Exp $";
> UdirImplDate = "$Date: 1998/10/28 21:40:21 $";
29a30,32
> Revision 1.1.1.1 1998/10/28 21:40:21 hosking
> Polytechnique de Montreal Modula-3
>
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/aix-3-2/Uresource.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/aix-3-2/Uresource.i3
78c78
< <*EXTERNAL*> PROCEDURE getrusage (who: int; rus: struct_rusage_star): int;
---
> <*EXTERNAL*> PROCEDURE getrusage (who: int; VAR rus: struct_rusage): int;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/aix-ps2-1-2/Udir.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/aix-ps2-1-2/Udir.i3
14,15c14,15
< UdirRCSHeader = "$Header: /home/cvsroot/m3/pm3/libs/m3core/src/unix/aix-ps2-1-2/Udir.i3,v 1.1.1.1 1997/01/16 21:30:04 ldd Exp $";
< UdirDate = "$Date: 1997/01/16 21:30:04 $";
---
> UdirRCSHeader = "$Header: /u/u84/hosking/CVS/pm3/libs/m3core/src/unix/aix-ps2-1-2/Udir.i3,v 1.1.1.1 1998/10/28 21:40:23 hosking Exp $";
> UdirDate = "$Date: 1998/10/28 21:40:23 $";
61a62,64
> Revision 1.1.1.1 1998/10/28 21:40:23 hosking
> Polytechnique de Montreal Modula-3
>
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/aix-ps2-1-2/Udir.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/aix-ps2-1-2/Udir.m3
10,11c10,11
< UdirImplRCSHeader = "$Header: /home/cvsroot/m3/pm3/libs/m3core/src/unix/aix-ps2-1-2/Udir.m3,v 1.1.1.1 1997/01/16 21:30:04 ldd Exp $";
< UdirImplDate = "$Date: 1997/01/16 21:30:04 $";
---
> UdirImplRCSHeader = "$Header: /u/u84/hosking/CVS/pm3/libs/m3core/src/unix/aix-ps2-1-2/Udir.m3,v 1.1.1.1 1998/10/28 21:40:23 hosking Exp $";
> UdirImplDate = "$Date: 1998/10/28 21:40:23 $";
29a30,32
> Revision 1.1.1.1 1998/10/28 21:40:23 hosking
> Polytechnique de Montreal Modula-3
>
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/aix-ps2-1-2/Uresource.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/aix-ps2-1-2/Uresource.i3
85c85
< <*EXTERNAL*> PROCEDURE getrusage (who: int; rus: struct_rusage_star): int;
---
> <*EXTERNAL*> PROCEDURE getrusage (who: int; VAR rus: struct_rusage): int;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/fbsd-alpha/Uresource.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/fbsd-alpha/Uresource.i3
94c94
< <*EXTERNAL*> PROCEDURE getrusage (who: int; rus: struct_rusage_star): int;
---
> <*EXTERNAL*> PROCEDURE getrusage (who: int; VAR rus: struct_rusage): int;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/freebsd-1/Uresource.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/freebsd-1/Uresource.i3
95c95
< <*EXTERNAL*> PROCEDURE getrusage (who: int; rus: struct_rusage_star): int;
---
> <*EXTERNAL*> PROCEDURE getrusage (who: int; VAR rus: struct_rusage): int;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/freebsd-2/Uresource.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/freebsd-2/Uresource.i3
94c94
< <*EXTERNAL*> PROCEDURE getrusage (who: int; rus: struct_rusage_star): int;
---
> <*EXTERNAL*> PROCEDURE getrusage (who: int; VAR rus: struct_rusage): int;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/freebsd-3/Uresource.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/freebsd-3/Uresource.i3
94c94
< <*EXTERNAL*> PROCEDURE getrusage (who: int; rus: struct_rusage_star): int;
---
> <*EXTERNAL*> PROCEDURE getrusage (who: int; VAR rus: struct_rusage): int;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/hpux-7-0/Uresource.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/hpux-7-0/Uresource.i3
83c83
< <*EXTERNAL*> PROCEDURE getrusage (who: int; rus: struct_rusage_star): int;
---
> <*EXTERNAL*> PROCEDURE getrusage (who: int; VAR rus: struct_rusage): int;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/ibm-4-3/Uresource.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/ibm-4-3/Uresource.i3
87c87
< <*EXTERNAL*> PROCEDURE getrusage (who: int; rus: struct_rusage_star): int;
---
> <*EXTERNAL*> PROCEDURE getrusage (who: int; VAR rus: struct_rusage): int;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/irix-5.2/Uresource.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/irix-5.2/Uresource.i3
90c90
< <*EXTERNAL*> PROCEDURE getrusage (who: int; rus: struct_rusage_star): int;
---
> <*EXTERNAL*> PROCEDURE getrusage (who: int; VAR rus: struct_rusage): int;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/linux/Uresource.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/linux/Uresource.i3
96c96
< <*EXTERNAL*> PROCEDURE getrusage (who: int; rus: struct_rusage_star): int;
---
> <*EXTERNAL*> PROCEDURE getrusage (who: int; VAR rus: struct_rusage): int;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/linux/Usignal.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/linux/Usignal.i3
122a123
> SA_NODEFER = SA_NOMASK;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/linux-libc6/Uresource.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/linux-libc6/Uresource.i3
96c96
< <*EXTERNAL*> PROCEDURE getrusage (who: int; rus: struct_rusage_star): int;
---
> <*EXTERNAL*> PROCEDURE getrusage (who: int; VAR rus: struct_rusage): int;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/linux-libc6/Usignal.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/linux-libc6/Usignal.i3
132a133
> SA_NODEFER = SA_NOMASK;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/osf-1.ALPHA_OSF/Usignal.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/osf-1.ALPHA_OSF/Usignal.i3
13c13
< IMPORT Utypes;
---
> FROM Utypes IMPORT caddr_t, size_t;
18,20c18,20
< SIGHUP = 1; (* hangup *)
< SIGINT = 2; (* interrupt *)
< SIGQUIT = 3; (* quit *)
---
> SIGHUP = 1; (* hangup, generated when terminal disconnects *)
> SIGINT = 2; (* interrupt, generated from terminal special char *)
> SIGQUIT = 3; (* quit, generated from terminal special char *)
25c25,26
< (* CHME, CHMS, CHMU are not yet given back to users reasonably *)
---
> ILL_INST_FAULT = 3; (* Illegal instruction *)
> ILL_MODE_FAULT = 4; (* Illegal mode - VMSPAL only *)
27c28
< SIGIOT = 6; (* IOT instruction *)
---
> SIGABRT = 6; (* abort process *)
30,39c31,47
< FPE_INTOVF_TRAP = 1; (* integer overflow *)
< FPE_INTDIV_TRAP = 2; (* integer divide by zero *)
< FPE_FLTOVF_TRAP = 3; (* floating overflow *)
< FPE_FLTDIV_TRAP = 4; (* floating/decimal divide by zero *)
< FPE_FLTUND_TRAP = 5; (* floating underflow *)
< FPE_DECOVF_TRAP = 6; (* decimal overflow *)
< FPE_SUBRNG_TRAP = 7; (* subscript out of range *)
< FPE_FLTOVF_FAULT = 8; (* floating overflow fault *)
< FPE_FLTDIV_FAULT = 9; (* divide by zero floating fault *)
< FPE_FLTUND_FAULT = 10; (* floating underflow fault *)
---
> FPE_INTOVF_TRAP = 16_1; (* integer overflow *)
> FPE_INTDIV_TRAP = 16_2; (* integer divide by zero *)
> FPE_FLTOVF_TRAP = 16_3; (* floating overflow *)
> FPE_FLTDIV_TRAP = 16_4; (* floating/decimal divide by zero *)
> FPE_FLTUND_TRAP = 16_5; (* floating underflow *)
> FPE_DECOVF_TRAP = 16_6; (* decimal overflow *)
> FPE_SUBRNG_TRAP = 16_7; (* subscript out of range *)
> FPE_FLTOVF_FAULT = 16_8; (* floating overflow fault *)
> FPE_FLTDIV_FAULT = 16_9; (* divide by zero floating fault *)
> FPE_FLTUND_FAULT = 16_a; (* floating underflow fault *)
> FPE_UNIMP_FAULT = 16_b; (* Unimplemented FPU instruction *)
> FPE_INVALID_FAULT = 16_c; (* Invalid operation *)
> FPE_INEXACT_FAULT = 16_d; (* Inexact result *)
> FPE_HPARITH_TRAP = 16_e; (* High performance trap *)
> FPE_INTOVF_FAULT = 16_f; (* Integer Overflow fault *)
> FPE_ILLEGAL_SHADOW_TRAP = 16_10; (* Illegal Trap Shadow Trap *)
> FPE_GENTRAP = 16_11; (* *)
41c49
< SIGBUS = 10; (* bus error *)
---
> SIGBUS = 10; (* bus error (specification exception) *)
45,46c53,54
< SIGALRM = 14; (* alarm clock *)
< SIGTERM = 15; (* software termination signal from kill *)
---
> SIGALRM = 14; (* alarm clock timeout *)
> SIGTERM = 15; (* software termination signal *)
48,59c56,67
< SIGSTOP = 17; (* sendable stop signal not from tty *)
< SIGTSTP = 18; (* stop signal from tty *)
< SIGCONT = 19; (* continue a stopped process *)
< SIGCHLD = 20; (* to parent on child stop or exit *)
< SIGTTIN = 21; (* to readers pgrp upon background tty read *)
< SIGTTOU = 22; (* like TTIN for output if (tp->t_local<OSTOP) *)
< SIGIO = 23; (* input/output possible signal *)
< SIGXCPU = 24; (* exceeded CPU time limit *)
< SIGXFSZ = 25; (* exceeded file size limit *)
< SIGVTALRM = 26; (* virtual time alarm *)
< SIGPROF = 27; (* profiling time alarm *)
< SIGWINCH = 28; (* window size changes *)
---
> SIGSTOP = 17; (* stop (cannot be caught or ignored) *)
> SIGTSTP = 18; (* interactive stop *)
> SIGCONT = 19; (* continue if stopped *)
> SIGCHLD = 20; (* sent to parent on child stop or exit *)
> SIGTTIN = 21; (* background read attempted from control terminal *)
> SIGTTOU = 22; (* background write attempted to control terminal *)
> SIGPOLL = 23; (* I/O possible, or completed *)
> SIGXCPU = 24; (* cpu time limit exceeded (see setrlimit()) *)
> SIGXFSZ = 25; (* file size limit exceeded (see setrlimit()) *)
> SIGVTALRM = 26; (* virtual time alarm (see setitimer) *)
> SIGPROF = 27; (* profiling time alarm (see setitimer) *)
> SIGWINCH = 28; (* window size changed *)
61,62c69,80
< SIGUSR1 = 30; (* User signal 1 (from SysV) *)
< SIGUSR2 = 31; (* User signal 2 (from SysV) *)
---
> SIGUSR1 = 30; (* user defined signal 1 *)
> SIGUSR2 = 31; (* user defined signal 2 *)
> SIGRESV = 32; (* reserved by Digital for future use *)
>
> (* additional signal names supplied for compatibility, only *)
> SIGIOINT = SIGURG; (* printer to backend error signal *)
> SIGIO = SIGPOLL; (* STREAMS version of this signal *)
> SIGAIO = SIGIO; (* base lan i/o *)
> SIGPTY = SIGIO; (* pty i/o *)
> SIGIOT = SIGABRT; (* abort (terminate) process *)
> SIGLOST = SIGIOT; (* old BSD signal ?? *)
> SIGPWR = SIGINFO; (* Power Fail/Restart -- SVID3/SVR4 *)
64d81
< (* System V definitions *)
66c83,87
< SIGABRT = SIGIOT;
---
>
> (* values of "how" argument to sigprocmask() call *)
> SIG_BLOCK = 1;
> SIG_UNBLOCK = 2;
> SIG_SETMASK = 3;
71,79c92,104
< SignalHandler =
< PROCEDURE (sig, code: int; scp: UNTRACED REF struct_sigcontext);
<
< sigset_t = int;
<
< struct_sigvec = RECORD
< sv_handler: SignalHandler; (* signal handler *)
< sv_mask: sigset_t; (* signal mask to apply *)
< sv_flags: int; (* see signal options below *)
---
> SignalHandler = PROCEDURE (sig: int;
> sip: UNTRACED REF siginfo_t;
> scp: UNTRACED REF struct_sigcontext);
>
> pid_t = int;
>
> sigset_t = unsigned_long;
>
> struct_sigaction = RECORD
> sa_handler : SignalHandler; (* signal handler *)
> sa_mask : sigset_t; (* signals to block while in handler *)
> sa_flags : int; (* signal action flags *)
> sa_signo : int; (* signal number *)
83,84c108,116
< empty_sigset_t : sigset_t = 0;
< empty_sv_mask : sigset_t = 0;
---
> (* valid flags define for sa_flag field of sigaction structure *)
> SA_ONSTACK = 16_0001; (* run on special signal stack *)
> SA_RESTART = 16_0002; (* restart system calls on sigs *)
> SA_NOCLDSTOP = 16_0004; (* do not set SIGCHLD for child stops *)
> SA_NODEFER = 16_0008; (* don't block while handling *)
> SA_RESETHAND = 16_0010; (* old sys5 style behavior *)
> SA_NOCLDWAIT = 16_0020; (* no zombies *)
> SA_SIGINFO = 16_0040; (* deliver siginfo to handler *)
> SA_CLDNOTIFY = 16_0080; (* deliver siginfo when exiting *)
86,95c118,121
< CONST
< SV_ONSTACK = 16_0001; (* take signal on signal stack *)
< SV_INTERRUPT = 16_0002; (* do not restart system on signal return *)
< SA_NOCLDSTOP = 16_0004; (* Don't generate SIGCLD when children stop *)
< SV_OLDSIG = 16_1000; (* Emulate old signal() for POSIX *)
<
< (* Defines for "how" argument of sigprocmask() call. POSIX. *)
< SIG_BLOCK = 1; (* Add these signals to block mask *)
< SIG_UNBLOCK = 2; (* Remove these signals from block mask *)
< SIG_SETMASK = 3; (* Set block mask to this mask *)
---
>
> (* Max siginfo size -- 128 bytes altogether (used to pad siginfo) *)
> SI_MAX_SIZE = 128;
> SI_PAD_SIZE = (SI_MAX_SIZE DIV BYTESIZE(int)) - 4;
98,100c124,128
< struct_sigstack = RECORD
< ss_sp: ADDRESS; (* signal stack pointer *)
< ss_onstack: int; (* current status *)
---
> siginfo_t = RECORD
> si_signo: int; (* signal number *)
> si_errno: int; (* error number *)
> si_code : int; (* signal code *)
> si_pad : ARRAY [1..SI_PAD_SIZE] OF int; (* reserve space for fields *)
103,115c131,137
< (*
< * Information pushed on stack when a signal is delivered.
< * This is used by the kernel to restore state following
< * execution of the signal handler. It is also made available
< * to the handler to allow it to properly restore state if
< * a non-standard exit is performed.
< *
< * WARNING: THE sigcontext MUST BE KEPT CONSISTENT WITH /usr/include/setjmp.h
< * AND THE LIBC ROUTINES setjmp() AND longjmp()
< *
< *)
< TYPE
< longV = ARRAY [0..31] OF long; (* room for 32 registers *)
---
> (* SIGILL, SIGFPE, SIGSEGV, SIGBUS *)
> siginfo_t_fault = RECORD
> si_signo: int; (* signal number *)
> si_errno: int; (* error number *)
> si_code : int; (* signal code *)
> si_addr : caddr_t; (* faulting instruction/memory ref. *)
> END;
117d138
< TYPE
119,152c140,164
< (*-----------------------------------------------------------------------
< * BEGIN REGION THAT MUST AGREE WITH jmp_buf REGION IN setjmp.h
< *)
< sc_onstack : long; (* sigstack state to restore *)
< sc_mask : long; (* signal mask to restore *)
< sc_pc : long; (* pc at time of signal *)
< sc_ps : long; (* psl to restore *)
<
< (*
< * General purpose registers
< *)
< sc_regs : longV; (* processor regs 0 to 31 *)
< sc_ownedfp : long; (* fp has been used *)
< sc_fpregs : longV; (* fp regs 0 to 31 *)
< sc_fpcr : unsigned_long; (* floating point control register *)
< sc_fp_control : unsigned_long; (* software fpcr *)
<
< (* END OF REGION THAT MUST AGREE WITH jmp_buf REGION IN setjmp.h
< -----------------------------------------------------------------------*)
<
< sc_reserved1 : long; (* reserved for kernel *)
< sc_kreserved1 : int; (* reserved for kernel *)
< sc_kreserved2 : int; (* reserved for kernel *)
<
< sc_ssize : Utypes.size_t; (* stack size *)
< sc_sbase : Utypes.caddr_t; (* stack start *)
<
< sc_traparg_a0 : unsigned_long; (* a0 argument to trap on exception *)
< sc_traparg_a1 : unsigned_long; (* a1 argument to trap on exception *)
< sc_traparg_a2 : unsigned_long; (* a2 argument to trap on exception *)
<
< sc_fp_trap_pc : unsigned_long; (* imprecise pc *)
< sc_fp_trigger_sum : unsigned_long; (* exception summary at trigger pc *)
< sc_fp_trigger_inst : unsigned_long; (* instruction at trigger pc *)
---
> sc_onstack : long; (* sigstack state to restore *)
> sc_mask : long; (* signal mask to restore *)
> sc_pc : long; (* pc at time of signal *)
> sc_ps : long; (* psl to restore *)
> sc_regs : ARRAY [0..31] OF long; (* processor regs 0 to 31 *)
> sc_ownedfp : long; (* fp has been used *)
> sc_fpregs : ARRAY [0..31] OF long; (* fp regs 0 to 31 *)
> sc_fpcr : unsigned_long; (* floating point control register *)
> sc_fp_control: unsigned_long; (* software fpcr *)
> sc_reserved1 : long; (* reserved for kernel *)
> sc_kreserved1: int; (* reserved for kernel *)
> sc_kreserved2: int; (* reserved for kernel *)
> sc_ssize : size_t; (* stack size *)
> sc_sbase : caddr_t; (* stack start *)
> sc_traparg_a0: unsigned_long; (* a0 argument to trap on exception *)
> sc_traparg_a1: unsigned_long; (* a1 argument to trap on exception *)
> sc_traparg_a2: unsigned_long; (* a2 argument to trap on exception *)
> sc_fp_trap_pc: unsigned_long; (* imprecise pc *)
> sc_fp_trigger_sum: unsigned_long; (* Exception summary at trigger pc *)
> sc_fp_trigger_inst: unsigned_long; (* Instruction at trigger pc *)
> END;
>
> struct_sigstack = RECORD
> ss_sp: ADDRESS; (* signal stack pointer *)
> ss_onstack: int; (* current status *)
155,156d166
< CONST
< R_SP = 30; (* index of stack pointer in sc_regs above *)
161,166c171
< BADSIG, SIG_ERR, SIG_DFL, SIG_IGN: SignalHandler;
<
<
< (* Convert a signal number to a mask suitable for sigblock(). *)
< <*INLINE*>
< PROCEDURE sigmask (n: int): int;
---
> BADSIG, SIG_ERR, SIG_DFL, SIG_IGN, SIG_HOLD, SIG_CATCH: SignalHandler;
172c177
< PROCEDURE kill (pid, sig: int): int;
---
> PROCEDURE kill (pid: pid_t; sig: int): int;
178c183
< PROCEDURE killpg (pgrp, sig: int): int;
---
> PROCEDURE killpg (pgrp: pid_t; sig: int): int;
181c186
< (*** sigblock(2) - block signals ***)
---
> (*** sigaction(2) - Specifies the action to take upon delivery of a signal ***)
184c189,191
< PROCEDURE sigblock (mask: int): int;
---
> PROCEDURE sigaction (sig: int;
> READONLY new: struct_sigaction;
> VAR old: struct_sigaction): int;
187,188c194
< (*** sigpause(2) - atomically release blocked signals and wait for
< interrupt ***)
---
> (*** sigprocmask(2) - Sets the current signal mask ***)
191c197,199
< PROCEDURE sigpause (sigmask: int): int;
---
> PROCEDURE sigprocmask (how: int;
> READONLY new: sigset_t;
> old: UNTRACED REF sigset_t := NIL): int;
194c202,203
< (*** sigpending(2) - examine pending signals ***)
---
> (*** sigsuspend(2) - Atomically changes the set of blocked signals and waits
> for a signal ***)
197c206
< PROCEDURE sigpending (VAR set: sigset_t): int;
---
> PROCEDURE sigsuspend (READONLY mask: sigset_t): int;
200c209
< (*** sigsetmask(2) - set current signal mask ***)
---
> (*** sigpending(2) - Examines pending signals ***)
203c212,213
< PROCEDURE sigsetmask (mask: int): int;
---
> PROCEDURE sigpending (VAR set: sigset_t): int;
>
204a215,216
> (*** sigemptyset, sigfillset, sigaddset, sigdelset, sigismember(3) - Creates
> and manipulates signal masks ***)
206c218,219
< (*** sigstack(2) - set and/or get signal stack context ***)
---
> <*EXTERNAL*>
> PROCEDURE sigemptyset (VAR set: sigset_t): int;
209c222
< PROCEDURE sigstack (VAR ss, oss: struct_sigstack): int;
---
> PROCEDURE sigfillset (VAR set: sigset_t): int;
210a224,225
> <*EXTERNAL*>
> PROCEDURE sigaddset (VAR set: sigset_t; signo: int): int;
212c227,228
< (*** sigvec(2) - software signal facilities ***)
---
> <*EXTERNAL*>
> PROCEDURE sigdelset (VAR set: sigset_t; signo: int): int;
215c231
< PROCEDURE sigvec (sig: int; VAR vec, ovec: struct_sigvec): int;
---
> PROCEDURE sigismember (VAR set: sigset_t; signo: int): int;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/osf-1.ALPHA_OSF/Usignal.m3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/osf-1.ALPHA_OSF/Usignal.m3
9,12d8
< IMPORT Word, Ctypes;
< FROM Ctypes IMPORT int;
<
< PROCEDURE sigmask (n: int): int =
14,21c10,15
< RETURN Word.Shift (1, n-1);
< END sigmask;
<
< BEGIN
< BADSIG := LOOPHOLE (-1, SignalHandler);
< SIG_ERR := LOOPHOLE (-1, SignalHandler);
< SIG_DFL := LOOPHOLE ( 0, SignalHandler);
< SIG_IGN := LOOPHOLE ( 1, SignalHandler);
---
> BADSIG := LOOPHOLE (-1, SignalHandler);
> SIG_ERR := LOOPHOLE (-1, SignalHandler);
> SIG_DFL := LOOPHOLE ( 0, SignalHandler);
> SIG_IGN := LOOPHOLE ( 1, SignalHandler);
> SIG_HOLD := LOOPHOLE ( 2, SignalHandler);
> SIG_CATCH := LOOPHOLE ( 3, SignalHandler);
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/osf-1.generic/Uresource.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/osf-1.generic/Uresource.i3
90c90
< <*EXTERNAL*> PROCEDURE getrusage (who: int; rus: struct_rusage_star): int;
---
> <*EXTERNAL*> PROCEDURE getrusage (who: int; VAR rus: struct_rusage): int;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/solaris-2-x/Uresource.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/solaris-2-x/Uresource.i3
87c87
< <*EXTERNAL*> PROCEDURE getrusage (who: int; rus: struct_rusage_star): int;
---
> <*EXTERNAL*> PROCEDURE getrusage (who: int; VAR rus: struct_rusage): int;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/sunos-4-x/Uresource.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/sunos-4-x/Uresource.i3
85c85
< <*EXTERNAL*> PROCEDURE getrusage (who: int; rus: struct_rusage_star): int;
---
> <*EXTERNAL*> PROCEDURE getrusage (who: int; VAR rus: struct_rusage): int;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/sysv-4.0/Uresource.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/sysv-4.0/Uresource.i3
87c87
< <*EXTERNAL*> PROCEDURE getrusage (who: int; rus: struct_rusage_star): int;
---
> <*EXTERNAL*> PROCEDURE getrusage (who: int; VAR rus: struct_rusage): int;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/unix/ultrix-3-1.generic/Uresource.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/unix/ultrix-3-1.generic/Uresource.i3
85c85
< <*EXTERNAL*> PROCEDURE getrusage (who: int; rus: struct_rusage_star): int;
---
> <*EXTERNAL*> PROCEDURE getrusage (who: int; VAR rus: struct_rusage): int;
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/m3core/src/weakref/WeakRef.i3 Persistent_M3/pm3-1.1.15-unpacked/libs/m3core/src/weakref/WeakRef.i3
79a80,81
> CONST Brand = "WeakRef";
>
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/set/src/m3makefile Persistent_M3/pm3-1.1.15-unpacked/libs/set/src/m3makefile
16,19d15
< MkSet("Atom", "Atom")
< MkSetDef("Atom", "Atom")
< MkSetList("Atom", "Atom")
<
23a20,23
> MkTransientSet("Int", "Integer")
> MkTransientSetDef("Int", "Integer")
> MkTransientSetList("Int", "Integer")
>
27a28,31
> MkTransientSet("Text", "Text")
> MkTransientSetDef("Text", "Text")
> MkTransientSetList("Text", "Text")
>
29a34,36
>
> MkTransientSet("Ref", "RefanyTransient")
> MkTransientSetList("Ref", "RefanyTransient")
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/set/src/SetDef.mg Persistent_M3/pm3-1.1.15-unpacked/libs/set/src/SetDef.mg
6,7c6,7
< GENERIC MODULE SetDef(Elem, ElemSet, ElemRefTable);
< (* WHERE "ElemSet = Set(Elem)" and "ElemRefTable = Table(Elem, Refany)". *)
---
> GENERIC MODULE SetDef(Elem, ElemSet, ElemRefTable, Ref);
> (* WHERE "ElemSet = Set(Elem)" and "ElemRefTable = Table(Elem, Ref)". *)
55c55
< VAR dummy: REFANY; BEGIN
---
> VAR dummy: Ref.T; BEGIN
63c63
< VAR dummy: REFANY; BEGIN
---
> VAR dummy: Ref.T; BEGIN
110c110
< dummy: REFANY;
---
> dummy: Ref.T;
129c129
< VAR dummy: REFANY; BEGIN
---
> VAR dummy: Ref.T; BEGIN
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/set/src/Set.ig Persistent_M3/pm3-1.1.15-unpacked/libs/set/src/Set.ig
9c9
< GENERIC INTERFACE Set(Elem);
---
> GENERIC INTERFACE Set(Super, Elem);
28c28
< Public = OBJECT METHODS
---
> Public = Super.T OBJECT METHODS
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/set/src/set.tmpl Persistent_M3/pm3-1.1.15-unpacked/libs/set/src/set.tmpl
12c12
< readonly proc MkSet (nm, elem) is
---
> readonly proc MkSet(nm, elem) is
14c14
< build_generic_intf (set, "Set", [elem], VISIBLE)
---
> build_generic_intf (set, "Set", ["Root", elem], VISIBLE)
18c18
< readonly proc mkSet (nm, elem) is
---
> readonly proc mkSet(nm, elem) is
20c20,32
< build_generic_intf (set, "Set", [elem], HIDDEN)
---
> build_generic_intf (set, "Set", ["Root", elem], HIDDEN)
> build_generic_impl (set, "Set", [elem])
> end
>
> readonly proc MkTransientSet(nm, elem) is
> local set = nm & "TransientSet"
> build_generic_intf (set, "Set", ["RootTransient", elem], VISIBLE)
> build_generic_impl (set, "Set", [elem])
> end
>
> readonly proc mkTransientSet(nm, elem) is
> local set = nm & "TransientSet"
> build_generic_intf (set, "Set", ["RootTransient", elem], HIDDEN)
33c45
< build_generic_impl (setDef, "SetDef", [elem, set, elemRefTbl])
---
> build_generic_impl (setDef, "SetDef", [elem, set, elemRefTbl, "Refany"])
41c53,69
< build_generic_impl (setDef, "SetDef", [elem, set, elemRefTbl])
---
> build_generic_impl (setDef, "SetDef", [elem, set, elemRefTbl, "Refany"])
> end
>
> readonly proc MkTransientSetDef (nm, elem) is
> local set = nm & "TransientSet"
> local setDef = nm & "TransientSetDef"
> local elemRefTbl = nm & "RefTransientTbl"
> build_generic_intf (setDef, "SetDef", [set], VISIBLE)
> build_generic_impl (setDef, "SetDef", [elem, set, elemRefTbl, "RefanyTransient"])
> end
>
> readonly proc mkTransientSetDef (nm, elem) is
> local set = nm & "TransientSet"
> local setDef = nm & "TransientSetDef"
> local elemRefTbl = nm & "RefTransientTbl"
> build_generic_intf (setDef, "SetDef", [set], HIDDEN)
> build_generic_impl (setDef, "SetDef", [elem, set, elemRefTbl, "RefanyTransient"])
59a88,103
> build_generic_intf (setList, "SetList", [set], HIDDEN)
> build_generic_impl (setList, "SetList", [elem, set, elemList])
> end
>
> readonly proc MkTransientSetList (nm, elem) is
> local set = nm & "TransientSet"
> local setList = nm & "TransientSetList"
> local elemList = nm & "TransientList"
> build_generic_intf (setList, "SetList", [set], VISIBLE)
> build_generic_impl (setList, "SetList", [elem, set, elemList])
> end
>
> readonly proc mkTransientSetList (nm, elem) is
> local set = nm & "TransientSet"
> local setList = nm & "TransientSetList"
> local elemList = nm & "TransientList"
diff -r PolyMTL/pm3-1.1.15-unpacked/libs/sortedtableextras/src/m3makefile Persistent_M3/pm3-1.1.15-unpacked/libs/sortedtableextras/src/m3makefile
7d6
< m3_option ("-O") % compile optimized code
40,49c39,48
< if (AT_SRC)
< include ("tex.quake")
< local_frag ("Intro")
< local_ig ("RedBlackTbl")
< local_ig ("SkipListTbl")
< local_frag ("Memory")
< local_frag ("Performance")
< local_frag ("Conclusions")
< Document ("SortedTableExtras")
< end
---
> %if (AT_SRC)
> % include ("tex.quake")
> % local_frag ("Intro")
> % local_ig ("RedBlackTbl")
> % local_ig ("SkipListTbl")
> % local_frag ("Memory")
> % local_frag ("Performance")
> % local_frag ("Conclusions")
> % Document ("SortedTableExtras")
> %end
Only in Persistent_M3/pm3-1.1.15-unpacked/libs/sortedtableextras/src: SortedTableExtras.pdf
diff -r PolyMTL/pm3-1.1.15-unpacked/m3config/src/SOLgnu Persistent_M3/pm3-1.1.15-unpacked/m3config/src/SOLgnu
29a30
> SONAME_OPTION = ["-h"]
diff -r PolyMTL/pm3-1.1.15-unpacked/m3config/src/SOLsun Persistent_M3/pm3-1.1.15-unpacked/m3config/src/SOLsun
29a30
> SONAME_OPTION = ["-h"]
Only in Persistent_M3/pm3-1.1.15-unpacked/m3config/src: VERSION
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/NetObjMon.i3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/netobj/src/NetObjMon.i3
12c12
< IMPORT NetObj, RefList, Thread;
---
> IMPORT NetObj, RefTransientList AS RefList, Thread;
20c20
< dump (): REFANY (* NGCMonitor.Dump *)
---
> dump (): <*TRANSIENT*> REFANY (* NGCMonitor.Dump *)
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/NetObjMon.m3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/netobj/src/NetObjMon.m3
10c10,11
< IMPORT NetObj, NGCMonitor, Fmt, Params, Process, RefList, Thread;
---
> IMPORT NetObj, NGCMonitor, Fmt, Params, Process, RefTransientList AS RefList,
> Thread;
32c33
< PROCEDURE Dump(<*UNUSED*>m: TT) : REFANY =
---
> PROCEDURE Dump(<*UNUSED*>m: TT) : <*TRANSIENT*> REFANY =
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/NetObjMon_T_v1.i3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/netobj/src/NetObjMon_T_v1.i3
6c6
< IMPORT RefList, Wr, Thread, StubLib, NetObj, Rd, NetObjMon;
---
> IMPORT RefTransientList AS RefList, Wr, Thread, StubLib, NetObj, Rd, NetObjMon;
14,15c14,15
< PROCEDURE Surrogate_dump(self: NetObjMon.T): REFANY RAISES {NetObj.Error,
< Thread.Alerted};
---
> PROCEDURE Surrogate_dump(self: NetObjMon.T): <*TRANSIENT*> REFANY
> RAISES {NetObj.Error, Thread.Alerted};
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/NetObjMon_T_v1.m3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/netobj/src/NetObjMon_T_v1.m3
6c6
< IMPORT RefList, Wr, Thread, StubLib, NetObj, Rd, NetObjMon;
---
> IMPORT RefTransientList AS RefList, Wr, Thread, StubLib, NetObj, Rd, NetObjMon;
13,14c13,14
< PROCEDURE Surrogate_dump(self: NetObjMon.T): REFANY RAISES {NetObj.Error,
< Thread.Alerted} =
---
> PROCEDURE Surrogate_dump(self: NetObjMon.T): <*TRANSIENT*> REFANY
> RAISES {NetObj.Error, Thread.Alerted} =
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/AgentStubs.m3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/AgentStubs.m3
240c240
< varVList: REF VersionList;
---
> varVList: <*TRANSIENT*> REF VersionList;
247c247
< varVList := NEW(REF VersionList, inVListLen);
---
> varVList := NEW(<*TRANSIENT*> REF VersionList, inVListLen);
276c276
< varBatch: REF CleanBatch;
---
> varBatch: <*TRANSIENT*> REF CleanBatch;
281c281
< varBatch := NEW(REF CleanBatch, inBatchLen);
---
> varBatch := NEW(<*TRANSIENT*> REF CleanBatch, inBatchLen);
Only in PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt: DirtyTbl.i3
Only in PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt: DirtyTbl.m3
Only in PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt: FPRefTbl.i3
Only in PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt: FPRefTbl.m3
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/m3makefile Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/m3makefile
36,38c36,38
< module ("ObjTbl")
< module ("DirtyTbl")
< module ("FPRefTbl")
---
> transientTable ("Obj", "WireRep", "ObjElem")
> transientTable ("Dirty", "WireRep", "DirtyElem")
> transientTable ("FPRef", "Fingerprint", "RefanyTransient")
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/NetObj.i3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/NetObj.i3
60,61c60,61
< T <: ROOT;
< Address <: REFANY;
---
> T <: <*TRANSIENT*> ROOT;
> Address <: <*TRANSIENT*> REFANY;
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/NetObjNotifier.i3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/NetObjNotifier.i3
21c21
< NotifierClosure = OBJECT METHODS
---
> NotifierClosure = <*TRANSIENT*> ROOT OBJECT METHODS
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/NetObjRep.i3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/NetObjRep.i3
14c14
< NetObj.T = BRANDED "NetObj.T" OBJECT
---
> NetObj.T = <*TRANSIENT*> ROOT BRANDED "NetObj.T" OBJECT
16c16
< r: REFANY;
---
> r: <*TRANSIENT*> REFANY;
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/NetObjRT.m3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/NetObjRT.m3
17,19c17,19
< IMPORT IntRefTbl, TextRefTbl, ObjTbl, ObjElem,
< FPRefTbl, DirtyTbl, DirtyElem;
< IMPORT Thread, RefList;
---
> IMPORT IntRefTransientTbl AS IntRefTbl, TextRefTransientTbl AS TextRefTbl,
> ObjTbl, ObjElem, FPRefTbl, DirtyTbl, DirtyElem;
> IMPORT Thread, RefTransientList AS RefList;
58c58
< TypeInfo = REF RECORD
---
> TypeInfo = <*TRANSIENT*> REF RECORD
108c108
< Notifier = REF RECORD
---
> Notifier = <*TRANSIENT*> REF RECORD
138c138
< locs: REF ARRAY OF Transport.Location := NIL;
---
> locs: <*TRANSIENT*> REF ARRAY OF Transport.Location := NIL;
150c150
< ExportInfo = BRANDED OBJECT
---
> ExportInfo = <*TRANSIENT*> ROOT BRANDED OBJECT
265c265
< VAR r: REFANY; loc: Transport.Location;
---
> VAR r: <*TRANSIENT*> REFANY; loc: Transport.Location;
409c409
< CleanQElem = REF RECORD
---
> CleanQElem = <*TRANSIENT*> REF RECORD
501c501
< r: REFANY;
---
> r: <*TRANSIENT*> REFANY;
526c526
< r: REFANY;
---
> r: <*TRANSIENT*> REFANY;
581c581
< VAR r: REFANY;
---
> VAR r: <*TRANSIENT*> REFANY;
604c604
< VAR r: REFANY;
---
> VAR r: <*TRANSIENT*> REFANY;
644c644
< VAR r: REFANY; res: ExportInfo;
---
> VAR r: <*TRANSIENT*> REFANY; res: ExportInfo;
694c694
< name: TEXT;
---
> <*TRANSIENT*> name: TEXT;
701c701
< VAR r: REFANY;
---
> VAR r: <*TRANSIENT*> REFANY;
712c712
< VAR r: REFANY;
---
> VAR r: <*TRANSIENT*> REFANY;
733c733
< VAR r: REFANY;
---
> VAR r: <*TRANSIENT*> REFANY;
754c754
< rti: REFANY := NIL;
---
> rti: <*TRANSIENT*> REFANY := NIL;
959c959
< key: TEXT; r: REFANY;
---
> key: TEXT; r: <*TRANSIENT*> REFANY;
997c997
< locTbl.locs := NEW(REF ARRAY OF Transport.Location, 10);
---
> locTbl.locs := NEW(<*TRANSIENT*> REF ARRAY OF Transport.Location, 10);
1003c1003,1004
< locTbl.locs := NEW(REF ARRAY OF Transport.Location, NUMBER(ol^) * 2);
---
> locTbl.locs := NEW(<*TRANSIENT*> REF ARRAY OF Transport.Location,
> NUMBER(ol^) * 2);
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/NGCMonitor.i3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/NGCMonitor.i3
12c12
< IMPORT WireRep, DirtyElem, Fingerprint, Transport, RefList;
---
> IMPORT WireRep, DirtyElem, Fingerprint, Transport, RefTransientList AS RefList;
18c18
< Dump = REF RECORD
---
> Dump = <*TRANSIENT*> REF RECORD
24c24
< ODump = OBJECT
---
> ODump = <*TRANSIENT*> ROOT OBJECT
27c27
< typeName: TEXT;
---
> <*TRANSIENT*> typeName: TEXT;
35c35
< owner: Transport.Endpoint;
---
> <*TRANSIENT*> owner: Transport.Endpoint;
38,40c38,40
< LDump = REF RECORD
< info: TEXT;
< ep: Transport.Endpoint;
---
> LDump = <*TRANSIENT*> REF RECORD
> <*TRANSIENT*> info: TEXT;
> <*TRANSIENT*> ep: Transport.Endpoint;
44c44
< DDump = REF RECORD
---
> DDump = <*TRANSIENT*> REF RECORD
49,50c49,50
< NDump = REF RECORD
< name: TEXT; (* in export table *)
---
> NDump = <*TRANSIENT*> REF RECORD
> <*TRANSIENT*> name: TEXT; (* in export table *)
Only in PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt: ObjTbl.i3
Only in PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt: ObjTbl.m3
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/SpecialObj.i3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/SpecialObj.i3
21c21
< FpTower = REF ARRAY OF Fingerprint.T;
---
> FpTower = <*TRANSIENT*> REF ARRAY OF Fingerprint.T;
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/StubConn.i3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/StubConn.i3
32c32
< Public = OBJECT rd: MsgRd.T; wr: MsgWr.T END;
---
> Public = <*TRANSIENT*> ROOT OBJECT rd: MsgRd.T; wr: MsgWr.T END;
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/StubLib.i3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/StubLib.i3
53c53
< Conn <: ROOT;
---
> Conn <: <*TRANSIENT*> ROOT;
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/StubLib.m3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/StubLib.m3
29c29
< objs: REF ARRAY OF NetObj.T := NIL;
---
> objs: <*TRANSIENT*> REF ARRAY OF NetObj.T := NIL;
643c643
< stream: REFANY;
---
> stream: <*TRANSIENT*> REFANY;
760c760
< s := NEW(REF ARRAY OF NetObj.T, DefaultObjStackSize);
---
> s := NEW(<*TRANSIENT*> REF ARRAY OF NetObj.T, DefaultObjStackSize);
763c763
< s := NEW(REF ARRAY OF NetObj.T, 2 * c.objStack.pos);
---
> s := NEW(<*TRANSIENT*> REF ARRAY OF NetObj.T, 2 * c.objStack.pos);
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/StubProt.m3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/StubProt.m3
30c30
< objs: REF ARRAY OF NetObj.T := NIL;
---
> objs: <*TRANSIENT*> REF ARRAY OF NetObj.T := NIL;
215c215
< VAR s: REF ARRAY OF NetObj.T;
---
> VAR s: <*TRANSIENT*> REF ARRAY OF NetObj.T;
223c223
< s := NEW(REF ARRAY OF NetObj.T, DefaultObjStackSize);
---
> s := NEW(<*TRANSIENT*> REF ARRAY OF NetObj.T, DefaultObjStackSize);
226c226
< s := NEW(REF ARRAY OF NetObj.T, 2 * c.objStack.pos);
---
> s := NEW(<*TRANSIENT*> REF ARRAY OF NetObj.T, 2 * c.objStack.pos);
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/Transport.i3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/Transport.i3
21c21
< Public = OBJECT METHODS
---
> Public = <*TRANSIENT*> ROOT OBJECT METHODS
29c29
< LocationP = OBJECT METHODS
---
> LocationP = <*TRANSIENT*> ROOT OBJECT METHODS
39c39
< NetObj.Address = BRANDED REF ARRAY OF Endpoint;
---
> NetObj.Address = <*TRANSIENT*> BRANDED REF <*TRANSIENT*> ARRAY OF Endpoint;
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/TransportRegistry.i3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/netobj/src/netobjrt/TransportRegistry.i3
34c34
< IteratorPublic = OBJECT METHODS
---
> IteratorPublic = <*TRANSIENT*> ROOT OBJECT METHODS
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobj/src/tcpnetobj/TCPNetObj.m3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/netobj/src/tcpnetobj/TCPNetObj.m3
12c12,13
< IMPORT AtomList, Convert, Fmt, TextRefTbl, Thread, Text, Time;
---
> IMPORT AtomList, Convert, Fmt, TextRefTransientTbl AS TextRefTbl, Thread,
> Text, Time;
49c50
< e: Transport.Endpoint;
---
> <*TRANSIENT*> e: Transport.Endpoint;
94c95
< WR = REF WeakRef.T;
---
> WR = <*TRANSIENT*> REF WeakRef.T;
154c155
< VAR r: REFANY;
---
> VAR r: <*TRANSIENT*> REFANY;
182c183
< x: REFANY;
---
> x: <*TRANSIENT*> REFANY;
216c217
< r: REFANY;
---
> r: <*TRANSIENT*> REFANY;
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/netobjd/src/NMonRegistrySvr.m3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/netobjd/src/NMonRegistrySvr.m3
13c13
< IMPORT TextRefTbl;
---
> IMPORT TextRefTransientTbl AS TextRefTbl;
30c30
< id: TEXT;
---
> <*TRANSIENT*> id: TEXT;
43c43
< VAR r: REFANY;
---
> VAR r: <*TRANSIENT*> REFANY;
68c68
< r: REFANY;
---
> r: <*TRANSIENT*> REFANY;
79c79
< res: REFANY;
---
> res: <*TRANSIENT*> REFANY;
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/stubgen/src/CodeForType.i3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/stubgen/src/CodeForType.i3
12c12
< IMPORT Atom, Formatter, AtomRefTbl, StubCode, Type;
---
> IMPORT Atom, Formatter, AtomRefTransientTbl AS AtomRefTbl, StubCode, Type;
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/stubgen/src/CodeForType.m3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/stubgen/src/CodeForType.m3
12,13c12,13
< IMPORT Atom, Fmt, Formatter, AtomRefTbl, StubCode, StubUtils,
< Text, Type, Value, ValueProc, Wr;
---
> IMPORT Atom, Fmt, Formatter, AtomRefTransientTbl AS AtomRefTbl, StubCode,
> StubUtils, Text, Type, Value, ValueProc, Wr;
387c387
< VAR key: Atom.T; value: REFANY;
---
> VAR key: Atom.T; value: <*TRANSIENT*> REFANY;
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/stubgen/src/IntfStubCode.i3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/stubgen/src/IntfStubCode.i3
12c12
< IMPORT Atom, Formatter, Type, AtomRefTbl, StubCode;
---
> IMPORT Atom, Formatter, Type, AtomRefTransientTbl AS AtomRefTbl, StubCode;
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/stubgen/src/IntfStubCode.m3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/stubgen/src/IntfStubCode.m3
12,13c12,13
< IMPORT Atom, CodeForType, Formatter, AtomRefTbl, StubCode,
< StubUtils, Type, Wr;
---
> IMPORT Atom, CodeForType, Formatter, AtomRefTransientTbl AS AtomRefTbl,
> StubCode, StubUtils, Type, Wr;
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/stubgen/src/ModuleStubCode.i3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/stubgen/src/ModuleStubCode.i3
11c11,12
< IMPORT Atom, Formatter, RefList, AtomRefTbl, StubCode, StubUtils, Type;
---
> IMPORT Atom, Formatter, RefList, AtomRefTransientTbl AS AtomRefTbl, StubCode,
> StubUtils, Type;
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/stubgen/src/ModuleStubCode.m3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/stubgen/src/ModuleStubCode.m3
12c12,13
< IMPORT Atom, CodeForType, Fmt, Formatter, RefList, Protocol, AtomRefTbl,
---
> IMPORT Atom, CodeForType, Fmt, Formatter, RefList, Protocol,
> AtomRefTransientTbl AS AtomRefTbl,
diff -r PolyMTL/pm3-1.1.15-unpacked/network/netobjects/stubgen/src/StubCode.m3 Persistent_M3/pm3-1.1.15-unpacked/network/netobjects/stubgen/src/StubCode.m3
13c13,14
< ModuleStubCode, OSError, Protocol, AtomRefTbl, StubUtils, Type, Wr;
---
> ModuleStubCode, OSError, Protocol, AtomRefTransientTbl AS AtomRefTbl,
> StubUtils, Type, Wr;
diff -r PolyMTL/pm3-1.1.15-unpacked/network/tcplibs/tcp/src/common/ConnMsgRW.m3 Persistent_M3/pm3-1.1.15-unpacked/network/tcplibs/tcp/src/common/ConnMsgRW.m3
126c126
< buff := NEW(REF ARRAY OF CHAR, BufferSize),
---
> buff := NEW(<*TRANSIENT*> REF ARRAY OF CHAR, BufferSize),
139c139
< buff := NEW(REF ARRAY OF CHAR, BufferSize),
---
> buff := NEW(<*TRANSIENT*> REF ARRAY OF CHAR, BufferSize),
206c206
< buff: REF ARRAY OF CHAR) : INTEGER
---
> buff: <*TRANSIENT*> REF ARRAY OF CHAR) : INTEGER
diff -r PolyMTL/pm3-1.1.15-unpacked/network/tcplibs/tcp/src/common/ConnRW.m3 Persistent_M3/pm3-1.1.15-unpacked/network/tcplibs/tcp/src/common/ConnRW.m3
34c34
< buff := NEW(REF ARRAY OF CHAR, BufferSize),
---
> buff := NEW(<*TRANSIENT*> REF ARRAY OF CHAR, BufferSize),
47c47
< buff := NEW(REF ARRAY OF CHAR, BufferSize),
---
> buff := NEW(<*TRANSIENT*> REF ARRAY OF CHAR, BufferSize),
diff -r PolyMTL/pm3-1.1.15-unpacked/network/tcplibs/tcp/src/common/TCP.i3 Persistent_M3/pm3-1.1.15-unpacked/network/tcplibs/tcp/src/common/TCP.i3
31c31
< Connector <: ROOT;
---
> Connector <: <*TRANSIENT*> ROOT;
diff -r PolyMTL/pm3-1.1.15-unpacked/network/www/webvbt/src/HTMLVBTGRep.i3 Persistent_M3/pm3-1.1.15-unpacked/network/www/webvbt/src/HTMLVBTGRep.i3
12c12
< HeaderBox <: ROOT;
---
> HeaderBox <: <*TRANSIENT*> ROOT;
diff -r PolyMTL/pm3-1.1.15-unpacked/README Persistent_M3/pm3-1.1.15-unpacked/README
1c1,5
< The Polytechnique Montreal Distribution of Modula-3
---
> The PM3 Distribution of orthogonal persistence for Modula-3.
>
> PM3 version 1.1.15 dated Wed Nov 14 01:38:45 EST 2001
>
> based on
5,9c9,18
< This distribution is based on the DEC SRC Modula-3 release 3.6. Local
< enhancements by Louis Dubeau, Jerome Collin and myself (Michel Dagenais)
< were added, and several packages (libraries, programs, and documentation)
< from other sources were added as well. The online documentation may be
< accessed before the build by pointing your favourite WWW browser to
---
> This distribution is based on the Polytechnique Montreal Distribution of
> Modula-3, with local enhancements by Antony Hosking, Jiawan Chen and Adam
> Welc, plus packages (libraries, programs and documentation) from other
> sources.
>
> The Polytechnique Montreal Distribution of Modula-3 is based on DEC SRC
> Modula-3 release 3.6. Local enhancements by Louis Dubeau, Jerome Collin and
> Michel Dagenais were added, and several packages (libraries, programs, and
> documentation) from other sources were added as well. The online documentation
> may be accessed before the build by pointing your favourite WWW browser to
diff -r PolyMTL/pm3-1.1.15-unpacked/src/m3makefile Persistent_M3/pm3-1.1.15-unpacked/src/m3makefile
226a227
> if defined("SHORE") capabilities{"SHORE"} = "" end
diff -r PolyMTL/pm3-1.1.15-unpacked/src/PACKAGES Persistent_M3/pm3-1.1.15-unpacked/src/PACKAGES
161a162,173
> PkgInfo("bag","libs","","bag",tLib,"T",3,[],["ALL"],[],
> "A simple, generic Bag interface.")
>
> PkgInfo("libpm3common","database/persistence","","pm3",tLib,"T",3,[],["ALL"],
> [],"ODMG-style interface for orthogonal persistence")
>
> PkgInfo("m3shore","database/persistence","","pm3",tLib,"T",3,[],["ALL"],
> ["SHORE"],"Persistent Modula-3 interface to the Shore object store")
>
> PkgInfo("libpm3shore","database/persistence","","pm3",tLib,"T",3,[],["ALL"],
> ["SHORE"],"libpm3 implementation using SHORE")
>
200a213,242
>
> PkgInfo("daemon","database/GRAS3/Tools","","pm3",tLib,"T",3,[],["ALL"],[],
> "Basic procedure to fork daemon processes")
>
> PkgInfo("GrasCommon","database/GRAS3","","pm3",tLib,"T",3,[],["ALL"],[],
> "Common GRAS3 library components")
>
> PkgInfo("GrasParams","database/GRAS3/Tools","","pm3",tLib,"T",3,[],["ALL"],[],
> "Utilities for reading GRAS3 configuration options")
>
> PkgInfo("PageServer","database/GRAS3","","pm3",tProg,"T",3,[],["ALL"],[],
> "GRAS3 transactional page server")
>
> PkgInfo("RuleEngine","database/GRAS3","","pm3",tLib,"T",3,[],["ALL"],[],
> "GRAS3 rule engine")
>
> PkgInfo("PageClient","database/GRAS3","","pm3",tLib,"T",3,[],["ALL"],[],
> "GRAS3 client interface to the transactional page server")
>
> PkgInfo("ServerShutdown","database/GRAS3","","pm3",tProg,"T",3,[],["ALL"],[],
> "Shut down idle page server")
>
> PkgInfo("GrasNameServer","database/GRAS3","","pm3",tProg,"T",3,[],["ALL"],[],
> "GRAS3 name server")
>
> PkgInfo("libpm3","database/persistence","","pm3",tLib,"T",3,[],["ALL"],[],
> "Default libpm3 implementation using GRAS3")
>
> PkgInfo("primes","database/persistence","","pm3",tProg,"T",3,[],["ALL"],[],
> "A simple persistent application that generates prime numbers")
diff -r PolyMTL/pm3-1.1.15-unpacked/text/sgmltools/sgml/src/dtd/HTML4.dtd Persistent_M3/pm3-1.1.15-unpacked/text/sgmltools/sgml/src/dtd/HTML4.dtd
11c11
< Draft: $Date: 1998/01/17 14:26:50 $
---
> Draft: $Date: 1998/10/28 21:41:53 $
diff -r PolyMTL/pm3-1.1.15-unpacked/text/sgmltools/sgmlconv/src/Main.m3 Persistent_M3/pm3-1.1.15-unpacked/text/sgmltools/sgmlconv/src/Main.m3
25,26c25,27
< TextWr, TextRd, Fmt, Lex, OSError, FileRd, FileWr, TextSeq, IntSeq,
< Pathname, Process, FS, File, RegularFile;
---
> TextWr, TextRd, Fmt, Lex, OSError, FileRd, FileWr,
> TextTransientSeq AS TextSeq, IntSeq, Pathname, Process, FS, File,
> RegularFile;
diff -r PolyMTL/pm3-1.1.15-unpacked/text/sgmltools/sgmllinear/src/Main.m3 Persistent_M3/pm3-1.1.15-unpacked/text/sgmltools/sgmllinear/src/Main.m3
28c28
< TextConv, TextSeq, TextTextTbl, TextWr, Pathname;
---
> TextConv, TextTransientSeq AS TextSeq, TextTextTbl, TextWr, Pathname;