Registry.bcd created 26-Oct-82 14:37:01 on 3#354# creator 25-Aug-81 8:46:36 on 3#35# source 26-Oct-82 14:35:57 on 0#0# Cross Jumped Global frame size: 15 -- Registration Server - Implementation of using heap and BTree as a registry. -- [Juniper]<Grapevine>MS>Registry.mesa -- Randy Gobbel, 20-May-81 13:03:14 -- J. Dion, September 10, 1979. -- Andrew Birrell, 26-Oct-82 13:18:34 DIRECTORY BodyDefs USING [maxRNameLength, PackedTime, RName, RNameSize, Timestamp], HeapDefs, Inline USING[ LowHalf ], PupDefs USING [PupNameLookup], PupStream USING [PupAddress], Process USING [InitializeCondition, MsecToTicks], ProtocolDefs, RegistryDefs, Time USING [Current, Packed]; Registry: MONITOR IMPORTS BodyDefs, HeapDefs, Inline, PupDefs, Process, Time EXPORTS RegistryDefs = BEGIN HeapObjectEnded: ERROR = CODE; MangledHeapObject: ERROR = CODE; Entry point: 0, Frame size: 7 264: LIB 126 266: LI3 267: GADRB 14 271: BLTC 272: LINI 273: SG0 futureLimit: CARDINAL ← 14; 274: LIB 16 276: SG3 prevTime: Time.Packed ← Time.Current[]; 277: EFC13 300: SGDB 4 aWeeWhile: CONDITION; 302: LI0 303: LIB 144 305: NOOP 306: SGDB 12 PupDefs.PupNameLookup [@ThisMachine, "ME"]; 310: GADRB 7 312: GADRB 14 314: EFC14 Process.InitializeCondition[@aWeeWhile, Process.MsecToTicks[100]]; END. 315: LIB 144 317: EFCB 20 321: SL0 322: GADRB 12 324: LL0 325: EFC15 326: RET Instructions: 24, Bytes: 36 Copy: PUBLIC PROC[reader: HeapDefs.ReaderHandle, writer: HeapDefs.WriterHandle] = -- copies one component of an entry -- BEGIN bLength: CARDINAL = 64; buffer: ARRAY [0..bLength) OF WORD; Entry point: 27, Frame size: 79 330: SLDB 5 332: LIN1 333: SLB 107 335: LL1 336: LADRB 107 340: LI1 341: EFC0 342: POP 343: POP length: CARDINAL ← ReadComponentLength[reader]; 344: LLB 107 346: SL0 WriteComponentLength[writer, length]; 347: LL2 350: LL0 351: LFC1 WHILE length > 0 352: LL0 353: LI0 354: JULEB 57 (434) DO used: CARDINAL = HeapDefs.HeapReadData[reader, [@buffer,MIN[length,bLength]] ].used; 356: LL1 357: LADRB 7 361: NOOP 362: SLDB 110 364: LL0 365: LIB 100 367: NOOP 370: JULB 6 (377) 372: PUSH 373: PUSH 374: EXCH 375: POP 376: J2 (400) 377: PUSH 400: LLB 111 402: EXCH 403: SLB 112 405: POP 406: LLDB 110 410: LLB 112 412: EFC0 413: EXCH 414: POP 415: SLB 107 length ← length - used; 417: LL0 420: LLB 107 422: SUB 423: SL0 HeapDefs.HeapWriteData[writer, [@buffer,used] ]; ENDLOOP; END; 424: LL2 425: LADRB 7 427: LLB 107 431: EFC1 432: JB 317 (352) 434: RET Instructions: 51, Bytes: 70 Skip: PUBLIC PROC[reader: HeapDefs.ReaderHandle] = -- skips one component of an entry -- BEGIN Entry point: 11, Frame size: 11 436: SL0 437: LIN1 440: SL2 441: LL0 442: LADRB 6 444: LI1 445: EFC0 446: POP 447: POP length: CARDINAL = ReadComponentLength[reader]; 450: LL2 451: PL1 IF length > 0 --optimisation-- THEN 452: LI0 453: NOOP 454: JULEB 16 (473) HeapDefs.SetReaderOffset[reader, length + HeapDefs.GetReaderOffset[reader]]; END; 456: LL0 457: EFC7 460: LL1 461: LI0 462: DADD 463: NOOP 464: SLDB 7 466: LL0 467: NOOP 470: LLDB 7 472: EFC8 473: RET Instructions: 26, Bytes: 30 SkipIfEmpty: PUBLIC PROC[reader: HeapDefs.ReaderHandle] RETURNS[empty: BOOLEAN] = BEGIN Entry point: 23, Frame size: 11 474: PL0 pos: HeapDefs.ObjectOffset = HeapDefs.GetReaderOffset[reader]; 475: EFC7 476: SLDB 6 500: LIN1 501: SL5 502: LL0 503: LADRB 11 505: LI1 506: EFC0 507: POP 510: POP length: CARDINAL = ReadComponentLength[reader]; 511: LL5 512: PL1 IF length = 0 THEN 513: NOOP 514: JZNEB 3 (520) RETURN[TRUE] ELSE BEGIN 516: LI1 517: J7 (526) HeapDefs.SetReaderOffset[reader, pos]; 520: LL0 521: NOOP 522: LLDB 6 524: EFC8 RETURN[FALSE] END; END; 525: LI0 526: RET Instructions: 23, Bytes: 28 WriteList: PUBLIC PROC[writer: HeapDefs.WriterHandle, name: BodyDefs.RName, stamp: BodyDefs.Timestamp] = BEGIN -- writes single or zero entry list, with no deletions -- Entry point: 25, Frame size: 11 530: SLDB 7 532: SLDB 5 534: SL0 IF name = NIL THEN { 535: LL1 536: JZNEB 21 (560) 540: LI0 541: SL5 WriteEmptyList[writer]; 542: LL0 543: LADRB 11 545: LI1 546: EFC1 547: LI0 550: SL5 WriteEmptyList[writer] } ELSE { 551: LL0 552: LADRB 11 554: LI1 555: EFC1 556: JB 14 (573) WriteRNameList[writer,name]; 560: LLDB 4 562: LFCB 20 WriteStampList[writer,stamp]; }; 564: LL0 565: NOOP 566: LLDB 6 570: LL4 571: LFCB 24 573: LI0 574: SL5 WriteEmptyList[writer]; 575: LL0 576: LADRB 11 600: LI1 601: EFC1 602: LI0 603: SL5 WriteEmptyList[writer]; END; 604: LL0 605: LADRB 11 607: LI1 610: EFC1 611: RET Instructions: 38, Bytes: 50 StartSublist: PUBLIC PROC RETURNS[ writer: HeapDefs.WriterHandle] = BEGIN Entry point: 26, Frame size: 7 writer ← HeapDefs.HeapStartWrite[temp]; 612: LIB 7 614: EFC10 615: PL0 WriteComponentLength[writer, 0]; -- place holder -- END; 616: LI0 617: LFC1 620: LL0 621: RET Instructions: 7, Bytes: 8 AddNameToSublist: PUBLIC PROC[writer: HeapDefs.WriterHandle, name: BodyDefs.RName] = BEGIN Entry point: 37, Frame size: 7 622: SL1 623: PL0 HeapDefs.HeapWriteRName[writer, name]; END; 624: LL1 625: EFC2 626: RET Instructions: 5, Bytes: 6 EndSublist: PUBLIC PROC[writer: HeapDefs.WriterHandle, count: CARDINAL] RETURNS[reader: HeapDefs.ReaderHandle] = BEGIN Entry point: 33, Frame size: 15 630: SL1 631: PL0 offset: HeapDefs.ObjectOffset ← HeapDefs.GetWriterOffset[writer]; 632: EFC4 633: NOOP 634: SLDB 6 HeapDefs.SetWriterOffset[writer, HeapDefs.objectStart]; 636: LL0 637: LI0 640: DUP 641: EFC3 WriteComponentLength[writer, Inline.LowHalf[offset-SIZE[CARDINAL]]]; 642: LLDB 6 644: LI1 645: LI0 646: DSUB 647: POP 650: SLB 14 652: LL0 653: LLB 14 655: LFC1 HeapDefs.SetWriterOffset[writer, offset]; 656: LL0 657: NOOP 660: LLDB 6 662: EFC3 WriteComponentLength[writer, count * SIZE[BodyDefs.Timestamp]]; 663: NOOP 664: LLDB 4 666: DUP 667: DBL 670: ADD 671: LFC1 BEGIN stamp: BodyDefs.Timestamp = MakeTimestamp[]; 672: LFCB 23 674: SLDB 12 676: SL5 THROUGH [0..count) DO 677: LL1 700: SLB 15 702: LI0 703: NOOP 704: JB 14 (721) 706: PUSH 707: SLB 14 WriteTimestamp[writer, stamp] ENDLOOP; END; 711: LL0 712: LLDB 11 714: LL7 715: LFC2 716: LLB 14 720: INC 721: LLB 15 723: NOOP 724: JULB 361 (706) 726: LI0 727: SL5 WriteEmptyList[writer]; 730: LL0 731: LADRB 11 733: LI1 734: EFC1 735: LI0 736: SL5 WriteEmptyList[writer]; -- deletions -- 737: LL0 740: LADRB 11 742: LI1 743: EFC1 BEGIN 744: DESCB 116 746: SL6 HeapDefs.HeapEndWrite[writer, GetReader]; END; END; 747: LL0 750: LADRB 12 752: EFC12 753: LL4 754: RET Instructions: 66, Bytes: 86 GetReader: PROC[obj: HeapDefs.ObjectNumber] = { Entry point: 39, Frame size: 7 756: LINKB 6 760: SL2 761: PL1 762: PUSH reader ← HeapDefs.HeapStartRead[obj] }; 763: EFC11 764: WILP [0,4] 766: RET Instructions: 7, Bytes: 10 EnumerateRList: PUBLIC PROC[reader: HeapDefs.ReaderHandle, work: PROC[BodyDefs.RName]RETURNS[done:BOOLEAN]] = BEGIN Entry point: 18, Frame size: 47 770: SL2 771: SL0 772: LIN1 773: SL3 774: LL0 775: LADRB 7 777: LI1 1000: EFC0 1001: POP 1002: POP length: CARDINAL ← ReadComponentLength[reader]; 1003: LL3 1004: SL1 WHILE length > 0 1005: LL1 1006: LI0 1007: NOOP 1010: JULEB 37 (1050) DO name: BodyDefs.RName = [BodyDefs.maxRNameLength]; 1012: LADRB 11 1014: LI0 1015: LIB 100 1017: NOOP 1020: WSDB 0 1022: PUSH 1023: SL3 [] ← HeapDefs.HeapReadRName[reader, name]; 1024: LL0 1025: LL3 1026: EFC5 1027: POP length ← length - BodyDefs.RNameSize[name]; 1030: LL1 1031: RILP [3,0] 1033: INC 1034: LIN1 1035: SHIFT 1036: LI2 1037: ADD 1040: SUB 1041: SL1 IF work[name] THEN 1042: LL3 1043: LL2 1044: SFC 1045: NOOP 1046: JZEQB 336 (1005) EXIT; ENDLOOP; END; 1050: RET Instructions: 42, Bytes: 50 ReadPrefix: PUBLIC PROC[reader: HeapDefs.ReaderHandle, name: BodyDefs.RName] RETURNS[type: ProtocolDefs.RNameType, stamp: BodyDefs.Timestamp] = BEGIN Entry point: 22, Frame size: 15 1052: SLDB 4 1054: LIN1 1055: SL7 1056: LL0 1057: LADRB 13 1061: LI1 1062: EFC0 1063: POP 1064: POP length: CARDINAL = ReadComponentLength[reader]; 1065: LL7 1066: SL6 1067: LL0 1070: LADRB 13 1072: LI3 1073: EFC0 1074: POP 1075: POP stamp ← ReadTimestamp[reader]; 1076: LLDB 13 1100: LLB 15 1102: SLDB 10 1104: SL3 [,] ← HeapDefs.HeapReadData[reader, [@type,SIZE[ProtocolDefs.RNameType]]]; 1105: LL0 1106: LADRB 6 1110: LI1 1111: EFC0 1112: POP 1113: POP [] ← HeapDefs.HeapReadRName[reader, name]; 1114: LLDB 4 1116: EFC5 1117: POP IF length # SIZE[ProtocolDefs.RNameType] + SIZE[BodyDefs.Timestamp] + BodyDefs.RNameSize[name] THEN 1120: RILP [1,0] 1122: INC 1123: LIN1 1124: SHIFT 1125: LI2 1126: ADD01 1127: LL6 1130: LI4 1131: SUB 1132: JEQ7 (1141) ERROR MangledHeapObject; END; 1133: NOOP 1134: DESCB 2 1136: LIN1 1137: KFCB 43 1141: NOOP 1142: LLDB 6 1144: LLDB 10 1146: RET Instructions: 48, Bytes: 62 WritePrefix: PUBLIC PROC[writer: HeapDefs.WriterHandle, type: ProtocolDefs.RNameType, stamp: POINTER TO BodyDefs.Timestamp, name: BodyDefs.RName] = BEGIN Entry point: 32, Frame size: 11 1150: SL1 1151: SL2 1152: SL3 1153: SL0 WriteComponentLength[writer, SIZE[ProtocolDefs.RNameType] + SIZE[BodyDefs.Timestamp] + BodyDefs.RNameSize[name] ]; 1154: RILP [1,0] 1156: INC 1157: LIN1 1160: SHIFT 1161: LI2 1162: ADD01 1163: LI4 1164: ADD01 1165: SL4 1166: LL0 1167: LL4 1170: LFC1 WriteTimestamp[writer, stamp↑]; 1171: LL0 1172: LL2 1173: RD0 1174: RILP [2,2] 1176: LFC2 HeapDefs.HeapWriteData[writer, [@type,SIZE[ProtocolDefs.RNameType]]]; 1177: LL0 1200: LADRB 7 1202: LI1 1203: EFC1 HeapDefs.HeapWriteRName[writer, name]; END; 1204: LLDB 4 1206: EFC2 1207: RET Instructions: 28, Bytes: 32 ReadPassword: PUBLIC PROC[reader: HeapDefs.ReaderHandle] RETURNS [pw: ProtocolDefs.Password, stamp: BodyDefs.Timestamp] = BEGIN Entry point: 28, Frame size: 19 1210: SL0 1211: LIN1 1212: SLB 14 1214: LL0 1215: LADRB 14 1217: LI1 1220: EFC0 1221: POP 1222: POP IF ReadComponentLength[reader] # SIZE [ProtocolDefs.Password] + SIZE[BodyDefs.Timestamp] THEN 1223: LLB 14 1225: LIB 7 1227: JEQ6 (1235) ERROR MangledHeapObject; 1230: DESCB 2 1232: LIN1 1233: KFCB 43 1235: LL0 1236: LADRB 14 1240: LI3 1241: EFC0 1242: POP 1243: POP stamp ← ReadTimestamp[reader]; 1244: LLDB 14 1246: LLB 16 1250: SLDB 12 1252: SL5 [] ← HeapDefs.HeapReadData [reader, [@pw, SIZE [ProtocolDefs.Password]]]; END; 1253: LL0 1254: LADRB 5 1256: LI4 1257: EFC0 1260: POP 1261: POP 1262: LI0 1263: ALLOC 1264: SLB 17 1266: LADRB 5 1270: LI4 1271: LLB 17 1273: BLT 1274: LADRB 11 1276: LI3 1277: LLB 17 1301: LI4 1302: ADD 1303: BLT 1304: LLB 17 1306: RET Instructions: 46, Bytes: 64 WritePassword: PUBLIC PROC[writer: HeapDefs.WriterHandle, pw: ProtocolDefs.Password, stamp: BodyDefs.Timestamp] = BEGIN Entry point: 34, Frame size: 15 1310: DUP 1311: NOOP 1312: SLDB 14 1314: LLB 15 1316: LI5 1317: ADD01 1320: LI3 1321: LADRB 11 1323: BLT 1324: LLB 14 1326: INC 1327: LI4 1330: LADRB 5 1332: BLT 1333: RILP [10,0] 1335: SL0 1336: LLB 14 1340: FREE WriteComponentLength[writer, SIZE[ProtocolDefs.Password]+SIZE[BodyDefs.Timestamp]]; 1341: LL0 1342: LIB 7 1344: LFC1 WriteTimestamp[writer, stamp]; 1345: LL0 1346: LLDB 11 1350: LL7 1351: LFC2 HeapDefs.HeapWriteData [writer, [@pw, SIZE [ProtocolDefs.Password]]]; END; 1352: LL0 1353: LADRB 5 1355: LI4 1356: EFC1 1357: RET Instructions: 30, Bytes: 40 ReadConnect: PUBLIC PROC[reader: HeapDefs.ReaderHandle, connect: ProtocolDefs.Connect] RETURNS [stamp: BodyDefs.Timestamp] = BEGIN Entry point: 35, Frame size: 15 1360: SLDB 4 1362: LIN1 1363: SL5 1364: LL0 1365: LADRB 11 1367: LI1 1370: EFC0 1371: POP 1372: POP [] ← ReadComponentLength[reader]; 1373: LL0 1374: LADRB 11 1376: LI3 1377: EFC0 1400: POP 1401: POP stamp ← ReadTimestamp[reader]; 1402: LLDB 11 1404: LL7 1405: NOOP 1406: SLDB 7 1410: SL2 connect.length ← LAST[CARDINAL]; 1411: LIN1 1412: WILP [1,0] [,] ← HeapDefs.HeapReadData[reader, [@(connect.length),SIZE[CARDINAL]] ]; 1414: LLDB 4 1416: LI1 1417: EFC0 1420: POP 1421: POP IF connect.length > connect.maxlength THEN 1422: RILP [1,0] 1424: RILP [1,1] 1426: JULEB 6 (1435) ERROR MangledHeapObject; 1430: DESCB 2 1432: LIN1 1433: KFCB 43 [] ← HeapDefs.HeapReadData [reader, [@(connect.text), (1+connect.length)/2] ]; END; 1435: NOOP 1436: LLDB 4 1440: LI2 1441: ADD 1442: RILP [1,0] 1444: INC 1445: LIN1 1446: SHIFT 1447: EFC0 1450: POP 1451: POP 1452: LLDB 6 1454: LL4 1455: RET Instructions: 47, Bytes: 62 WriteConnect: PUBLIC PROC[writer: HeapDefs.WriterHandle, connect: ProtocolDefs.Connect, stamp: BodyDefs.Timestamp] = BEGIN Entry point: 31, Frame size: 11 1456: SLDB 7 1460: SLDB 5 1462: PL0 WriteComponentLength[writer, SIZE[BodyDefs.Timestamp] + SIZE[CARDINAL] + (1+connect.length)/2]; 1463: RILP [1,0] 1465: INC 1466: LIN1 1467: SHIFT 1470: LI4 1471: ADD 1472: LFC1 WriteTimestamp[writer, stamp]; 1473: LL0 1474: LLDB 6 1476: LL4 1477: LFC2 HeapDefs.HeapWriteData[writer, [@(connect.length),SIZE[CARDINAL]] ]; 1500: LLDB 4 1502: LI1 1503: EFC1 HeapDefs.HeapWriteData [writer, [@(connect.text), (1+connect.length)/2] ]; END; 1504: LLDB 4 1506: LI2 1507: ADD 1510: RILP [1,0] 1512: INC 1513: LIN1 1514: SHIFT 1515: EFC1 1516: RET Instructions: 26, Bytes: 34 WriteStampList: PROC[writer: HeapDefs.WriterHandle, stamp: BodyDefs.Timestamp] = BEGIN Entry point: 20, Frame size: 11 1520: SLDB 6 1522: SL1 1523: PL0 WriteComponentLength[writer, SIZE [BodyDefs.Timestamp]]; 1524: LI3 1525: LFC1 WriteTimestamp[writer, stamp]; END; 1526: LLDB 4 1530: LLDB 6 1532: LFC2 1533: RET Instructions: 9, Bytes: 12 WriteRNameList: PROC[writer: HeapDefs.WriterHandle, name: BodyDefs.RName] = BEGIN Entry point: 16, Frame size: 7 1534: SL0 1535: SL1 WriteComponentLength[writer, BodyDefs.RNameSize[name] ]; 1536: RIL0 1537: INC 1540: LIN1 1541: SHIFT 1542: LI2 1543: ADD01 1544: SL2 1545: NOOP 1546: LLDB 5 1550: LFC1 HeapDefs.HeapWriteRName[writer, name]; END; WriteEmptyList: PROC[writer: HeapDefs.WriterHandle] = INLINE BEGIN zero: CARDINAL ← 0; HeapDefs.HeapWriteData[writer, [@zero,SIZE[CARDINAL]] ]; END; ReadComponentLength: PROC[reader: HeapDefs.ReaderHandle] RETURNS[length: CARDINAL] = INLINE BEGIN length ← LAST[CARDINAL]; [,] ← HeapDefs.HeapReadData[reader, [@length,SIZE[CARDINAL]] ]; END; 1551: LL1 1552: LL0 1553: EFC2 1554: RET Instructions: 16, Bytes: 18 WriteComponentLength: PROC[writer: HeapDefs.WriterHandle, length: CARDINAL] = BEGIN Entry point: 1, Frame size: 7 1556: SL1 1557: PL0 HeapDefs.HeapWriteData[writer, [@length,SIZE[CARDINAL]] ]; END; ReadTimestamp: PROC[reader: HeapDefs.ReaderHandle] RETURNS [stamp: BodyDefs.Timestamp] = INLINE BEGIN [,] ← HeapDefs.HeapReadData [reader, [@stamp, SIZE [BodyDefs.Timestamp]] ]; END; 1560: LADRB 5 1562: LI1 1563: EFC1 1564: RET Instructions: 6, Bytes: 8 WriteTimestamp: PROCEDURE [writer: HeapDefs.WriterHandle, stamp: BodyDefs.Timestamp] = BEGIN Entry point: 2, Frame size: 11 1566: SLDB 6 1570: SL1 1571: PL0 HeapDefs.HeapWriteData [writer, [@stamp, SIZE [BodyDefs.Timestamp]]]; END; -- single-name updates -- -- RegistryDefs.UpdateInfo: TYPE = { done, noChange, outOfDate }; -- noChange => name already (not) there (timestamp may have been altered) -- outOfDate => better timestamp already in list 1572: LADRB 5 1574: LI3 1575: EFC1 1576: RET Instructions: 7, Bytes: 10 AddName: PUBLIC PROC[reader: HeapDefs.ReaderHandle, name: BodyDefs.RName, stamp: POINTER TO BodyDefs.Timestamp, writer: HeapDefs.WriterHandle] RETURNS[ info: RegistryDefs.UpdateInfo ] = BEGIN Entry point: 30, Frame size: 11 1606: SL4 1607: NOOP 1610: SLDB 5 1612: PL3 memInfo: RegistryDefs.UpdateInfo = SingleChangeToSublist[reader, name, stamp, writer, add]; 1613: NOOP 1614: LLDB 5 1616: LL4 1617: LI0 1620: LFC8 1621: SL6 delMemInfo: RegistryDefs.UpdateInfo = SingleChangeToSublist[reader, name, stamp, writer, remove]; 1622: LL3 1623: NOOP 1624: LLDB 5 1626: LL4 1627: LI1 1630: LFC8 1631: SL0 info ← SELECT memInfo FROM done => IF delMemInfo = outOfDate THEN outOfDate ELSE done, noChange => IF delMemInfo = noChange THEN noChange ELSE ERROR, outOfDate => IF delMemInfo = noChange THEN outOfDate ELSE ERROR, ENDCASE => ERROR; END; 1632: LL6 1633: LI3 1634: JIW* 700 ( 1642) ( 1652) ( 1662) 1640: JB 30 (1671) 1642: LL0 1643: LI2 1644: JEQB 20 (1665) 1646: LI0 1647: NOOP 1650: JB 22 (1673) 1652: LL0 1653: LI1 1654: JNE4 (1660) 1655: LI1 1656: JB 14 (1673) 1660: KFCB 46 1662: LL0 1663: LI1 1664: JNE3 (1667) 1665: LI2 1666: J5 (1673) 1667: KFCB 46 1671: KFCB 46 1673: SL5 1674: PUSH 1675: RET Instructions: 43, Bytes: 62 RemoveName: PUBLIC PROC[reader: HeapDefs.ReaderHandle, name: BodyDefs.RName, stamp: POINTER TO BodyDefs.Timestamp, writer: HeapDefs.WriterHandle] RETURNS[ info: RegistryDefs.UpdateInfo ] = BEGIN Entry point: 21, Frame size: 11 1704: SL3 1705: SL4 1706: SL2 1707: PL1 memInfo: RegistryDefs.UpdateInfo = SingleChangeToSublist[reader, name, stamp, writer, remove]; 1710: LL2 1711: LL4 1712: LL3 1713: LI1 1714: LFC8 1715: SL0 delMemInfo: RegistryDefs.UpdateInfo = SingleChangeToSublist[reader, name, stamp, writer, add]; 1716: LLDB 5 1720: LL4 1721: LL3 1722: LI0 1723: LFC8 1724: SL6 1725: PUSH info ← SELECT delMemInfo FROM done => IF memInfo = outOfDate THEN outOfDate ELSE memInfo, noChange => IF memInfo = noChange THEN noChange ELSE ERROR, outOfDate => IF memInfo = noChange THEN outOfDate ELSE ERROR, ENDCASE => ERROR; END; 1726: LI3 1727: JIW 737 ( 1734) ( 1744) ( 1754) 1732: JB 30 (1763) 1734: LL0 1735: LI2 1736: JEQB 20 (1757) 1740: LL0 1741: NOOP 1742: JB 22 (1765) 1744: LL0 1745: LI1 1746: JNE4 (1752) 1747: LI1 1750: JB 14 (1765) 1752: KFCB 46 1754: LL0 1755: LI1 1756: JNE3 (1761) 1757: LI2 1760: J5 (1765) 1761: KFCB 46 1763: KFCB 46 1765: SL5 1766: PUSH 1767: RET Instructions: 42, Bytes: 58 SingleChangeToSublist: PROC[reader: HeapDefs.ReaderHandle, name: BodyDefs.RName, stamp: POINTER TO BodyDefs.Timestamp, writer: HeapDefs.WriterHandle, change: {add,remove} ] RETURNS[ info: RegistryDefs.UpdateInfo ] = BEGIN Entry point: 8, Frame size: 67 2004: SL6 2005: SL0 2006: SL7 2007: SL3 2010: SL1 2011: NOOP 2012: DESCB 120 2014: SLB 22 beforeCount: CARDINAL ← 0; 2016: LI0 2017: SLB 15 afterCount: CARDINAL ← 0; 2021: LI0 2022: SLB 14 member: BodyDefs.RName = [BodyDefs.maxRNameLength]; 2024: LADRB 34 2026: LI0 2027: LIB 100 2031: NOOP 2032: WSDB 0 2034: PUSH 2035: SL2 2036: LIN1 2037: SLB 23 2041: LL1 2042: LADRB 23 2044: LI1 2045: EFC0 2046: POP 2047: POP originalLength: CARDINAL = ReadComponentLength[reader]; 2050: LLB 23 2052: SLB 16 2054: PUSH length: CARDINAL ← originalLength; 2055: SL5 lengthPos: HeapDefs.ObjectOffset = HeapDefs.GetWriterOffset[writer]; 2056: LL0 2057: EFC4 2060: SLDB 17 WriteComponentLength[writer, IF change = add THEN length + BodyDefs.RNameSize[name] ELSE length - BodyDefs.RNameSize[name] ]; 2062: LL6 2063: NOOP 2064: JZNEB 15 (2102) 2066: RILP [3,0] 2070: INC 2071: LIN1 2072: SHIFT 2073: LI2 2074: ADD01 2075: LL5 2076: ADD01 2077: NOOP 2100: JB 12 (2113) 2102: LL5 2103: RILP [3,0] 2105: INC 2106: LIN1 2107: SHIFT 2110: LI2 2111: ADD 2112: SUB 2113: SLB 76 2115: LL0 2116: LLB 76 2120: LFC1 info ← done; -- copy preceding names -- 2121: LI0 2122: SL4 WHILE length > 0 DO 2123: LL5 2124: LI0 2125: NOOP 2126: JULEB 100 (2227) [] ← HeapDefs.HeapReadRName[reader, member]; 2130: LLDB 5 2132: EFC5 2133: POP length ← length - BodyDefs.RNameSize[member]; 2134: LL5 2135: RILP [2,0] 2137: INC 2140: LIN1 2141: SHIFT 2142: LI2 2143: ADD 2144: SUB 2145: SL5 SELECT CompareRNames[member, name] FROM less => BEGIN 2146: LLDB 6 2150: LFCB 15 2152: LI3 2153: JIW 774 ( 2160) ( 2172) ( 2204) 2156: JB 46 (2225) HeapDefs.HeapWriteRName[writer, member]; 2160: LL0 2161: LL2 2162: EFC2 beforeCount ← beforeCount + 1; END; equal => BEGIN 2163: LLB 15 2165: INC 2166: SLB 15 2170: JB 332 (2123) IF change = add THEN { 2172: LL6 2173: NOOP 2174: JZNEB 37 (2234) info ← noChange; 2176: LI1 2177: SL4 HeapDefs.HeapWriteRName[writer, name] }; 2200: LL0 2201: LL3 2202: JB 20 (2223) EXIT END; greater => BEGIN IF change = add THEN 2204: LL6 2205: NOOP 2206: JZNEB 5 (2214) HeapDefs.HeapWriteRName[writer, name] ELSE 2210: LL0 2211: LL3 2212: EFC2 2213: J3 (2216) info ← noChange; 2214: LI1 2215: SL4 afterCount ← 1; 2216: LI1 2217: SLB 14 HeapDefs.HeapWriteRName[writer, member]; 2221: LL0 2222: LL2 2223: EFC2 EXIT END; ENDCASE => 2224: J8 (2234) ERROR; REPEAT FINISHED => 2225: KFCB 46 IF change = add THEN 2227: LL6 2230: JZEQB 347 (2200) HeapDefs.HeapWriteRName[writer, name] ELSE info ← noChange; ENDLOOP; -- copy following names -- 2232: LI1 2233: SL4 WHILE length > 0 DO 2234: LL5 2235: LI0 2236: JULEB 31 (2270) [] ← HeapDefs.HeapReadRName[reader, member]; 2240: LLDB 5 2242: EFC5 2243: POP length ← length - BodyDefs.RNameSize[member]; 2244: LL5 2245: RILP [2,0] 2247: INC 2250: LIN1 2251: SHIFT 2252: LI2 2253: ADD 2254: SUB 2255: SL5 HeapDefs.HeapWriteRName[writer, member]; 2256: LL0 2257: LL2 2260: EFC2 afterCount ← afterCount + 1; ENDLOOP; 2261: LLB 14 2263: INC 2264: SLB 14 2266: JB 345 (2234) SELECT info FROM done => NULL; noChange => 2270: LL4 2271: NOOP 2272: JZEQB 12 (2305) 2274: PUSH 2275: LI1 2276: JNE5 (2303) ResetLength[]; ENDCASE => 2277: LADRB 22 2301: SFC 2302: J3 (2305) ERROR; -- stamp list length -- 2303: KFCB 46 2305: LL4 2306: LI1 2307: NOOP 2310: JNEB 17 (2330) 2312: LIN1 2313: SLB 23 2315: LL1 2316: LADRB 23 2320: LI1 2321: EFC0 2322: POP 2323: POP 2324: LLB 23 2326: JB 43 (2372) 2330: LL6 2331: NOOP 2332: JZNEB 21 (2354) 2334: LIN1 2335: SLB 23 2337: LL1 2340: LADRB 23 2342: LI1 2343: EFC0 2344: POP 2345: POP 2346: LLB 23 2350: LI3 2351: ADD01 2352: JB 17 (2372) 2354: LIN1 2355: SLB 23 2357: LL1 2360: LADRB 23 2362: LI1 2363: EFC0 2364: POP 2365: POP WriteComponentLength[writer, IF info = noChange THEN ReadComponentLength[reader] ELSE IF change = add THEN ReadComponentLength[reader] + SIZE[BodyDefs.Timestamp] ELSE ReadComponentLength[reader] - SIZE[BodyDefs.Timestamp] ]; 2366: LLB 23 2370: LI3 2371: SUB 2372: SLB 76 2374: LL0 2375: LLB 76 2377: LFC1 THROUGH [1..beforeCount] DO 2400: LLB 15 2402: SLB 77 2404: LI1 2405: LLB 77 2407: NOOP 2410: JUGB 43 (2454) 2412: PUSH 2413: J3 (2416) 2414: PUSH 2415: INC 2416: SLB 76 2420: LL1 2421: LADRB 23 2423: LI3 2424: EFC0 2425: POP 2426: POP WriteTimestamp[writer, ReadTimestamp[reader] ]; ENDLOOP; 2427: NOOP 2430: LLDB 23 2432: LLB 25 2434: SLDB 101 2436: SLB 100 2440: LL0 2441: NOOP 2442: LLDB 100 2444: LLB 102 2446: LFC2 2447: NOOP 2450: LLDB 76 2452: JULB 341 (2414) IF change = add THEN BEGIN 2454: LL6 2455: NOOP 2456: JZNEB 121 (2600) IF info = done THEN 2460: LL4 2461: NOOP 2462: JZNEB 11 (2474) WriteTimestamp[writer, stamp↑] ELSE 2464: LL0 2465: LL7 2466: RD0 2467: RILP [7,2] 2471: LFC2 2472: JB 163 (2656) BEGIN 2474: LL1 2475: LADRB 31 2477: LI3 2500: EFC0 2501: POP 2502: POP prev: BodyDefs.Timestamp = ReadTimestamp[reader]; best: BodyDefs.Timestamp; 2503: NOOP 2504: LLDB 31 2506: LLB 33 2510: SLDB 27 2512: SLB 26 SELECT CompareTimestamps[stamp↑, prev ] FROM less => { 2514: LI0 2515: ALLOC 2516: SLB 76 2520: LL7 2521: LI3 2522: LLB 76 2524: BLT 2525: LADRB 26 2527: LI3 2530: LLB 76 2532: LI3 2533: ADD 2534: BLT 2535: LLB 76 2537: LFCB 14 2541: LI3 2542: JIW* 777 ( 2550) ( 2561) ( 2561) 2546: JB 20 (2567) best ← prev; 2550: LADRB 26 2552: LI3 2553: LADRB 23 2555: BLT info ← outOfDate }; equal => 2556: LI2 2557: SL4 2560: J9 (2571) best ← stamp↑; greater => 2561: LL7 2562: LI3 2563: LADRB 23 2565: BLT 2566: J3 (2571) best ← stamp↑; ENDCASE => ERROR; 2567: KFCB 46 WriteTimestamp[writer, best]; END; END ELSE 2571: LL0 2572: LLDB 23 2574: LLB 25 2576: JB 272 (2471) IF info = noChange THEN NULL ELSE 2600: LL4 2601: LI1 2602: JEQB 53 (2656) BEGIN 2604: LL1 2605: LADRB 26 2607: LI3 2610: EFC0 2611: POP 2612: POP prev: BodyDefs.Timestamp = ReadTimestamp[reader]; 2613: NOOP 2614: LLDB 26 2616: LLB 30 2620: SLDB 24 2622: SLB 23 IF CompareTimestamps[stamp↑, prev ] = less THEN 2624: LI0 2625: ALLOC 2626: SLB 76 2630: LL7 2631: LI3 2632: LLB 76 2634: BLT 2635: LADRB 23 2637: LI3 2640: LLB 76 2642: LI3 2643: ADD 2644: BLT 2645: LLB 76 2647: LFCB 14 2651: NOOP 2652: JZNEB 3 (2656) info ← outOfDate; END; 2654: LI2 2655: SL4 THROUGH [1..afterCount] DO 2656: LLB 14 2660: SLB 77 2662: LI1 2663: LLB 77 2665: NOOP 2666: JUGB 43 (2732) 2670: PUSH 2671: J3 (2674) 2672: PUSH 2673: INC 2674: SLB 76 2676: LL1 2677: LADRB 23 2701: LI3 2702: EFC0 2703: POP 2704: POP WriteTimestamp[writer, ReadTimestamp[reader] ]; ENDLOOP; END; -- General merge algorithm -- Inlist: TYPE = RECORD [ RNameReader, TimestampReader: HeapDefs.ReaderHandle, RNameWordsLeft, TimestampWordsLeft: CARDINAL, RNameStart, TimestampStart: HeapDefs.ObjectOffset, name: BodyDefs.RName, stamp: BodyDefs.Timestamp, empty: BOOLEAN]; Outlist:TYPE = RECORD [ RNameWriter, TimestampWriter: HeapDefs.WriterHandle, RNameStart: HeapDefs.ObjectOffset, RNameWordsUsed, TimestampWordsUsed: CARDINAL]; 2705: NOOP 2706: LLDB 23 2710: LLB 25 2712: SLDB 101 2714: SLB 100 2716: LL0 2717: NOOP 2720: LLDB 100 2722: LLB 102 2724: LFC2 2725: NOOP 2726: LLDB 76 2730: JULB 341 (2672) 2732: LL4 2733: RET Instructions: 346, Bytes: 484 ResetLength: PROC = BEGIN -- length didn't change after all -- Entry point: 40, Frame size: 7 2734: LINKB 16 now: HeapDefs.ObjectOffset = HeapDefs.GetWriterOffset[writer]; 2736: RIL0 2737: EFC4 2740: SLDB 5 HeapDefs.SetWriterOffset[writer, lengthPos]; 2742: RIL0 2743: LL0 2744: RDB 13 2746: EFC3 WriteComponentLength[writer, originalLength]; 2747: RIL0 2750: RILP [0,12] 2752: LFC1 HeapDefs.SetWriterOffset[writer, now]; END; 2753: RIL0 2754: LLDB 5 2756: EFC3 2757: RET Instructions: 15, Bytes: 20 MergeLists: PUBLIC PROC[reader1, reader2: HeapDefs.ReaderHandle, writer: HeapDefs.WriterHandle] RETURNS [newer1, newer2: BOOLEAN] = BEGIN -- allocate buffers for R-Names locally, to avoid FSP fragmentation -- Entry point: 24, Frame size: 203 2760: SL3 2761: SL4 2762: SL2 name1: BodyDefs.RName = [BodyDefs.maxRNameLength]; 2763: LADRB 103 2765: LI0 2766: LIB 100 2770: WSDB 0 2772: PUSH 2773: SLB 63 name2: BodyDefs.RName = [BodyDefs.maxRNameLength]; 2775: LADRB 145 2777: LI0 3000: LIB 100 3002: WSDB 0 3004: PUSH 3005: SL5 name3: BodyDefs.RName = [BodyDefs.maxRNameLength]; 3006: LADRB 207 3010: LI0 3011: LIB 100 3013: NOOP 3014: WSDB 0 3016: PUSH 3017: SL6 name4: BodyDefs.RName = [BodyDefs.maxRNameLength]; addlist1, addlist2, dellist1, dellist2: Inlist; n1, n2: BOOLEAN; 3020: LADRB 251 3022: LI0 3023: LIB 100 3025: NOOP 3026: WSDB 0 3030: PUSH 3031: SL7 CreateInlist [@addlist1, name1, reader1]; 3032: LADRB 46 3034: LLB 63 3036: LL2 3037: LFC5 CreateInlist [@dellist1, name2, reader1]; 3040: LADRB 31 3042: LL5 3043: LL2 3044: LFC5 CreateInlist [@addlist2, name3, reader2]; 3045: LADRB 14 3047: LL6 3050: LL4 3051: LFC5 CreateInlist [@dellist2, name4, reader2]; 3052: LADRB 64 3054: LL7 3055: LL4 3056: LFC5 [newer1, newer2] ← MergeSublists [@addlist1, @addlist2, @dellist1, @dellist2, writer]; 3057: LADRB 46 3061: LADRB 14 3063: LADRB 31 3065: LADRB 64 3067: LL3 3070: LFCB 16 3072: SLDB 4 ResetInlist [@addlist1]; 3074: LADRB 46 3076: LFCB 11 ResetInlist [@dellist1]; 3100: LADRB 31 3102: LFCB 11 ResetInlist [@addlist2]; 3104: LADRB 14 3106: LFCB 11 ResetInlist [@dellist2]; 3110: LADRB 64 3112: LFCB 11 [n1, n2] ← MergeSublists [@dellist1, @dellist2, @addlist1, @addlist2, writer]; 3114: LADRB 31 3116: LADRB 64 3120: LADRB 46 3122: LADRB 14 3124: LL3 3125: LFCB 16 3127: NOOP 3130: SLDB 101 newer1 ← newer1 OR n1; 3132: LL0 3133: NOOP 3134: JZNEB 5 (3142) 3136: LLB 101 3140: JZEQB 3 (3144) 3142: LI1 3143: J2 (3145) 3144: LI0 3145: SL0 newer2 ← newer2 OR n2; 3146: LL1 3147: NOOP 3150: JZNEB 5 (3156) 3152: LLB 102 3154: JZEQB 3 (3160) 3156: LI1 3157: J2 (3161) 3160: LI0 3161: SL1 DeleteInlist [@addlist1]; 3162: LADRB 46 3164: LFC6 DeleteInlist [@dellist1]; 3165: LADRB 31 3167: LFC6 DeleteInlist [@addlist2]; 3170: LADRB 14 3172: LFC6 DeleteInlist [@dellist2]; END; 3173: LADRB 64 3175: LFC6 3176: LLDB 4 3200: RET Instructions: 96, Bytes: 146 MergeSublists: PROCEDURE [add1, add2, del1, del2: POINTER TO Inlist, writer: HeapDefs.WriterHandle] RETURNS [newer1, newer2: BOOLEAN] = BEGIN outlist: Outlist; Entry point: 14, Frame size: 19 3202: SL6 3203: NOOP 3204: SLDB 6 3206: SLDB 4 CreateOutlist [@outlist, writer]; 3210: LADRB 13 3212: LL6 3213: LFCB 17 newer1 ← newer2 ← FALSE; 3215: LI0 3216: SL4 3217: PUSH 3220: SL5 UNTIL CompareElements [add1, add2] = Null DO 3221: NOOP 3222: LLDB 4 3224: LFC3 3225: LI3 3226: JEQB 147 (3376) WHILE CompareElements [add1, add2] = Less DO 3230: LLDB 4 3232: LFC3 3233: NOOP 3234: JZNEB 41 (3276) WHILE CompareElements [del2, add1] = Less DO 3236: LL3 3237: LL0 3240: LFC3 3241: NOOP 3242: JZNEB 5 (3250) Get [del2] ENDLOOP; 3244: LL3 3245: LFC4 3246: JB 367 (3236) IF ~(CompareElements [del2, add1] = Equal AND Newer [del2, add1]) THEN BEGIN 3250: LL3 3251: LL0 3252: LFC3 3253: LI1 3254: JNE8 (3264) 3255: LL3 3256: LL0 3257: LFCB 12 3261: NOOP 3262: JZNEB 7 (3272) Put [add1, @outlist]; 3264: LL0 3265: LADRB 13 3267: LFC7 newer1 ← TRUE END; 3270: LI1 3271: SL5 Get [add1] ENDLOOP; 3272: LL0 3273: LFC4 3274: JB 333 (3230) IF CompareElements [add1, add2] = Equal THEN BEGIN 3276: LLDB 4 3300: LFC3 3301: LI1 3302: JNEB 30 (3333) IF Newer [add1, add2] THEN BEGIN 3304: LLDB 4 3306: LFCB 12 3310: JZEQB 10 (3321) Put [add1, @outlist]; 3312: LL0 3313: LADRB 13 3315: LFC7 newer1 ← TRUE END ELSE BEGIN 3316: LI1 3317: SL5 3320: J7 (3327) Put [add2, @outlist]; 3321: LL1 3322: LADRB 13 3324: LFC7 newer2 ← TRUE END; 3325: LI1 3326: SL4 Get [add1]; 3327: LL0 3330: LFC4 Get [add2] END; 3331: LL1 3332: LFC4 WHILE CompareElements [add2, add1]= Less DO 3333: LL1 3334: LL0 3335: LFC3 3336: JZNEB 262 (3221) WHILE CompareElements [del1, add2]= Less DO 3340: LL2 3341: LL1 3342: LFC3 3343: NOOP 3344: JZNEB 5 (3352) Get [del1] ENDLOOP; 3346: LL2 3347: LFC4 3350: JB 367 (3340) IF ~(CompareElements [del1, add2]= Equal AND Newer [del1, add2]) THEN BEGIN 3352: LL2 3353: LL1 3354: LFC3 3355: LI1 3356: JNE8 (3366) 3357: LL2 3360: LL1 3361: LFCB 12 3363: NOOP 3364: JZNEB 344 (3331) Put [add2, @outlist]; 3366: LL1 3367: LADRB 13 3371: LFC7 newer2 ← TRUE END; 3372: LI1 3373: SL4 Get [add2] ENDLOOP; ENDLOOP; 3374: JB 334 (3331) DeleteOutlist [@outlist, writer] END; 3376: LADRB 13 3400: LL6 3401: LFCB 21 3403: LL5 3404: LL4 3405: RET Instructions: 102, Bytes: 132 CreateInlist: PROCEDURE [inlist: POINTER TO Inlist, name: BodyDefs.RName, reader: HeapDefs.ReaderHandle] = BEGIN Entry point: 5, Frame size: 11 3406: SL1 3407: SL2 3410: SL0 inlist.name ← name; 3411: LL2 3412: WILP [0,10] inlist.RNameReader ← HeapDefs.CopyReader[reader]; 3414: LL1 3415: EFC9 3416: WILP [0,0] inlist.RNameStart ← HeapDefs.GetReaderOffset[reader]; 3420: LL1 3421: EFC7 3422: LL0 3423: NOOP 3424: WDB 4 Skip[reader]; 3426: LL1 3427: LFCB 13 inlist.TimestampReader ← HeapDefs.CopyReader [reader]; 3431: LL1 3432: EFC9 3433: WILP [0,1] inlist.TimestampStart ← HeapDefs.GetReaderOffset[reader]; 3435: LL1 3436: EFC7 3437: LL0 3440: WDB 6 Skip[reader]; 3442: LL1 3443: LFCB 13 3445: LIN1 3446: SL3 3447: RIL0 3450: LADRB 7 3452: LI1 3453: EFC0 3454: POP 3455: POP inlist.RNameWordsLeft ← ReadComponentLength[inlist.RNameReader]; 3456: LL3 3457: WILP [0,2] 3461: LIN1 3462: SL3 3463: RILP [0,1] 3465: LADRB 7 3467: LI1 3470: EFC0 3471: POP 3472: POP inlist.TimestampWordsLeft ← ReadComponentLength[inlist.TimestampReader]; 3473: LL3 3474: WILP [0,3] Get[inlist]; END; 3476: LL0 3477: LFC4 3500: RET Instructions: 47, Bytes: 60 ResetInlist: PROCEDURE [inlist: POINTER TO Inlist] = BEGIN Entry point: 9, Frame size: 7 3502: SL0 HeapDefs.SetReaderOffset[inlist.RNameReader, inlist.RNameStart]; 3503: RIL0 3504: LL0 3505: NOOP 3506: RDB 4 3510: EFC8 HeapDefs.SetReaderOffset[inlist.TimestampReader, inlist.TimestampStart]; 3511: RILP [0,1] 3513: LL0 3514: RDB 6 3516: EFC8 3517: LIN1 3520: SL1 3521: RIL0 3522: LADRB 5 3524: LI1 3525: EFC0 3526: POP 3527: POP inlist.RNameWordsLeft ← ReadComponentLength[inlist.RNameReader]; 3530: LL1 3531: WILP [0,2] 3533: LIN1 3534: SL1 3535: RILP [0,1] 3537: LADRB 5 3541: LI1 3542: EFC0 3543: POP 3544: POP inlist.TimestampWordsLeft ← ReadComponentLength[inlist.TimestampReader]; 3545: LL1 3546: WILP [0,3] Get[inlist]; END; 3550: LL0 3551: LFC4 3552: RET Instructions: 33, Bytes: 42 DeleteInlist: PROCEDURE [inlist: POINTER TO Inlist] = BEGIN Entry point: 6, Frame size: 7 3554: SL0 HeapDefs.HeapEndRead[inlist.RNameReader]; 3555: RIL0 3556: EFC6 HeapDefs.HeapEndRead[inlist.TimestampReader]; END; 3557: RILP [0,1] 3561: EFC6 3562: RET Instructions: 6, Bytes: 8 CreateOutlist: PROCEDURE [outlist: POINTER TO Outlist, writer: HeapDefs.WriterHandle] = BEGIN Entry point: 15, Frame size: 7 3564: SLDB 4 outlist.RNameWriter ← writer; 3566: LL1 3567: WILP [0,0] outlist.RNameStart ← HeapDefs.GetWriterOffset[writer]; 3571: LL1 3572: EFC4 3573: LL0 3574: WDB 2 WriteComponentLength[outlist.RNameWriter, 0]--placeholder--; 3576: RIL0 3577: LI0 3600: LFC1 outlist.RNameWordsUsed ← 0; 3601: LI0 3602: WILP [0,4] outlist.TimestampWriter ← HeapDefs.HeapStartWrite[temp]; 3604: LIB 7 3606: EFC10 3607: WILP [0,1] outlist.TimestampWordsUsed ← 0; END; 3611: LI0 3612: WILP [0,5] 3614: RET Instructions: 18, Bytes: 26 DeleteOutlist: PROCEDURE [outlist: POINTER TO Outlist, writer: HeapDefs.WriterHandle] = BEGIN Entry point: 17, Frame size: 11 3616: SLDB 4 3620: DESCB 114 3622: SL6 TimestampStart: HeapDefs.ObjectOffset = HeapDefs.GetWriterOffset[outlist.RNameWriter]; -- write component length for RName list -- 3623: RIL0 3624: EFC4 3625: NOOP 3626: SLDB 6 HeapDefs.SetWriterOffset[outlist.RNameWriter, outlist.RNameStart]; 3630: RIL0 3631: LL0 3632: RDB 2 3634: EFC3 WriteComponentLength[outlist.RNameWriter, outlist.RNameWordsUsed]; 3635: RIL0 3636: RILP [0,4] 3640: LFC1 HeapDefs.SetWriterOffset[outlist.RNameWriter, TimestampStart]; 3641: RIL0 3642: LLDB 6 3644: EFC3 IF outlist.RNameWriter # writer THEN 3645: RIL0 3646: LL1 3647: JEQ3 (3652) ERROR; -- write component length for timestamp list -- 3650: KFCB 46 WriteComponentLength[writer, outlist.TimestampWordsUsed]; -- append timestamp list -- 3652: LL1 3653: RILP [0,5] 3655: LFC1 HeapDefs.HeapEndWrite[outlist.TimestampWriter, CopyToWriter]; END; 3656: RILP [0,1] 3660: LADRB 12 3662: EFC12 3663: RET Instructions: 28, Bytes: 38 CopyToWriter: PROC [object: HeapDefs.ObjectNumber] = BEGIN Entry point: 38, Frame size: 79 3664: LINKB 6 3666: SL4 3667: PL3 3670: PUSH reader: HeapDefs.ReaderHandle = HeapDefs.HeapStartRead [object]; bLength: CARDINAL = 64; buffer: ARRAY [0..bLength) OF WORD; 3671: EFC11 3672: SL2 length: CARDINAL ← outlist.TimestampWordsUsed; 3673: RIL0 3674: RB 5 3676: SL1 WHILE length > 0 3677: LL1 3700: LI0 3701: NOOP 3702: JULEB 61 (3764) DO used: CARDINAL = HeapDefs.HeapReadData[reader, [@buffer,MIN[length,bLength]] ].used; 3704: LL2 3705: LADRB 11 3707: SLB 112 3711: POP 3712: LL1 3713: LIB 100 3715: NOOP 3716: JULB 6 (3725) 3720: PUSH 3721: PUSH 3722: EXCH 3723: POP 3724: J2 (3726) 3725: PUSH 3726: LLB 112 3730: EXCH 3731: SLB 113 3733: POP 3734: LL2 3735: NOOP 3736: LLDB 112 3740: EFC0 3741: EXCH 3742: POP 3743: SLB 111 length ← length - used; 3745: LL1 3746: LLB 111 3750: SUB 3751: SL1 HeapDefs.HeapWriteData[writer, [@buffer,used] ]; ENDLOOP; 3752: RILP [0,1] 3754: LADRB 11 3756: LLB 111 3760: EFC1 3761: NOOP 3762: JB 314 (3677) HeapDefs.HeapEndRead[reader]; END; 3764: LL2 3765: EFC6 3766: RET Instructions: 51, Bytes: 68 Get: PROCEDURE [inlist: POINTER TO Inlist] = BEGIN Entry point: 4, Frame size: 11 3770: SL0 IF inlist.RNameWordsLeft > 0 THEN BEGIN 3771: RILP [0,2] 3773: LI0 3774: JULEB 132 (4127) [] ← HeapDefs.HeapReadRName [inlist.RNameReader, inlist.name]; 3776: RIL0 3777: RILP [0,10] 4001: EFC5 4002: POP 4003: RILP [0,1] 4005: LADRB 5 4007: LI3 4010: EFC0 4011: POP 4012: POP inlist.stamp ← ReadTimestamp [inlist.TimestampReader]; 4013: NOOP 4014: LLDB 5 4016: LL3 4017: LL0 4020: SL4 4021: PUSH 4022: WDB 12 4024: WILP [4,11] IF inlist.TimestampWordsLeft < SIZE[BodyDefs.Timestamp] OR inlist.RNameWordsLeft < BodyDefs.RNameSize[inlist.name] THEN 4026: RILP [0,3] 4030: LI3 4031: NOOP 4032: JULB 15 (4050) 4034: RILP [0,10] 4036: R0 4037: INC 4040: LIN1 4041: SHIFT 4042: LI2 4043: ADD01 4044: RILP [0,2] 4046: JULEB 6 (4055) ERROR MangledHeapObject; 4050: DESCB 2 4052: LIN1 4053: KFCB 43 inlist.TimestampWordsLeft ← inlist.TimestampWordsLeft - SIZE[BodyDefs.Timestamp]; 4055: RILP [0,3] 4057: LI3 4060: SUB 4061: WILP [0,3] inlist.RNameWordsLeft ← inlist.RNameWordsLeft - BodyDefs.RNameSize[inlist.name]; 4063: RILP [0,2] 4065: RILP [0,10] 4067: R0 4070: INC 4071: LIN1 4072: SHIFT 4073: LI2 4074: ADD 4075: SUB 4076: WILP [0,2] IF (inlist.TimestampWordsLeft = 0 OR inlist.RNameWordsLeft = 0) AND inlist.TimestampWordsLeft + inlist.RNameWordsLeft # 0 THEN 4100: RILP [0,3] 4102: JZEQB 5 (4110) 4104: RILP [0,2] 4106: JZNEB 16 (4125) 4110: RILP [0,3] 4112: RILP [0,2] 4114: ADD01 4115: NOOP 4116: JZEQB 6 (4125) ERROR MangledHeapObject; 4120: DESCB 2 4122: LIN1 4123: KFCB 43 inlist.empty ← FALSE; END ELSE 4125: LI0 4126: J2 (4130) inlist.empty ← TRUE; END; 4127: LI1 4130: WILP [0,14] 4132: RET Instructions: 69, Bytes: 100 Put: PROCEDURE [inlist: POINTER TO Inlist, outlist: POINTER TO Outlist] = BEGIN Entry point: 7, Frame size: 7 4134: SL0 4135: SL1 IF inlist.empty THEN 4136: RILP [1,14] 4140: JZEQB 6 (4147) ERROR HeapObjectEnded; 4142: DESCB 0 4144: LIN1 4145: KFCB 43 HeapDefs.HeapWriteRName [outlist.RNameWriter, inlist.name]; 4147: RIL0 4150: RILP [1,10] 4152: EFC2 outlist.RNameWordsUsed ← outlist.RNameWordsUsed + BodyDefs.RNameSize [inlist.name]; 4153: RILP [1,10] 4155: R0 4156: INC 4157: LIN1 4160: SHIFT 4161: LI2 4162: ADD01 4163: RILP [0,4] 4165: ADD01 4166: WILP [0,4] WriteTimestamp [outlist.TimestampWriter, inlist.stamp]; 4170: RILP [0,1] 4172: LL1 4173: NOOP 4174: RDB 11 4176: RILP [1,13] 4200: LFC2 outlist.TimestampWordsUsed ← outlist.TimestampWordsUsed + SIZE [BodyDefs.Timestamp]; END; 4201: RILP [0,5] 4203: LI3 4204: ADD01 4205: WILP [0,5] 4207: RET Instructions: 31, Bytes: 44 CompareElements: PROCEDURE [e1, e2: POINTER TO Inlist] RETURNS [{Less, Equal, Greater, Null}] = BEGIN Entry point: 3, Frame size: 7 4216: SL0 4217: SL1 IF e1.empty THEN 4220: RILP [1,14] 4222: JZEQB 11 (4234) IF e2.empty THEN 4224: RILP [0,14] 4226: JZEQB 31 (4260) RETURN [Null] ELSE 4230: LI3 4231: NOOP 4232: JB 31 (4264) RETURN [Greater] ELSE IF e2.empty THEN 4234: RILP [0,14] 4236: JZNEB 15 (4254) RETURN [Less] ELSE SELECT CompareRNames [e1.name, e2.name] FROM less => 4240: RILP [1,10] 4242: RILP [0,10] 4244: LFCB 15 4246: LI3 4247: JIW 2104 ( 4254) ( 4256) ( 4260) 4252: JB 7 (4262) RETURN[Less]; equal => 4254: LI0 4255: J7 (4264) RETURN[Equal]; greater => 4256: LI1 4257: J5 (4264) RETURN[Greater]; ENDCASE => 4260: LI2 4261: J3 (4264) ERROR; END; 4262: KFCB 46 4264: RET Instructions: 25, Bytes: 46 Newer: PROCEDURE [e1, e2: POINTER TO Inlist] RETURNS [BOOLEAN] = BEGIN Entry point: 10, Frame size: 7 4266: SLDB 4 RETURN [CompareTimestamps [e1.stamp, e2.stamp] = greater] END; 4270: LI0 4271: ALLOC 4272: SL2 4273: LL0 4274: LIB 11 4276: ADD01 4277: LI3 4300: LL2 4301: BLT 4302: LL1 4303: LIB 11 4305: ADD01 4306: LI3 4307: LL2 4310: LI3 4311: ADD 4312: BLT 4313: LL2 4314: LFCB 14 4316: LI2 4317: JEQ3 (4322) 4320: LI0 4321: J2 (4323) 4322: LI1 4323: RET Instructions: 26, Bytes: 30 CompareRNames: PUBLIC PROC[n1, n2: BodyDefs.RName] RETURNS [RegistryDefs.Comparison] = BEGIN Entry point: 13, Frame size: 11 4324: SLDB 5 length: CARDINAL = MIN [n1.length, n2.length]; i: CARDINAL; 4326: RILP [1,0] 4330: RILP [2,0] 4332: JULB 6 (4341) 4334: PUSH 4335: PUSH 4336: EXCH 4337: POP 4340: J2 (4342) 4341: PUSH 4342: PL3 FOR i IN [0 .. length) DO 4343: SL6 4344: LI0 4345: NOOP 4346: JB 105 (4454) 4350: PUSH 4351: SL0 BEGIN ch1: CHARACTER = IF n1[i] IN CHARACTER['A .. 'Z] THEN (n1[i] - 'A) + 'a ELSE n1[i]; 4352: LL1 4353: LL0 4354: RSTR 4 4356: LIB 101 4360: JLB 17 (4400) 4362: PUSH 4363: LIB 132 4365: NOOP 4366: JGB 11 (4400) 4370: LL1 4371: LL0 4372: RSTR 4 4374: LIB 40 4376: ADD01 4377: J5 (4404) 4400: LL1 4401: LL0 4402: RSTR 4 4404: SL4 ch2: CHARACTER = IF n2[i] IN CHARACTER['A .. 'Z] THEN (n2[i] - 'A) + 'a ELSE n2[i]; 4405: LL2 4406: LL0 4407: NOOP 4410: RSTR 4 4412: LIB 101 4414: JLB 17 (4434) 4416: PUSH 4417: LIB 132 4421: NOOP 4422: JGB 11 (4434) 4424: LL2 4425: LL0 4426: RSTR 4 4430: LIB 40 4432: ADD01 4433: J5 (4440) 4434: LL2 4435: LL0 4436: RSTR 4 4440: SL5 IF ch1 < ch2 THEN 4441: NOOP 4442: LLDB 10 4444: JLB 21 (4466) RETURN [less]; IF ch1 > ch2 THEN 4446: LLDB 10 4450: JGB 26 (4477) RETURN [greater]; END ENDLOOP; 4452: LL0 4453: INC 4454: LL6 4455: NOOP 4456: JULB 271 (4350) IF n1.length < n2.length THEN 4460: RILP [1,0] 4462: RILP [2,0] 4464: JUGEB 3 (4470) RETURN [less] ELSE 4466: LI0 4467: J9 (4500) IF n1.length = n2.length THEN 4470: RILP [1,0] 4472: RILP [2,0] 4474: JNE3 (4477) RETURN [equal] ELSE 4475: LI1 4476: J2 (4500) RETURN [greater]; END; 4477: LI2 4500: RET Instructions: 78, Bytes: 110 CompareTimestamps: PUBLIC ENTRY PROC[t1, t2: BodyDefs.Timestamp] RETURNS [RegistryDefs.Comparison] = BEGIN -- Garbage check: treat timestamps more than 14 days future as 0 -- Entry point: 12, Frame size: 15 4502: DUP 4503: NOOP 4504: SLDB 14 4506: LLB 15 4510: LI3 4511: ADD01 4512: LI3 4513: LADRB 7 4515: BLT 4516: LLB 14 4520: LI3 4521: LADRB 4 4523: BLT 4524: LLB 14 4526: FREE 4527: GADRB 3 4531: ME 4532: JZEQB 374 (4527) latest: Time.Packed = LOOPHOLE[ prevTime + (LONG[futureLimit] * 24) * 60 * 60 ]; 4534: LG3 4535: LI0 4536: LIB 30 4540: LI0 4541: KFCB 64 4543: LIB 74 4545: LI0 4546: KFCB 64 4550: LIB 74 4552: LI0 4553: KFCB 64 4555: NOOP 4556: LGDB 4 4560: DADD 4561: NOOP 4562: SLDB 12 IF t1.time > latest THEN 4564: LLDB 5 4566: LLDB 12 4570: DUCOMP 4571: LI0 4572: JGB 67 (4662) RETURN [less]; IF t2.time > latest THEN 4574: LLDB 10 4576: LLDB 12 4600: DUCOMP 4601: LI0 4602: JGB 77 (4702) RETURN [greater]; IF t1.time < t2.time THEN 4604: LLDB 5 4606: LLDB 10 4610: DUCOMP 4611: LI0 4612: JLB 47 (4662) RETURN [less]; IF t1.time > t2.time THEN 4614: LLDB 5 4616: LLDB 10 4620: DUCOMP 4621: LI0 4622: JGB 57 (4702) RETURN [greater]; IF t1.net < t2.net THEN 4624: LL0 4625: LINB 370 4627: SHIFT 4630: LL3 4631: LINB 370 4633: SHIFT 4634: JLB 25 (4662) RETURN [less]; IF t1.net > t2.net THEN 4636: LL0 4637: LINB 370 4641: SHIFT 4642: LL3 4643: LINB 370 4645: SHIFT 4646: JGB 33 (4702) RETURN [greater]; IF t1.host < t2.host THEN 4650: LL0 4651: LIB 377 4653: AND 4654: LL3 4655: LIB 377 4657: AND 4660: JGEB 7 (4670) RETURN [less]; 4662: GADRB 3 4664: MXD 4665: LI0 4666: JB 24 (4713) IF t1.host > t2.host THEN 4670: LL0 4671: LIB 377 4673: AND 4674: LL3 4675: LIB 377 4677: AND 4700: JLEB 6 (4707) RETURN [greater]; 4702: GADRB 3 4704: MXD 4705: LI2 4706: J5 (4713) RETURN [equal] END; 4707: GADRB 3 4711: MXD 4712: LI1 4713: RET Instructions: 94, Bytes: 138 MakeTimestamp: PUBLIC ENTRY PROCEDURE RETURNS [stamp: BodyDefs.Timestamp] = BEGIN newTime: Time.Packed; Entry point: 19, Frame size: 11 4714: GADRB 3 4716: ME 4717: NOOP 4720: JZEQB 373 (4714) WHILE (newTime ← Time.Current[]) = prevTime DO 4722: EFC13 4723: NOOP 4724: SLDB 7 4726: PUSH 4727: PUSH 4730: LGDB 4 4732: DUCOMP 4733: NOOP 4734: JZNEB 21 (4756) WAIT aWeeWhile -- ensure uniqueness of timestamps -- ENDLOOP; 4736: GADRB 3 4740: GADRB 12 4742: DUP 4743: R1 4744: MXW 4745: GADRB 3 4747: GADRB 12 4751: MRE 4752: JZEQB 372 (4745) 4754: JB 345 (4722) stamp.net ← ThisMachine.net; 4756: LG4 4757: LINB 370 4761: SHIFT 4762: LADRB 4 4764: LI0 4765: NOOP 4766: WSTR 0 stamp.host ← ThisMachine.host; 4770: LG4 4771: LIB 377 4773: AND 4774: LADRB 4 4776: LI0 4777: NOOP 5000: WSTR 1 stamp.time ← prevTime ← newTime; END; ThisMachine: PupStream.PupAddress; -- regPurger subroutines -- 5002: LLDB 7 5004: SGDB 4 5006: PUSH 5007: PUSH 5010: SLDB 5 5012: GADRB 3 5014: MXD 5015: NOOP 5016: LLDB 4 5020: LL2 5021: RET Instructions: 48, Bytes: 70 CheckStampList: PUBLIC PROC[reader: HeapDefs.ReaderHandle, limit: BodyDefs.PackedTime] RETURNS[old: BOOLEAN] = BEGIN Entry point: 29, Frame size: 19 5022: SLDB 5 5024: SL0 5025: LIN1 5026: SL5 5027: LL0 5030: LADRB 11 5032: LI1 5033: EFC0 5034: POP 5035: POP length: CARDINAL = ReadComponentLength[reader]; 5036: LL5 5037: PL3 THROUGH [0..length/SIZE[BodyDefs.Timestamp]) DO 5040: LI3 5041: DIV 5042: SLB 15 5044: LI0 5045: NOOP 5046: JB 42 (5111) 5050: PUSH 5051: SLB 14 5053: LL0 5054: LADRB 11 5056: LI3 5057: EFC0 5060: POP 5061: POP IF ReadTimestamp[reader].time < limit THEN 5062: LLDB 11 5064: LL7 5065: NOOP 5066: SLDB 16 5070: POP 5071: NOOP 5072: LLDB 16 5074: LLDB 5 5076: DUCOMP 5077: LI0 5100: JGEB 5 (5106) RETURN[TRUE] ENDLOOP; 5102: LI1 5103: NOOP 5104: JB 12 (5117) 5106: LLB 14 5110: INC 5111: LLB 15 5113: NOOP 5114: JLB 333 (5050) RETURN[FALSE] END; 5116: LI0 5117: RET Instructions: 47, Bytes: 62 FilterStampList: PUBLIC PROC[reader: HeapDefs.ReaderHandle, limit: BodyDefs.PackedTime, writer: HeapDefs.WriterHandle] = BEGIN Entry point: 36, Frame size: 23 5120: SL0 5121: NOOP 5122: SLDB 11 5124: SL1 5125: NOOP 5126: DESCB 122 5130: SLB 16 namePos: HeapDefs.ObjectOffset = HeapDefs.GetWriterOffset[writer]; 5132: LL0 5133: EFC4 5134: SLDB 13 nameLength: CARDINAL ← 0; stampLength: CARDINAL; 5136: LI0 5137: SL4 stampReader: HeapDefs.ReaderHandle = HeapDefs.CopyReader[reader]; 5140: LL1 5141: EFC9 5142: PL2 Skip[stampReader]; 5143: LFCB 13 5145: LIN1 5146: SLB 17 5150: LL2 5151: LADRB 17 5153: LI1 5154: EFC0 5155: POP 5156: POP stampLength ← ReadComponentLength[stampReader]; 5157: LLB 17 5161: SL3 WriteComponentLength[writer, 0]; 5162: LL0 5163: LI0 5164: LFC1 EnumerateRList[reader, Action]; 5165: LL1 5166: LADRB 16 5170: LFCB 22 BEGIN newPos: HeapDefs.ObjectOffset = HeapDefs.GetWriterOffset[writer]; 5172: LL0 5173: EFC4 5174: SLDB 17 HeapDefs.SetWriterOffset[writer, namePos]; 5176: LL0 5177: NOOP 5200: LLDB 13 5202: EFC3 WriteComponentLength[writer, nameLength]; 5203: LL0 5204: LL4 5205: LFC1 HeapDefs.SetWriterOffset[writer, newPos]; END; 5206: LL0 5207: NOOP 5210: LLDB 17 5212: EFC3 HeapDefs.HeapEndRead[stampReader]; 5213: LL2 5214: EFC6 WriteComponentLength[writer, stampLength]; 5215: LL0 5216: LL3 5217: LFC1 5220: LIN1 5221: SLB 17 5223: LL1 5224: LADRB 17 5226: LI1 5227: EFC0 5230: POP 5231: POP THROUGH [0..ReadComponentLength[reader]/SIZE[BodyDefs.Timestamp]) 5232: LLB 17 5234: LI3 5235: DIV 5236: SLB 26 5240: LI0 5241: NOOP 5242: JB 45 (5310) 5244: PUSH 5245: SLB 25 DO 5247: LL1 5250: LADRB 22 5252: LI3 5253: EFC0 5254: POP 5255: POP stamp: BodyDefs.Timestamp = ReadTimestamp[reader]; 5256: LLDB 22 5260: LLB 24 5262: SLDB 20 5264: SLB 17 IF stamp.time >= limit THEN 5266: LLDB 20 5270: LLDB 11 5272: DUCOMP 5273: LI0 5274: JLB 10 (5305) WriteTimestamp[writer, stamp]; ENDLOOP; END; 5276: LL0 5277: NOOP 5300: LLDB 17 5302: LLB 21 5304: LFC2 5305: LLB 25 5307: INC 5310: LLB 26 5312: JLB 331 (5244) 5314: RET Instructions: 93, Bytes: 126 Action: PROC[name: BodyDefs.RName] RETURNS[done:BOOLEAN] = BEGIN Entry point: 41, Frame size: 15 5316: LINKB 12 5320: SL1 5321: RILP [0,2] 5323: LADRB 12 5325: LI3 5326: EFC0 5327: POP 5330: POP stamp: BodyDefs.Timestamp = ReadTimestamp[stampReader]; 5331: NOOP 5332: LLDB 12 5334: LLB 14 5336: SLDB 10 5340: SL3 done ← FALSE; 5341: LI0 5342: SL2 IF stamp.time >= limit THEN BEGIN 5343: NOOP 5344: LLDB 10 5346: LL0 5347: NOOP 5350: RDB 5 5352: DUCOMP 5353: LI0 5354: JLB 21 (5376) HeapDefs.HeapWriteRName[writer, name]; 5356: RIL0 5357: LL1 5360: EFC2 nameLength ← nameLength + BodyDefs.RNameSize[name]; END ELSE 5361: RILP [1,0] 5363: INC 5364: LIN1 5365: SHIFT 5366: LI2 5367: ADD01 5370: RILP [0,4] 5372: ADD01 5373: WILP [0,4] 5375: J7 (5404) stampLength ← stampLength - SIZE[BodyDefs.Timestamp]; END; 5376: RILP [0,3] 5400: LI3 5401: SUB 5402: WILP [0,3] 5404: LL2 5405: RET Instructions: 42, Bytes: 56 Total instructions: 1932, Bytes: 2642