AlpineEnvironment: PROGRAM 2201 VERSION 1 = BEGIN DEPENDS UPON Time (15) VERSION 2; GMT: TYPE = Time.Time; ByteCount: TYPE = LONG INTEGER; FalseBool: TYPE = BOOLEAN; FileStore: TYPE = Principal; -- an Alpine instance FileVersion: TYPE = LONG INTEGER; OpenFileID: TYPE = LONG CARDINAL; -- represents a single client's access to a single file under a single transaction. Unique only within a single Alpine instance. OwnerName: TYPE = STRING; -- an Alpine owner, not necessarily an RName PageCount: TYPE = LONG INTEGER; PageNumber: TYPE = LONG INTEGER; -- should be [0..maxPagesPerFile] Principal: TYPE = STRING; -- an individual from some authentication domain (GV or CH) RName: TYPE = STRING; -- an arbitrary Grapevine (or Clearinghouse) RName AccessRights: TYPE = { readOnly(0), readWrite(1) }; CommitOrAbort: TYPE = { -- logically a subtype of Outcome abort(0), commit(1) }; ConflictResolution: TYPE = { wait(0), fail(1) }; LockFailure: TYPE = { conflict(0), -- lock cannot immediately be set because a conflicting lock is already set by another transaction timeout(1) -- lock cannot be set even after waiting a long time, perhaps due to undetected deadlock }; LockMode: TYPE = { none(0), read(1), update(2), write(3), readIntendUpdate(4), readIntendWrite(5), intendRead(6), intendUpdate(7), intendWrite(8) }; NeededAccess: TYPE = { alpineWheel(0), fileModify(1), fileRead(2), handleReadWrite(3), ownerCreate(4), ownerEntry(5), spaceQuota(6) }; -- when access is denied, indicates the access control list in which client's membership was required but not present OperationFailure: TYPE = { busy(0), -- server is too busy to start another transaction damagedLeaderPage(1), -- file properties are messed up (probable Alpine bug) duplicateOwner(2), duplicateVolumeGroup(3), duplicateVolume(4), inconsistentDescriptor(5), -- PageBuffer word count and PageRun page count are inconsistent volumeFragmented(6), -- cannot find enough contiguous pages to create or extend file insufficientSpace(7), -- in volume group to create or extend file, or in leader page to write property nonexistentFilePage(8), -- attempted to access page beyond last page of file notAlpineWheel(9), -- failure from AssertAlpineWheel ownerDatabaseFull(10), ownerFileFormatOrVolGroupMismatch(11), ownerRecordFull(12), ownerRecordInUse(13), quotaExceeded(14), -- attempt to create or extend file would exceed owner's quota regServersUnavailable(15), -- access check failed due to Grapevine unavailability spaceInUseByThisOwner(16), tooManyRNames(17), totalQuotaExceeded(18), unwritableProperty(19) -- attempted to write the version property with WriteProperties }; Outcome: TYPE = { abort(0), commit(1), unknown(2) }; OwnerProperty: TYPE = { createAccessList(0), modifyAccessList(1), quota(2), spaceInUse(3), rootFile(4) }; Property: TYPE = { byteLength(0), createTime(1), highWaterMark(2), modifyAccess(3), owner(4), readAccess(5), stringName(6), version(7) }; PropertySet: TYPE = ARRAY 8 OF FalseBool; -- PACKED ARRAY [Property] RecoveryOption: TYPE = { log(0), noLog(1) }; ReferencePattern: TYPE = { random(0), sequential(1) }; -- a client-supplied hint about the expected pattern of references to pages of a file. Sequential means that when the client reads or writes an interval [p .. p+n) of the file, there is a high likelihood that it will reference pages [p+n .. p+2*n) in the near future. Random means that no such pattern is expected. Specifying this hint accurately enables the server to perform the operations more quickly and efficiently. UnknownType: TYPE = { coordinator(0), -- coordinator RName not known to Grapevine (CreateWorker) fileID(1), -- no file with this ID in specified volume openFileID(2), -- no open file with this ID, or ID presented from wrong conversation owner(3), -- no owner with this name in owner data base for specified volume group transID(4), -- no transaction active with this ID on this Alpine instance. It may be that the transaction has aborted or that the server has crashed and restarted. volumeID(5), -- no volume with this ID is on-line volumeGroupID(6) -- no volume group with this ID is on-line }; WorkerState: TYPE = { notReady(0), readOnlyReady(1), ready(2) }; OwnerPropertySet: TYPE = ARRAY 5 OF FalseBool; -- PACKED ARRAY OwnerProperty TransID: TYPE = ARRAY 9 OF CARDINAL; -- globally permanently unique capability for a transaction FID: TYPE = ARRAY 2 OF CARDINAL; -- (File.FileID); DA: TYPE = ARRAY 2 OF CARDINAL; -- (File.DA); VolOrVolGroupID: TYPE = ARRAY 5 OF CARDINAL; -- File.VolumeID; FileID: TYPE = RECORD [ id: FID, -- (0) (File.FileID) da: DA -- (2) (File.DA) ]; -- volume-relative ID of a file LockOption: TYPE = RECORD [ mode: LockMode, ifConflict: ConflictResolution ]; PageRun: TYPE = RECORD [ firstPage: PageNumber, count: CARDINAL ]; UniversalFile: TYPE = RECORD [ -- globally permanently unique identification of a file volumeID: VolumeID, fileID: FileID ]; VolumeGroupID: TYPE = RECORD [ vgid: VolOrVolGroupID ]; VolumeID: TYPE = RECORD [ vgid: VolOrVolGroupID ]; VolumeIDs: TYPE = SEQUENCE OF VolumeID; OwnerPropertyValuePair: TYPE = CHOICE OwnerProperty OF { createAccessList => AccessList, -- (0) modifyAccessList => AccessList, -- (1) quota => PageCount, -- (2) spaceInUse => PageCount, -- (3) readOnly rootFile => UniversalFile -- (4) }; OwnerProperties: TYPE = SEQUENCE OF OwnerPropertyValuePair; PropertyValuePair: TYPE = CHOICE Property OF { byteLength => ByteCount, -- (0) createTime => GMT, -- (1) highWaterMark => PageCount, -- (2) modifyAccess => AccessList, -- (3) owner => OwnerName, -- (4) readAccess => AccessList, -- (5) stringName => STRING, -- (6) version => FileVersion -- (7) }; Properties: TYPE = SEQUENCE OF PropertyValuePair; AccessList: TYPE = SEQUENCE OF RName; allOwnerProperties: OwnerPropertySet = [TRUE, TRUE, TRUE, TRUE, TRUE]; bytesPerPage: CARDINAL = 512; -- (wordsPerPage *Basics.bytesPerWord) logBytesPerPage: CARDINAL = 9; -- (logWordsPerPage + Basics.logBytesPerWord) logWordsPerPage: CARDINAL = 8; -- ugh! maxPagesPerFile: LONG INTEGER = 17777777777B; -- (File.PageCount.LAST) maxStringNameChars: CARDINAL = 100; -- max length of any string appearing in a property nullFileID: FileID = [id: [0, 0], da: [0, 0]]; -- (File.nullFP) the ID of no file nullOpenFileID: OpenFileID = 0; -- ID of no open file nullRootFile: UniversalFile = [volumeID: nullVolumeID, fileID: nullFileID]; nullTransID: TransID = nullTransIDRep; -- ID of no transaction nullTransIDRep: TransID = [0, 0, 0, 0, 0, 0, 0, 0, 0]; nullUniversalFile: UniversalFile = [volumeID: nullVolumeID, fileID: nullFileID]; nullVolumeGroupID: VolumeGroupID = [vgid: [0, 0, 0, 0, 0]]; -- (File.nullVolumeID) the ID of no volume group nullVolumeID: VolumeID = [vgid: [0, 0, 0, 0, 0]]; -- (File.nullVolumeID) the ID of no volume wordsPerPage: CARDINAL = 256; -- (File.wordsPerPage) END. „AlpineEnvironment1.cr Copyright c 1986 by Xerox Corporation. All rights reserved. Bill Jackson (bj) August 9, 1986 8:17:20 pm PDT Carl Hauser, November 9, 1987 1:04:12 pm PST Copied types Primitive types Enumerated types Array types Record Types The permanent identification of a file. "id" is permanently unique relative to a volume. Choice Types Sequence Types Constants Κ`– "cedar" style˜šœ™Icodešœ Οmœ1™˜QKšœ‘6˜QKšœ˜Kšœ˜Kšœ˜Kšœ‘?˜VKšœ˜K˜—šœ Ÿœ˜Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ˜K˜—šœŸœ˜Kšœ˜Kšœ˜Kšœ ˜ Kšœ˜Kšœ ˜ Kšœ˜K˜—šœ Ÿœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ ˜ Kšœ˜Kšœ˜Kšœ ˜ Kšœ˜K˜—Kšœ ŸœŸœŸœ ‘˜DK˜šœŸœ˜Kšœ˜Kšœ˜Kšœ˜K˜—šœŸœ˜Kšœ ˜ Kšœ ˜ Kšœ‘¨˜«K˜—šœ Ÿœ˜Kšœ‘:˜JKšœ ‘+˜6Kšœ‘E˜TKšœ ‘H˜RKšœ ‘—˜£Kšœ ‘$˜1Kšœ‘*˜;Kšœ˜K˜—šœ Ÿœ˜Kšœ ˜ Kšœ˜Kšœ˜Kšœ˜—K˜—šœ ™ J˜KšœŸœŸœŸœ ‘˜LKš œ ŸœŸœŸœŸœ‘;˜`Kš ŸœŸœŸœŸœŸœ‘˜2Kš ŸœŸœŸœŸœŸœ‘ ˜-Kš œŸœŸœŸœŸœ‘˜>J˜—šœ ™ J™šœŸœŸœ˜KšœY™YKšœŸœ‘˜KšœŸœ‘˜Kšœ‘˜"K˜—šœ ŸœŸœ˜K˜Kšœ˜K˜K˜—šœ ŸœŸœ˜K˜KšœŸ˜Kšœ˜K˜—šœŸœŸœ‘7˜VKšœ˜Kšœ˜Kšœ˜K˜—šœŸœŸœ˜Kšœ˜Kšœ˜K˜—šœ ŸœŸœ˜Kšœ˜Kšœ˜—K˜Iunitšœ ŸœŸœŸœ ˜'—L˜šœ ™ J™šœŸœŸœŸœ˜8Kšœ ‘˜&Kšœ ‘˜&Kšœ‘˜Kšœ‘˜(Kšœ‘˜ Kšœ˜K˜—LšœŸœŸœŸœ˜;L˜šœŸœŸœ Ÿœ˜.Kšœ‘˜KšœŸœ‘˜Kšœ‘˜"Kšœ‘˜"Kšœ‘˜Kšœ‘˜ KšœŸœ‘˜Kšœ‘˜Kšœ˜K˜—Jšœ ŸœŸœŸœ˜1K˜—™J™Jšœ ŸœŸœŸœ˜%J˜—šœ ™ J˜Kš œ(ŸœŸœŸœŸœŸœ˜FKšœŸœ‘&˜DKšœŸœ‘-˜LKšœŸœ‘˜'KšœŸœŸœ‘˜FKšœŸœ‘3˜WKšœ/‘"˜QKšœ ‘˜5KšœK˜KKšœ'‘˜>Kšœ6˜6KšœP˜PKšœ<‘0˜lKšœ2‘*˜\KšœŸœ‘˜4—K˜JšŸœ˜K™—…—Θ$¬