DIRECTORY AlpineEnvironment USING[FileID, VolumeID], AlpineInternal USING[FPMFileHandle, LogMapHandle], FileMap, FileMapPrivate USING[FileObject], Rope USING[ROPE]; FileMapObjectImpl: CEDAR MONITOR LOCKS handle USING handle: Handle EXPORTS AlpineInternal, FileMap = BEGIN OPEN AE: AlpineEnvironment, AI: AlpineInternal, FMP: FileMapPrivate; Handle: TYPE = REF FileObject; FileObject: PUBLIC TYPE = FMP.FileObject; GetVolumeID: PUBLIC PROCEDURE[handle: Handle] RETURNS [volumeID: AE.VolumeID] = BEGIN -- errors defined in FileMap: none. RETURN[handle.volumeID]; END; GetFileID: PUBLIC PROCEDURE[handle: Handle] RETURNS [file: AE.FileID] = BEGIN -- errors defined in FileMap: none. RETURN[handle.fileID]; END; GetVolumeIDAndFileID: PUBLIC PROCEDURE[handle: Handle] RETURNS [volumeID:AE.VolumeID, fileID: AE.FileID] = BEGIN -- errors defined in FileMap: none. RETURN[handle.volumeID, handle.fileID]; END; GetName: PUBLIC PROC [handle: Handle] RETURNS [Rope.ROPE] ~ { RETURN[handle.name]; }; SetName: PUBLIC PROC [file: Handle, name: Rope.ROPE] ~ { file.name _ name }; SetInterlock: PUBLIC ENTRY PROCEDURE [handle: Handle, new: BOOLEAN] RETURNS [old: BOOLEAN] = BEGIN -- errors defined in FileMap: none. old _ handle.interlock; handle.interlock _ new; END; VerifyLogMapHandle: PUBLIC ENTRY PROCEDURE [handle: Handle, proc: PROCEDURE RETURNS [AI.LogMapHandle]] RETURNS [logMapHandle: AI.LogMapHandle] = BEGIN -- errors defined in FileMap: none. ENABLE UNWIND => NULL; IF handle.logMapHandle = NIL THEN handle.logMapHandle _ proc[]; RETURN[handle.logMapHandle]; END; VerifyFilePageMgrHandle: PUBLIC ENTRY PROCEDURE[handle: Handle, proc: PROCEDURE RETURNS [AI.FPMFileHandle]] RETURNS [filePageMgrHandle: AI.FPMFileHandle] = BEGIN -- errors defined in FileMap: none. ENABLE UNWIND => NULL; IF handle.fPMFileHandle = NIL THEN handle.fPMFileHandle _ proc[]; RETURN[handle.fPMFileHandle]; END; ClearLogMapHandle: PUBLIC ENTRY PROCEDURE [handle: Handle, proc: PROCEDURE RETURNS [AI.LogMapHandle]] = BEGIN -- errors defined in FileMap: none. ENABLE UNWIND => NULL; handle.logMapHandle _ proc[]; END; Enter: PUBLIC ENTRY PROCEDURE [handle: Handle, proc: PROCEDURE] = BEGIN -- errors defined in FileMap: none. ENABLE UNWIND => NULL; proc[]; END; END. CHANGE LOG. Initial: Kolling: October 12, 1982 12:13 pm: an impl module for FileMap. FileMapObjectImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Last edited by Kolling on May 17, 1983 3:40 pm Last Edited by: Kupfer, January 31, 1985 5:27:37 pm PST okay to read without monitor. okay to read without monitor. okay to read without monitor. okay to read without monitor (ie., we don't care about the race condition) The callers of VerifyLogMapHandle, VerifyFilePageMgrHandle, and ClearLogMapHandle are absolutely responsible for catching any signals raised by proc and forcing the unwind that will release the monitor. proc may return NIL if it is just doing an existence check. proc may or may not result in the LogMapHandle being cleared. Procedure to enter the Object's monitor, e.g., to serialize references to the file designated by the Object. The caller of Enter is absolutely responsible for catching any signals raised by proc and forcing the unwind that will release the monitor that Enter holds. Edited on January 31, 1985 5:25:17 pm PST, by Kupfer Added GetName, SetName. Κ_˜Icodešœ™Kšœ Οmœ1™<šœ™Kšœ™—™7K˜K˜—KšΟk ˜ ˜˜Kšžœ˜—˜Kšžœ˜#—K˜˜Kšžœ ˜—šœ˜Kšžœžœ˜ —˜K˜——š œžœžœžœžœ˜BKšžœ˜!K˜K˜—Kš žœžœžœžœžœ˜JK˜K˜Kšœžœžœ ˜Kšœ žœžœžœ ˜)K˜K˜Kšœ™K˜š Οn œžœž œžœ žœ ˜PKšžœΟc$˜+Kšžœ˜Kšžœ˜K˜K˜—Kšœ™K˜š Ÿ œžœž œžœžœ ˜HKšžœ $˜+Kšžœ˜Kšžœ˜K˜K˜—Kšœ™K˜š Ÿœžœž œžœ žœžœ ˜kKšžœ $˜+Kšžœ!˜'šžœ˜K˜K˜——KšœJ™JK˜š Ÿœžœžœžœžœ˜=Jšžœ˜J˜—J˜š œŸœžœžœžœ˜9Jšœ˜J˜K˜—K˜šŸ œžœžœž œžœžœžœ˜]Kšžœ $˜+K˜K˜šžœ˜K˜K˜K˜——KšœΚ™ΚK˜šŸœžœžœž œžœžœžœžœ˜Kšžœ $˜+Kšžœžœžœ˜Kšžœžœžœ˜?Kšžœ˜šžœ˜K˜K˜——Kšœ;™;K˜šŸœžœžœž œžœžœžœžœ˜›Kšžœ $˜+Kšžœžœžœ˜Kšžœžœžœ˜AKšžœ˜šžœ˜K˜K˜——Kšœ=™=K˜š Ÿœžœžœž œžœžœ˜gKšžœ $˜+Kšžœžœžœ˜K˜šžœ˜K˜K˜K˜K˜——KšœŠ™ŠK˜š Ÿœžœžœž œž œ˜AKšžœ #˜*Kšžœžœžœ˜K˜Kšžœ˜K˜K˜K˜K˜—Kšžœ˜K˜šžœžœ˜ K˜—K˜HK˜šœ4™4K™K™——…— T·