fixed the keep-last-file-open mechanism (I hope)
authorClaus Gittinger <cg@exept.de>
Mon, 29 Nov 1999 14:38:02 +0100
changeset 5025 8b1b6a4f4202
parent 5024 abff1ede34d1
child 5026 6406b4765e48
fixed the keep-last-file-open mechanism (I hope) this might need testing.
Method.st
--- a/Method.st	Sat Nov 27 18:32:39 1999 +0100
+++ b/Method.st	Mon Nov 29 14:38:02 1999 +0100
@@ -415,26 +415,6 @@
             ]
         ].
 
-        "/ keep the last source file open, because open/close
-        "/ operations maybe slow on NFS-mounted file systems.
-        "/ Since the reference to the file is weak, it will be closed
-        "/ automatically if the file is not referenced for a while. 
-        "/ Neat trick.
-
-        LastFileLock critical:[
-            aStream := LastFileReference at:1.
-            LastFileReference at:1 put:0.
-
-            aStream == 0 ifTrue:[
-                aStream := nil.
-            ] ifFalse:[
-                LastSourceFileName = source ifFalse:[
-                    aStream close.
-                    aStream := nil.
-                ].
-            ].
-        ].
-
         aStream := self sourceStream.
         aStream notNil ifTrue:[
             Stream positionErrorSignal handle:[:ex |
@@ -449,18 +429,10 @@
                  kludge for now - somehow this does not work under win32 (sigh)
                 "
                 aStream close.
-            ] ifFalse:[
-                "
-                 keep a weak reference - it may be needed again soon ...
-                "
-                LastFileLock critical:[
-                    (LastFileReference at:1) == 0 ifTrue:[
-                        LastFileReference at:1 put:aStream.
-                        LastSourceFileName := source.
-                    ] ifFalse:[
-                        aStream close.
-                    ].
-                ].
+                (LastFileReference at:1) == aStream ifTrue:[
+                    LastFileReference at:1 put:0.
+                    LastSourceFileName := nil.
+                ]
             ].
         ]
     ].
@@ -530,7 +502,7 @@
      Otherwise, source is the real source
     "
     source isNil ifTrue:[^ nil].
-    sourcePosition isNil ifTrue:[^ nil].
+    sourcePosition isNil ifTrue:[^ source readStream].
 
     "/ keep the last source file open, because open/close
     "/ operations maybe slow on NFS-mounted file systems.
@@ -548,8 +520,15 @@
             LastSourceFileName = source ifFalse:[
                 aStream close.
                 aStream := nil.
-            ].
+            ]
         ].
+        LastSourceFileName := nil.
+    ].
+
+    aStream notNil ifTrue:[
+        LastSourceFileName := source.
+        LastFileReference at:1 put:aStream.
+        ^ aStream
     ].
 
     "/ a negative sourcePosition indicates
@@ -561,12 +540,20 @@
 
     sourcePosition < 0 ifTrue:[
         aStream := source asFilename readStream.
-        aStream notNil ifTrue:[^ aStream].
+        aStream notNil ifTrue:[
+            LastSourceFileName := source.
+            LastFileReference at:1 put:aStream.
+            ^ aStream
+        ].
 
         fileName := Smalltalk getSourceFileName:source.
         fileName notNil ifTrue:[
             aStream := fileName asFilename readStream.
-            aStream notNil ifTrue:[^ aStream].
+            aStream notNil ifTrue:[
+                LastSourceFileName := source.
+                LastFileReference at:1 put:aStream.
+                ^ aStream
+            ].
         ].
     ].
 
@@ -575,7 +562,11 @@
     "/
     (mgr := Smalltalk at:#SourceCodeManager) isNil ifTrue:[
         aStream := self localSourceStream.
-        aStream notNil ifTrue:[^ aStream].
+        aStream notNil ifTrue:[
+            LastSourceFileName := source.
+            LastFileReference at:1 put:aStream.
+            ^ aStream
+        ].
     ].
 
     "/
@@ -593,13 +584,21 @@
                     mod := package copyTo:sep - 1.
                     dir := package copyFrom:sep + 1.
                     aStream := mgr streamForClass:nil fileName:source revision:nil directory:dir module:mod cache:true.
-                    aStream notNil ifTrue:[^ aStream].
+                    aStream notNil ifTrue:[
+                        LastSourceFileName := source.
+                        LastFileReference at:1 put:aStream.
+                        ^ aStream
+                    ].
                 ].
             ].
         ].
 
         aStream := myClass sourceStreamFor:source.
-        aStream notNil ifTrue:[^ aStream].
+        aStream notNil ifTrue:[
+            LastSourceFileName := source.
+            LastFileReference at:1 put:aStream.
+            ^ aStream
+        ].
     ].
 
     "/
@@ -608,7 +607,11 @@
     "/
     mgr notNil ifTrue:[
         aStream := self localSourceStream.
-        aStream notNil ifTrue:[^ aStream].
+        aStream notNil ifTrue:[
+            LastSourceFileName := source.
+            LastFileReference at:1 put:aStream.
+            ^ aStream
+        ].
     ].
 
     "/
@@ -616,7 +619,11 @@
     "/
     aStream isNil ifTrue:[
         aStream := source asFilename readStream.
-        aStream notNil ifTrue:[^ aStream].
+        aStream notNil ifTrue:[
+            LastSourceFileName := source.
+            LastFileReference at:1 put:aStream.
+            ^ aStream
+        ].
     ].
 
     (who isNil and:[source notNil]) ifTrue:[
@@ -632,7 +639,11 @@
             myClass := Smalltalk at:className asSymbol ifAbsent:nil.
             myClass notNil ifTrue:[
                 aStream := myClass sourceStreamFor:source.
-                aStream notNil ifTrue:[^ aStream].
+                aStream notNil ifTrue:[
+                    LastSourceFileName := source.
+                    LastFileReference at:1 put:aStream.
+                    ^ aStream
+                ].
             ]
         ]
     ].                
@@ -2452,6 +2463,6 @@
 !Method class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/Method.st,v 1.178 1999-09-25 21:32:01 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Method.st,v 1.179 1999-11-29 13:38:02 cg Exp $'
 ! !
 Method initialize!