need a lock while drawing
authorClaus Gittinger <cg@exept.de>
Thu, 23 Jan 1997 22:39:55 +0100
changeset 989 0f047353b974
parent 988 40eba68d33f9
child 990 e206a230a69e
need a lock while drawing (especially: while waiting for exposes)
MemMonitor.st
MemoryMonitor.st
--- a/MemMonitor.st	Thu Jan 23 21:19:03 1997 +0100
+++ b/MemMonitor.st	Thu Jan 23 22:39:55 1997 +0100
@@ -13,7 +13,7 @@
 StandardSystemView subclass:#MemoryMonitor
 	instanceVariableNames:'updateInterval updateBlock myProcess oldData newData freeData
 		updateIndex org maxTotal minTotal dX newColor freeColor oldColor
-		prevTotal prevFree prevFree2 prevOld scale'
+		prevTotal prevFree prevFree2 prevOld scale drawLock'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'Interface-Tools'
@@ -203,81 +203,86 @@
      gWidth shift scaleChange margin mustWait|
 
     shown ifTrue:[
-        oldSpaceUsed := ObjectMemory oldSpaceUsed + ObjectMemory symSpaceUsed.
-        newSpaceUsed := ObjectMemory newSpaceUsed.
-        freeMem := ObjectMemory freeListSpace + (ObjectMemory oldSpaceSize - ObjectMemory oldSpaceUsed).
-        oldSpaceSize := ObjectMemory oldSpaceSize + ObjectMemory symSpaceSize.
-        total := oldSpaceSize + ObjectMemory newSpaceSize.
+        drawLock wouldBlock ifFalse:[
+            drawLock critical:[
+                oldSpaceUsed := ObjectMemory oldSpaceUsed + ObjectMemory symSpaceUsed.
+                newSpaceUsed := ObjectMemory newSpaceUsed.
+                freeMem := ObjectMemory freeListSpace + (ObjectMemory oldSpaceSize - ObjectMemory oldSpaceUsed).
+                oldSpaceSize := ObjectMemory oldSpaceSize + ObjectMemory symSpaceSize.
+                total := oldSpaceSize + ObjectMemory newSpaceSize.
 
-        scaleChange := false.
+                scaleChange := false.
 
-        ((total - freeMem) < minTotal) ifTrue:[
-            minTotal := total - freeMem.
-            scaleChange := true
-        ].
-        (total > maxTotal) ifTrue:[
-            maxTotal := total.
-            scaleChange := true
-        ].
+                ((total - freeMem) < minTotal) ifTrue:[
+                    minTotal := total - freeMem.
+                    scaleChange := true
+                ].
+                (total > maxTotal) ifTrue:[
+                    maxTotal := total.
+                    scaleChange := true
+                ].
 
-        oldData at:updateIndex put:oldSpaceSize. "/ oldSpaceUsed.
-        newData at:updateIndex put:newSpaceUsed.
-        freeData at:updateIndex put:freeMem.
-        updateIndex := updateIndex + 1.
+                oldData at:updateIndex put:oldSpaceSize. "/ oldSpaceUsed.
+                newData at:updateIndex put:newSpaceUsed.
+                freeData at:updateIndex put:freeMem.
+                updateIndex := updateIndex + 1.
 
-        scaleChange ifTrue:[
-            scale := height asFloat / (maxTotal + 100000).
-            self redraw
-        ].
+                scaleChange ifTrue:[
+                    scale := height asFloat / (maxTotal + 100000).
+                    self redraw
+                ].
 
-        gWidth := width - org.
-        margin := 1.
+                gWidth := width - org.
+                margin := 1.
+
+                mustWait := false.
+                ((updateIndex-1) >= (gWidth - margin)) ifTrue:[
+        "on slow displays, use:"
+        "/            shift := gWidth // 4.
 
-        mustWait := false.
-        ((updateIndex-1) >= (gWidth - margin)) ifTrue:[
-"on slow displays, use:"
-"/            shift := gWidth // 4.
+        "for smooth display, use:"
+                    shift := 1.
 
-"for smooth display, use:"
-            shift := 1.
+                    oldData replaceFrom:1 with:oldData startingAt:shift+1.
+                    newData replaceFrom:1 with:newData startingAt:shift+1.
+                    freeData replaceFrom:1 with:freeData startingAt:shift+1.
 
-            oldData replaceFrom:1 with:oldData startingAt:shift+1.
-            newData replaceFrom:1 with:newData startingAt:shift+1.
-            freeData replaceFrom:1 with:freeData startingAt:shift+1.
-
-            updateIndex := updateIndex - shift.
-            dX := dX + shift.
+                    updateIndex := updateIndex - shift.
+                    dX := dX + shift.
 
-            self catchExpose.
-            self copyFrom:self 
-                        x:(org + shift) y:0
-                      toX:org y:0
-                    width:(gWidth - shift - margin)
-                   height:height.
-            self clearRectangleX:(width - margin - shift) y:0 
-                           width:shift height:height.
-            mustWait := true.
-        ].
+                    self catchExpose.
+                    self copyFrom:self 
+                                x:(org + shift) y:0
+                              toX:org y:0
+                            width:(gWidth - shift - margin)
+                           height:height.
+                    self clearRectangleX:(width - margin - shift) y:0 
+                                   width:shift height:height.
+                    mustWait := true.
+                ].
 
-        self updateLineX:(updateIndex - 1 + org - 1)
-                   total:total 
-                   old:oldSpaceSize "/ oldSpaceUsed
-                   new:newSpaceUsed 
-                   free:freeMem.
+                self updateLineX:(updateIndex - 1 + org - 1)
+                           total:total 
+                           old:oldSpaceSize "/ oldSpaceUsed
+                           new:newSpaceUsed 
+                           free:freeMem.
 
-        self updateNumbers.
-        self flush.
-        mustWait ifTrue:[
-            self waitForExpose.
-        ]
+                self updateNumbers.
+                self flush.
 
+                mustWait ifTrue:[
+                    self waitForExpose.
+                ]
+
+            ].
+        ].
     ].
 
     updateBlock notNil ifTrue:[
         Processor addTimedBlock:updateBlock afterSeconds:updateInterval
     ].
 
-    "Modified: 18.12.1995 / 15:21:10 / cg"
+    "Modified: 23.1.1997 / 22:38:08 / cg"
 !
 
 updateLineX:x total:total old:oldSpaceSize new:newSpaceUsed free:freeMem
@@ -515,9 +520,11 @@
 initialize
     super initialize.
 
+    drawLock := Semaphore forMutualExclusion.
+
     updateInterval := 0.5.
     ProcessorScheduler isPureEventDriven ifTrue:[
-	updateBlock := [self updateDisplay].
+        updateBlock := [self updateDisplay].
     ].
     oldData := Array new:1000.
     newData := Array new:1000.
@@ -528,19 +535,19 @@
     level := 0.
 
     maxTotal := minTotal := ObjectMemory oldSpaceSize 
-			    + ObjectMemory symSpaceSize
-			    + ObjectMemory newSpaceSize.
+                            + ObjectMemory symSpaceSize
+                            + ObjectMemory newSpaceSize.
 
     viewBackground := Black.
 
     device hasColors ifTrue:[
-	newColor := Color orange. "/ yellow.
-	freeColor := Color green.
-	oldColor := Color white.
+        newColor := Color orange. "/ yellow.
+        freeColor := Color green.
+        oldColor := Color white.
     ] ifFalse:[
-	newColor := Color grey:67.
-	freeColor := Color grey:33.
-	oldColor := Color white.
+        newColor := Color grey:67.
+        freeColor := Color grey:33.
+        oldColor := Color white.
     ].
 
     self font:(Font family:'courier' face:'medium' style:'roman' size:10).
@@ -551,6 +558,8 @@
     "
      MemoryMonitor open
     "
+
+    "Modified: 23.1.1997 / 22:37:06 / cg"
 !
 
 memoryMenu
@@ -848,5 +857,5 @@
 !MemoryMonitor class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libtool/Attic/MemMonitor.st,v 1.40 1997-01-20 23:21:09 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/Attic/MemMonitor.st,v 1.41 1997-01-23 21:39:55 cg Exp $'
 ! !
--- a/MemoryMonitor.st	Thu Jan 23 21:19:03 1997 +0100
+++ b/MemoryMonitor.st	Thu Jan 23 22:39:55 1997 +0100
@@ -13,7 +13,7 @@
 StandardSystemView subclass:#MemoryMonitor
 	instanceVariableNames:'updateInterval updateBlock myProcess oldData newData freeData
 		updateIndex org maxTotal minTotal dX newColor freeColor oldColor
-		prevTotal prevFree prevFree2 prevOld scale'
+		prevTotal prevFree prevFree2 prevOld scale drawLock'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'Interface-Tools'
@@ -203,81 +203,86 @@
      gWidth shift scaleChange margin mustWait|
 
     shown ifTrue:[
-        oldSpaceUsed := ObjectMemory oldSpaceUsed + ObjectMemory symSpaceUsed.
-        newSpaceUsed := ObjectMemory newSpaceUsed.
-        freeMem := ObjectMemory freeListSpace + (ObjectMemory oldSpaceSize - ObjectMemory oldSpaceUsed).
-        oldSpaceSize := ObjectMemory oldSpaceSize + ObjectMemory symSpaceSize.
-        total := oldSpaceSize + ObjectMemory newSpaceSize.
+        drawLock wouldBlock ifFalse:[
+            drawLock critical:[
+                oldSpaceUsed := ObjectMemory oldSpaceUsed + ObjectMemory symSpaceUsed.
+                newSpaceUsed := ObjectMemory newSpaceUsed.
+                freeMem := ObjectMemory freeListSpace + (ObjectMemory oldSpaceSize - ObjectMemory oldSpaceUsed).
+                oldSpaceSize := ObjectMemory oldSpaceSize + ObjectMemory symSpaceSize.
+                total := oldSpaceSize + ObjectMemory newSpaceSize.
 
-        scaleChange := false.
+                scaleChange := false.
 
-        ((total - freeMem) < minTotal) ifTrue:[
-            minTotal := total - freeMem.
-            scaleChange := true
-        ].
-        (total > maxTotal) ifTrue:[
-            maxTotal := total.
-            scaleChange := true
-        ].
+                ((total - freeMem) < minTotal) ifTrue:[
+                    minTotal := total - freeMem.
+                    scaleChange := true
+                ].
+                (total > maxTotal) ifTrue:[
+                    maxTotal := total.
+                    scaleChange := true
+                ].
 
-        oldData at:updateIndex put:oldSpaceSize. "/ oldSpaceUsed.
-        newData at:updateIndex put:newSpaceUsed.
-        freeData at:updateIndex put:freeMem.
-        updateIndex := updateIndex + 1.
+                oldData at:updateIndex put:oldSpaceSize. "/ oldSpaceUsed.
+                newData at:updateIndex put:newSpaceUsed.
+                freeData at:updateIndex put:freeMem.
+                updateIndex := updateIndex + 1.
 
-        scaleChange ifTrue:[
-            scale := height asFloat / (maxTotal + 100000).
-            self redraw
-        ].
+                scaleChange ifTrue:[
+                    scale := height asFloat / (maxTotal + 100000).
+                    self redraw
+                ].
 
-        gWidth := width - org.
-        margin := 1.
+                gWidth := width - org.
+                margin := 1.
+
+                mustWait := false.
+                ((updateIndex-1) >= (gWidth - margin)) ifTrue:[
+        "on slow displays, use:"
+        "/            shift := gWidth // 4.
 
-        mustWait := false.
-        ((updateIndex-1) >= (gWidth - margin)) ifTrue:[
-"on slow displays, use:"
-"/            shift := gWidth // 4.
+        "for smooth display, use:"
+                    shift := 1.
 
-"for smooth display, use:"
-            shift := 1.
+                    oldData replaceFrom:1 with:oldData startingAt:shift+1.
+                    newData replaceFrom:1 with:newData startingAt:shift+1.
+                    freeData replaceFrom:1 with:freeData startingAt:shift+1.
 
-            oldData replaceFrom:1 with:oldData startingAt:shift+1.
-            newData replaceFrom:1 with:newData startingAt:shift+1.
-            freeData replaceFrom:1 with:freeData startingAt:shift+1.
-
-            updateIndex := updateIndex - shift.
-            dX := dX + shift.
+                    updateIndex := updateIndex - shift.
+                    dX := dX + shift.
 
-            self catchExpose.
-            self copyFrom:self 
-                        x:(org + shift) y:0
-                      toX:org y:0
-                    width:(gWidth - shift - margin)
-                   height:height.
-            self clearRectangleX:(width - margin - shift) y:0 
-                           width:shift height:height.
-            mustWait := true.
-        ].
+                    self catchExpose.
+                    self copyFrom:self 
+                                x:(org + shift) y:0
+                              toX:org y:0
+                            width:(gWidth - shift - margin)
+                           height:height.
+                    self clearRectangleX:(width - margin - shift) y:0 
+                                   width:shift height:height.
+                    mustWait := true.
+                ].
 
-        self updateLineX:(updateIndex - 1 + org - 1)
-                   total:total 
-                   old:oldSpaceSize "/ oldSpaceUsed
-                   new:newSpaceUsed 
-                   free:freeMem.
+                self updateLineX:(updateIndex - 1 + org - 1)
+                           total:total 
+                           old:oldSpaceSize "/ oldSpaceUsed
+                           new:newSpaceUsed 
+                           free:freeMem.
 
-        self updateNumbers.
-        self flush.
-        mustWait ifTrue:[
-            self waitForExpose.
-        ]
+                self updateNumbers.
+                self flush.
 
+                mustWait ifTrue:[
+                    self waitForExpose.
+                ]
+
+            ].
+        ].
     ].
 
     updateBlock notNil ifTrue:[
         Processor addTimedBlock:updateBlock afterSeconds:updateInterval
     ].
 
-    "Modified: 18.12.1995 / 15:21:10 / cg"
+    "Modified: 23.1.1997 / 22:38:08 / cg"
 !
 
 updateLineX:x total:total old:oldSpaceSize new:newSpaceUsed free:freeMem
@@ -515,9 +520,11 @@
 initialize
     super initialize.
 
+    drawLock := Semaphore forMutualExclusion.
+
     updateInterval := 0.5.
     ProcessorScheduler isPureEventDriven ifTrue:[
-	updateBlock := [self updateDisplay].
+        updateBlock := [self updateDisplay].
     ].
     oldData := Array new:1000.
     newData := Array new:1000.
@@ -528,19 +535,19 @@
     level := 0.
 
     maxTotal := minTotal := ObjectMemory oldSpaceSize 
-			    + ObjectMemory symSpaceSize
-			    + ObjectMemory newSpaceSize.
+                            + ObjectMemory symSpaceSize
+                            + ObjectMemory newSpaceSize.
 
     viewBackground := Black.
 
     device hasColors ifTrue:[
-	newColor := Color orange. "/ yellow.
-	freeColor := Color green.
-	oldColor := Color white.
+        newColor := Color orange. "/ yellow.
+        freeColor := Color green.
+        oldColor := Color white.
     ] ifFalse:[
-	newColor := Color grey:67.
-	freeColor := Color grey:33.
-	oldColor := Color white.
+        newColor := Color grey:67.
+        freeColor := Color grey:33.
+        oldColor := Color white.
     ].
 
     self font:(Font family:'courier' face:'medium' style:'roman' size:10).
@@ -551,6 +558,8 @@
     "
      MemoryMonitor open
     "
+
+    "Modified: 23.1.1997 / 22:37:06 / cg"
 !
 
 memoryMenu
@@ -848,5 +857,5 @@
 !MemoryMonitor class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libtool/MemoryMonitor.st,v 1.40 1997-01-20 23:21:09 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/MemoryMonitor.st,v 1.41 1997-01-23 21:39:55 cg Exp $'
 ! !