ObjectMemory.st
author claus
Wed, 13 Oct 1993 01:19:00 +0100
changeset 3 24d81bf47225
parent 2 6526dde5f3ac
child 5 67342904af11
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1992-93 by Claus Gittinger
a27a279701f8 Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
Object subclass:#ObjectMemory
a27a279701f8 Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:''
2
claus
parents: 1
diff changeset
    15
       classVariableNames:'InternalErrorHandler UserInterruptHandler TimerInterruptHandler
claus
parents: 1
diff changeset
    16
                           SpyInterruptHandler StepInterruptHandler ExceptionInterruptHandler
claus
parents: 1
diff changeset
    17
                           ErrorInterruptHandler MemoryInterruptHandler SignalInterruptHandler
claus
parents: 1
diff changeset
    18
                           ChildSignalInterruptHandler DisposeInterruptHandler
claus
parents: 1
diff changeset
    19
                           RecursionInterruptHandler IOInterruptHandler
claus
parents: 1
diff changeset
    20
claus
parents: 1
diff changeset
    21
                           AllocationFailureSignal
claus
parents: 1
diff changeset
    22
                           IncrementalGCLimit'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
       poolDictionaries:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
       category:'System-Support'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    25
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
a27a279701f8 Initial revision
claus
parents:
diff changeset
    27
ObjectMemory comment:'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    28
a27a279701f8 Initial revision
claus
parents:
diff changeset
    29
COPYRIGHT (c) 1992 -93 by Claus Gittinger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    30
             All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
    31
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    32
$Header: /cvs/stx/stx/libbasic/ObjectMemory.st,v 1.3 1993-10-13 00:16:47 claus Exp $
2
claus
parents: 1
diff changeset
    33
'!
claus
parents: 1
diff changeset
    34
claus
parents: 1
diff changeset
    35
!ObjectMemory class methodsFor:'documentation'!
claus
parents: 1
diff changeset
    36
claus
parents: 1
diff changeset
    37
documentation
claus
parents: 1
diff changeset
    38
"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    39
This class contains access methods to the system memory -
a27a279701f8 Initial revision
claus
parents:
diff changeset
    40
in previous versions this stuff used to be in the Smalltalk class.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    41
It has been separated for better overall structure.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    42
2
claus
parents: 1
diff changeset
    43
kludge:
claus
parents: 1
diff changeset
    44
The InterruptHandler variables are known by the runtime system -
claus
parents: 1
diff changeset
    45
they are the objects that get an interrupt message when the event
claus
parents: 1
diff changeset
    46
occurs.
claus
parents: 1
diff changeset
    47
claus
parents: 1
diff changeset
    48
ClassVariables:
claus
parents: 1
diff changeset
    49
claus
parents: 1
diff changeset
    50
InternalErrorHandler            gets informed, when some runtime error occurs
claus
parents: 1
diff changeset
    51
                                (usually fatal)
claus
parents: 1
diff changeset
    52
claus
parents: 1
diff changeset
    53
UserInterruptHandler            gets informed when CNTL-C is pressed
claus
parents: 1
diff changeset
    54
TimerInterruptHandler           gets alarm timer interrupts
claus
parents: 1
diff changeset
    55
SpyInterruptHandler             another alarm timer
claus
parents: 1
diff changeset
    56
StepInterruptHandler            gets single step interrupts
claus
parents: 1
diff changeset
    57
ExceptionInterruptHandler       gets floating point exceptions
claus
parents: 1
diff changeset
    58
ErrorInterruptHandler           gets graphic device errors
claus
parents: 1
diff changeset
    59
MemoryInterruptHandler          gets out of memory conditions
claus
parents: 1
diff changeset
    60
SignalInterruptHandler          gets unix signals
claus
parents: 1
diff changeset
    61
ChildSignalInterruptHandler     gets child death signals
claus
parents: 1
diff changeset
    62
DisposeInterruptHandler         gets informed, when an object is disposed from 
claus
parents: 1
diff changeset
    63
                                a shadowArray
claus
parents: 1
diff changeset
    64
RecursionInterruptHandler       gets recursion limit violations
claus
parents: 1
diff changeset
    65
IOInterruptHandler              get SIGIO unix signals
claus
parents: 1
diff changeset
    66
claus
parents: 1
diff changeset
    67
AllocationFailureSignal         signal raised when a new fails (see Behavior)
claus
parents: 1
diff changeset
    68
IngrementalGCLimit              number of bytes, that must be allocated since
claus
parents: 1
diff changeset
    69
                                last full garbage collect to turn on incremental
claus
parents: 1
diff changeset
    70
                                collector.
claus
parents: 1
diff changeset
    71
"
claus
parents: 1
diff changeset
    72
! !
claus
parents: 1
diff changeset
    73
claus
parents: 1
diff changeset
    74
!ObjectMemory class methodsFor:'initialization'!
claus
parents: 1
diff changeset
    75
claus
parents: 1
diff changeset
    76
initialize
claus
parents: 1
diff changeset
    77
    AllocationFailureSignal isNil ifTrue:[
claus
parents: 1
diff changeset
    78
        AllocationFailureSignal := (Signal new) mayProceed:true.
claus
parents: 1
diff changeset
    79
        AllocationFailureSignal notifierString:'allocation failure'.
claus
parents: 1
diff changeset
    80
    ].
claus
parents: 1
diff changeset
    81
    IncrementalGCLimit := 500000.
claus
parents: 1
diff changeset
    82
! !
claus
parents: 1
diff changeset
    83
claus
parents: 1
diff changeset
    84
!ObjectMemory class methodsFor:'signal access'!
claus
parents: 1
diff changeset
    85
claus
parents: 1
diff changeset
    86
allocationFailureSignal
claus
parents: 1
diff changeset
    87
    ^ AllocationFailureSignal
claus
parents: 1
diff changeset
    88
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    89
a27a279701f8 Initial revision
claus
parents:
diff changeset
    90
!ObjectMemory class methodsFor:'cache management'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    91
a27a279701f8 Initial revision
claus
parents:
diff changeset
    92
flushInlineCachesForClass:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
    93
    "flush inlinecaches for calls to aClass"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    94
a27a279701f8 Initial revision
claus
parents:
diff changeset
    95
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
    96
    __flushInlineCachesFor(aClass);
a27a279701f8 Initial revision
claus
parents:
diff changeset
    97
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
    98
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    99
a27a279701f8 Initial revision
claus
parents:
diff changeset
   100
flushInlineCachesWithArgs:nargs
a27a279701f8 Initial revision
claus
parents:
diff changeset
   101
    "flush inlinecaches for calls with nargs arguments"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   102
a27a279701f8 Initial revision
claus
parents:
diff changeset
   103
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   104
    __flushInlineCaches(_intVal(nargs));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   105
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   106
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   107
a27a279701f8 Initial revision
claus
parents:
diff changeset
   108
flushInlineCachesFor:aClass withArgs:nargs
a27a279701f8 Initial revision
claus
parents:
diff changeset
   109
    "flush inlinecaches for calls to aClass with nargs arguments"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   110
a27a279701f8 Initial revision
claus
parents:
diff changeset
   111
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   112
    __flushInlineCachesForAndNargs(aClass, _intVal(nargs));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   113
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   114
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   115
a27a279701f8 Initial revision
claus
parents:
diff changeset
   116
flushInlineCaches
a27a279701f8 Initial revision
claus
parents:
diff changeset
   117
    "flush all inlinecaches"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   118
a27a279701f8 Initial revision
claus
parents:
diff changeset
   119
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   120
    __flushAllInlineCaches();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   121
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   122
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   123
a27a279701f8 Initial revision
claus
parents:
diff changeset
   124
flushMethodCacheFor:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   125
    "flush the method cache for sends to aClass"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   126
a27a279701f8 Initial revision
claus
parents:
diff changeset
   127
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   128
    __flushMethodCacheFor(aClass);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   129
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   130
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   131
a27a279701f8 Initial revision
claus
parents:
diff changeset
   132
flushMethodCache
a27a279701f8 Initial revision
claus
parents:
diff changeset
   133
    "flush the method cache"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   134
a27a279701f8 Initial revision
claus
parents:
diff changeset
   135
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   136
    __flushMethodCache();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   137
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   138
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   139
2
claus
parents: 1
diff changeset
   140
flushCachesFor:aClass
claus
parents: 1
diff changeset
   141
    "flush method and inline caches for aClass"
claus
parents: 1
diff changeset
   142
claus
parents: 1
diff changeset
   143
%{  /* NOCONTEXT */
claus
parents: 1
diff changeset
   144
    __flushMethodCacheFor(aClass);
claus
parents: 1
diff changeset
   145
    __flushInlineCachesFor(aClass);
claus
parents: 1
diff changeset
   146
%}
claus
parents: 1
diff changeset
   147
!
claus
parents: 1
diff changeset
   148
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   149
flushCaches
2
claus
parents: 1
diff changeset
   150
    "flush method and inline caches for all classes"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   151
a27a279701f8 Initial revision
claus
parents:
diff changeset
   152
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   153
    __flushMethodCache();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   154
    __flushAllInlineCaches();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   155
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   156
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   157
a27a279701f8 Initial revision
claus
parents:
diff changeset
   158
!ObjectMemory class methodsFor:'enumeration'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   159
a27a279701f8 Initial revision
claus
parents:
diff changeset
   160
allObjectsDo:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   161
    "evaluate the argument, aBlock for all objects in the system"
2
claus
parents: 1
diff changeset
   162
claus
parents: 1
diff changeset
   163
    |work|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   164
%{
2
claus
parents: 1
diff changeset
   165
    nonTenuringScavenge(__context);
claus
parents: 1
diff changeset
   166
    /*
claus
parents: 1
diff changeset
   167
     * allObjectsDo needs a temporary to hold newSpace objects
claus
parents: 1
diff changeset
   168
     */
claus
parents: 1
diff changeset
   169
    __allObjectsDo(&aBlock, &work COMMA_CON);
claus
parents: 1
diff changeset
   170
%}
claus
parents: 1
diff changeset
   171
!
claus
parents: 1
diff changeset
   172
claus
parents: 1
diff changeset
   173
allOldObjectsDo:aBlock
claus
parents: 1
diff changeset
   174
    "evaluate the argument, aBlock for all old objects in the system.
claus
parents: 1
diff changeset
   175
     For debugging and tests only - do not use"
claus
parents: 1
diff changeset
   176
%{
claus
parents: 1
diff changeset
   177
    __allObjectsDo(&aBlock, (OBJ *)0 COMMA_CON);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   178
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   179
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   180
2
claus
parents: 1
diff changeset
   181
!ObjectMemory class methodsFor:'handler access'!
claus
parents: 1
diff changeset
   182
claus
parents: 1
diff changeset
   183
internalErrorHandler
claus
parents: 1
diff changeset
   184
    ^ InternalErrorHandler
claus
parents: 1
diff changeset
   185
!
claus
parents: 1
diff changeset
   186
claus
parents: 1
diff changeset
   187
userInterruptHandler
claus
parents: 1
diff changeset
   188
    ^ UserInterruptHandler
claus
parents: 1
diff changeset
   189
!
claus
parents: 1
diff changeset
   190
claus
parents: 1
diff changeset
   191
userInterruptHandler:aHandler
claus
parents: 1
diff changeset
   192
    UserInterruptHandler := aHandler
claus
parents: 1
diff changeset
   193
!
claus
parents: 1
diff changeset
   194
claus
parents: 1
diff changeset
   195
timerInterruptHandler
claus
parents: 1
diff changeset
   196
    ^ TimerInterruptHandler
claus
parents: 1
diff changeset
   197
!
claus
parents: 1
diff changeset
   198
claus
parents: 1
diff changeset
   199
spyInterruptHandler
claus
parents: 1
diff changeset
   200
    ^ SpyInterruptHandler
claus
parents: 1
diff changeset
   201
!
claus
parents: 1
diff changeset
   202
claus
parents: 1
diff changeset
   203
spyInterruptHandler:aHandler
claus
parents: 1
diff changeset
   204
    SpyInterruptHandler := aHandler
claus
parents: 1
diff changeset
   205
!
claus
parents: 1
diff changeset
   206
claus
parents: 1
diff changeset
   207
stepInterruptHandler
claus
parents: 1
diff changeset
   208
    ^ StepInterruptHandler
claus
parents: 1
diff changeset
   209
!
claus
parents: 1
diff changeset
   210
claus
parents: 1
diff changeset
   211
stepInterruptHandler:aHandler
claus
parents: 1
diff changeset
   212
    StepInterruptHandler := aHandler
claus
parents: 1
diff changeset
   213
!
claus
parents: 1
diff changeset
   214
claus
parents: 1
diff changeset
   215
exceptionInterruptHandler
claus
parents: 1
diff changeset
   216
    ^ ExceptionInterruptHandler
claus
parents: 1
diff changeset
   217
!
claus
parents: 1
diff changeset
   218
claus
parents: 1
diff changeset
   219
errorInterruptHandler
claus
parents: 1
diff changeset
   220
    ^ ErrorInterruptHandler
claus
parents: 1
diff changeset
   221
!
claus
parents: 1
diff changeset
   222
claus
parents: 1
diff changeset
   223
errorInterruptHandler:aHandler
claus
parents: 1
diff changeset
   224
    ErrorInterruptHandler := aHandler
claus
parents: 1
diff changeset
   225
!
claus
parents: 1
diff changeset
   226
claus
parents: 1
diff changeset
   227
memoryInterruptHandler
claus
parents: 1
diff changeset
   228
    ^ MemoryInterruptHandler
claus
parents: 1
diff changeset
   229
!
claus
parents: 1
diff changeset
   230
claus
parents: 1
diff changeset
   231
signalInterruptHandler
claus
parents: 1
diff changeset
   232
    ^ SignalInterruptHandler
claus
parents: 1
diff changeset
   233
!
claus
parents: 1
diff changeset
   234
claus
parents: 1
diff changeset
   235
childSignalInterruptHandler
claus
parents: 1
diff changeset
   236
    ^ ChildSignalInterruptHandler
claus
parents: 1
diff changeset
   237
!
claus
parents: 1
diff changeset
   238
claus
parents: 1
diff changeset
   239
disposeInterruptHandler
claus
parents: 1
diff changeset
   240
    ^ DisposeInterruptHandler
claus
parents: 1
diff changeset
   241
!
claus
parents: 1
diff changeset
   242
claus
parents: 1
diff changeset
   243
disposeInterruptHandler:aHandler
claus
parents: 1
diff changeset
   244
    DisposeInterruptHandler := aHandler
claus
parents: 1
diff changeset
   245
!
claus
parents: 1
diff changeset
   246
claus
parents: 1
diff changeset
   247
recursionInterruptHandler
claus
parents: 1
diff changeset
   248
    ^ RecursionInterruptHandler
claus
parents: 1
diff changeset
   249
!
claus
parents: 1
diff changeset
   250
claus
parents: 1
diff changeset
   251
ioInterruptHandler
claus
parents: 1
diff changeset
   252
    ^ IOInterruptHandler
claus
parents: 1
diff changeset
   253
!
claus
parents: 1
diff changeset
   254
claus
parents: 1
diff changeset
   255
ioInterruptHandler:aHandler
claus
parents: 1
diff changeset
   256
    IOInterruptHandler := aHandler
claus
parents: 1
diff changeset
   257
! !
claus
parents: 1
diff changeset
   258
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   259
!ObjectMemory class methodsFor:'queries'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   260
a27a279701f8 Initial revision
claus
parents:
diff changeset
   261
newSpaceUsed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   262
    "return the number of bytes allocated for new objects"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   263
a27a279701f8 Initial revision
claus
parents:
diff changeset
   264
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   265
    RETURN ( _MKSMALLINT(__newSpaceUsed()) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   266
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   267
    "ObjectMemory newSpaceUsed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   268
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   269
a27a279701f8 Initial revision
claus
parents:
diff changeset
   270
oldSpaceUsed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   271
    "return the number of bytes allocated for old objects"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   272
a27a279701f8 Initial revision
claus
parents:
diff changeset
   273
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   274
    RETURN ( _MKSMALLINT(__oldSpaceUsed()) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   275
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   276
    "ObjectMemory oldSpaceUsed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   277
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   278
a27a279701f8 Initial revision
claus
parents:
diff changeset
   279
bytesUsed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   280
    "return the number of bytes allocated for objects -
a27a279701f8 Initial revision
claus
parents:
diff changeset
   281
     this number is not exact, since some objects may be dead"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   282
a27a279701f8 Initial revision
claus
parents:
diff changeset
   283
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   284
    RETURN ( _MKSMALLINT(__oldSpaceUsed() + __newSpaceUsed()) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   285
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   286
    "ObjectMemory bytesUsed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   287
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   288
2
claus
parents: 1
diff changeset
   289
oldSpaceAllocatedSinceLastGC
claus
parents: 1
diff changeset
   290
    "return the number of bytes allocated for old objects since the
claus
parents: 1
diff changeset
   291
     last garbage collect occured"
claus
parents: 1
diff changeset
   292
claus
parents: 1
diff changeset
   293
%{  /* NOCONTEXT */
claus
parents: 1
diff changeset
   294
    RETURN ( _MKSMALLINT(__oldSpaceAllocatedSinceLastGC()) );
claus
parents: 1
diff changeset
   295
%}
claus
parents: 1
diff changeset
   296
    "ObjectMemory oldSpaceAllocatedSinceLastGC"
claus
parents: 1
diff changeset
   297
!
claus
parents: 1
diff changeset
   298
claus
parents: 1
diff changeset
   299
incrementalGCLimit
claus
parents: 1
diff changeset
   300
    "return the limit for incremental GC activation"
claus
parents: 1
diff changeset
   301
claus
parents: 1
diff changeset
   302
    ^ IncrementalGCLimit
claus
parents: 1
diff changeset
   303
claus
parents: 1
diff changeset
   304
    "ObjectMemory incrementalGCLimit"
claus
parents: 1
diff changeset
   305
!
claus
parents: 1
diff changeset
   306
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   307
numberOfObjects
a27a279701f8 Initial revision
claus
parents:
diff changeset
   308
    "return the number of objects in the system"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   309
a27a279701f8 Initial revision
claus
parents:
diff changeset
   310
    |tally|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   311
a27a279701f8 Initial revision
claus
parents:
diff changeset
   312
    tally := 0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   313
    self allObjectsDo:[:obj | tally := tally + 1].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   314
    ^ tally
a27a279701f8 Initial revision
claus
parents:
diff changeset
   315
a27a279701f8 Initial revision
claus
parents:
diff changeset
   316
    "ObjectMemory numberOfObjects"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   317
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   318
a27a279701f8 Initial revision
claus
parents:
diff changeset
   319
printReferences:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   320
    "debugging: print referents to anObject"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   321
a27a279701f8 Initial revision
claus
parents:
diff changeset
   322
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   323
    _printRefChain(__context, anObject);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   324
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   325
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   326
a27a279701f8 Initial revision
claus
parents:
diff changeset
   327
whoReferences:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   328
    "return a collection of objects referencing the argument, anObject"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   329
a27a279701f8 Initial revision
claus
parents:
diff changeset
   330
    |aCollection|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   331
a27a279701f8 Initial revision
claus
parents:
diff changeset
   332
    aCollection := IdentitySet new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   333
    self allObjectsDo:[:o |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   334
        (o references:anObject) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   335
            aCollection add:o
a27a279701f8 Initial revision
claus
parents:
diff changeset
   336
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   337
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   338
    (aCollection size == 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   339
        "actually this cannot happen - there is always one"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   340
        ^ nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   341
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   342
    ^ aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
   343
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   344
a27a279701f8 Initial revision
claus
parents:
diff changeset
   345
!ObjectMemory class methodsFor:'garbage collector control'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   346
a27a279701f8 Initial revision
claus
parents:
diff changeset
   347
garbageCollect
a27a279701f8 Initial revision
claus
parents:
diff changeset
   348
    "search for and free garbage in the oldSpace
a27a279701f8 Initial revision
claus
parents:
diff changeset
   349
     (newSpace is cleaned automatically)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   350
     - can take a long time if paging is involved
a27a279701f8 Initial revision
claus
parents:
diff changeset
   351
     - when no paging is involved, its faster than I thought :-)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   352
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   353
    __garbageCollect(__context);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   354
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   355
a27a279701f8 Initial revision
claus
parents:
diff changeset
   356
    "ObjectMemory garbageCollect"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   357
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   358
a27a279701f8 Initial revision
claus
parents:
diff changeset
   359
scavenge
a27a279701f8 Initial revision
claus
parents:
diff changeset
   360
    "for debugging only - collect newspace stuff"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   361
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   362
    nonTenuringScavenge(__context);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   363
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   364
a27a279701f8 Initial revision
claus
parents:
diff changeset
   365
    "ObjectMemory scavenge"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   366
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   367
a27a279701f8 Initial revision
claus
parents:
diff changeset
   368
tenure
2
claus
parents: 1
diff changeset
   369
    "force all new stuff into old-space"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   370
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   371
    tenure(__context);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   372
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   373
a27a279701f8 Initial revision
claus
parents:
diff changeset
   374
    "ObjectMemory tenure"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   375
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   376
a27a279701f8 Initial revision
claus
parents:
diff changeset
   377
markAndSweep
a27a279701f8 Initial revision
claus
parents:
diff changeset
   378
    "mark/sweep garbage collector"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   379
a27a279701f8 Initial revision
claus
parents:
diff changeset
   380
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   381
    markAndSweep(__context);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   382
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   383
a27a279701f8 Initial revision
claus
parents:
diff changeset
   384
    "ObjectMemory markAndSweep"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   385
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   386
a27a279701f8 Initial revision
claus
parents:
diff changeset
   387
gcStep
a27a279701f8 Initial revision
claus
parents:
diff changeset
   388
    "one incremental garbage collect step"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   389
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   390
    incrGCstep(__context);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   391
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   392
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   393
2
claus
parents: 1
diff changeset
   394
incrementalGCLimit:aNumber
claus
parents: 1
diff changeset
   395
    "set the limit for incremental GC activation"
claus
parents: 1
diff changeset
   396
claus
parents: 1
diff changeset
   397
    IncrementalGCLimit := aNumber
claus
parents: 1
diff changeset
   398
claus
parents: 1
diff changeset
   399
    "ObjectMemory incrementalGCLimit:100000"
claus
parents: 1
diff changeset
   400
!
claus
parents: 1
diff changeset
   401
claus
parents: 1
diff changeset
   402
turnGarbageCollectorOff
claus
parents: 1
diff changeset
   403
    "turn off garbage collector by forcing new objects to be
claus
parents: 1
diff changeset
   404
     allocated in oldSpace (instead of newSpace)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   405
     this method is somewhat dangerous: if collector is turned off,
a27a279701f8 Initial revision
claus
parents:
diff changeset
   406
     and too many objects are created, the system may run into trouble.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   407
     Use this only for measurement purposes or when realtime behavior
2
claus
parents: 1
diff changeset
   408
     is required for a limited time period. No warranty"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   409
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   410
    allocForceSpace(0);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   411
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   412
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   413
2
claus
parents: 1
diff changeset
   414
turnGarbageCollectorOn
claus
parents: 1
diff changeset
   415
    "turn garbage collector on again"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   416
a27a279701f8 Initial revision
claus
parents:
diff changeset
   417
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   418
    allocForceSpace(1);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   419
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   420
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   421
a27a279701f8 Initial revision
claus
parents:
diff changeset
   422
!ObjectMemory class methodsFor:'system management'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   423
a27a279701f8 Initial revision
claus
parents:
diff changeset
   424
loadClassBinary:aClassName
a27a279701f8 Initial revision
claus
parents:
diff changeset
   425
    "find the object file for aClassName and -if found - load it;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   426
     this one loads precompiled object files"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   427
a27a279701f8 Initial revision
claus
parents:
diff changeset
   428
    |fName newClass upd|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   429
a27a279701f8 Initial revision
claus
parents:
diff changeset
   430
    fName := self fileNameForClass:aClassName.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   431
    fName notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   432
        upd := Class updateChanges:false.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   433
        [
a27a279701f8 Initial revision
claus
parents:
diff changeset
   434
            self loadBinary:(fName , '.o')
a27a279701f8 Initial revision
claus
parents:
diff changeset
   435
        ] valueNowOrOnUnwindDo:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   436
            Class updateChanges:upd
a27a279701f8 Initial revision
claus
parents:
diff changeset
   437
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   438
        newClass := self at:(aClassName asSymbol).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   439
        (newClass notNil and:[newClass implements:#initialize]) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   440
            newClass initialize
a27a279701f8 Initial revision
claus
parents:
diff changeset
   441
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   442
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   443
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   444
a27a279701f8 Initial revision
claus
parents:
diff changeset
   445
snapShot
a27a279701f8 Initial revision
claus
parents:
diff changeset
   446
    "create a snapshot"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   447
a27a279701f8 Initial revision
claus
parents:
diff changeset
   448
    ImageName isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   449
        ImageName := 'st.img'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   450
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   451
    self snapShotOn:ImageName
a27a279701f8 Initial revision
claus
parents:
diff changeset
   452
a27a279701f8 Initial revision
claus
parents:
diff changeset
   453
    "ObjectMemory snapShot"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   454
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   455
a27a279701f8 Initial revision
claus
parents:
diff changeset
   456
snapShotOn:aFileName
a27a279701f8 Initial revision
claus
parents:
diff changeset
   457
    "create a snapshot in the given file"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   458
a27a279701f8 Initial revision
claus
parents:
diff changeset
   459
    "give others a chance to fix things"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   460
    self changed:#save.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   461
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   462
    OBJ __snapShotOn();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   463
a27a279701f8 Initial revision
claus
parents:
diff changeset
   464
    if (_isString(aFileName)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   465
        RETURN ( __snapShotOn(__context, _stringVal(aFileName)) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   466
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   467
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   468
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   469
    ^ self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   470
a27a279701f8 Initial revision
claus
parents:
diff changeset
   471
    "ObjectMemory snapShotOn:'myimage.img'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   472
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   473
a27a279701f8 Initial revision
claus
parents:
diff changeset
   474
applicationImageOn:aFileName for:startupClass selector:startupSelector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   475
    "create a snapshot which will come up without any views 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   476
     but starts up an application by sending startupClass the startupSelector"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   477
2
claus
parents: 1
diff changeset
   478
    |viewsKnown savedIdleBlocks savedTimeoutBlocks savedTranscript
claus
parents: 1
diff changeset
   479
     savedRoot|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   480
a27a279701f8 Initial revision
claus
parents:
diff changeset
   481
    viewsKnown := Display knownViews.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   482
    savedIdleBlocks := Display idleBlocks.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   483
    savedTimeoutBlocks := Display timeOutBlocks.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   484
    savedTranscript := Transcript.
2
claus
parents: 1
diff changeset
   485
    savedRoot := RootView.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   486
a27a279701f8 Initial revision
claus
parents:
diff changeset
   487
    "a kludge: save image with modified knownViews ..."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   488
a27a279701f8 Initial revision
claus
parents:
diff changeset
   489
    Display knownViews:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   490
    Display idleBlocks:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   491
    Display timeOutBlocks:nil.
2
claus
parents: 1
diff changeset
   492
    RootView := nil.
claus
parents: 1
diff changeset
   493
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   494
    Transcript := Stderr.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   495
    StartupClass := startupClass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   496
    StartupSelector := startupSelector.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   497
a27a279701f8 Initial revision
claus
parents:
diff changeset
   498
    self snapShotOn:aFileName.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   499
a27a279701f8 Initial revision
claus
parents:
diff changeset
   500
    StartupClass := nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   501
    StartupSelector := nil.
2
claus
parents: 1
diff changeset
   502
    RootView := savedRoot.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   503
    Transcript := savedTranscript.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   504
    Display knownViews:viewsKnown.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   505
    Display idleBlocks:savedIdleBlocks.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   506
    Display timeOutBlocks:savedTimeoutBlocks
a27a279701f8 Initial revision
claus
parents:
diff changeset
   507
a27a279701f8 Initial revision
claus
parents:
diff changeset
   508
    "ObjectMemory applicationImageOn:'draw.img' for:DrawTool selector:#start"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   509
    "ObjectMemory applicationImageOn:'pm.img' for:PMSimulator selector:#start"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   510
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   511
a27a279701f8 Initial revision
claus
parents:
diff changeset
   512
minimumApplicationImageOn:aFileName for:startupClass selector:startupSelector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   513
    "create a snapshot which will come up without any views 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   514
     but starts up an application by sending startupClass the startupSelector.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   515
     All unneeded info is stripped from the saved image."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   516
a27a279701f8 Initial revision
claus
parents:
diff changeset
   517
    "create a temporary image, for continuation"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   518
    self snapShotOn:'temp.img'.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   519
a27a279701f8 Initial revision
claus
parents:
diff changeset
   520
    Display knownViews do:[:aView |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   521
        aView notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   522
            aView superView isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   523
                aView destroy
a27a279701f8 Initial revision
claus
parents:
diff changeset
   524
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   525
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   526
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   527
a27a279701f8 Initial revision
claus
parents:
diff changeset
   528
    self stripImage.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   529
a27a279701f8 Initial revision
claus
parents:
diff changeset
   530
    self applicationImageOn:aFileName for:startupClass selector:startupSelector.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   531
a27a279701f8 Initial revision
claus
parents:
diff changeset
   532
    "continue in old image"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   533
a27a279701f8 Initial revision
claus
parents:
diff changeset
   534
    OperatingSystem exec:(Arguments at:1)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   535
           withArguments:#('smalltalk' '-i' 'temp.img') , (Arguments copyFrom:2)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   536
a27a279701f8 Initial revision
claus
parents:
diff changeset
   537
    "ObjectMemory minimumApplicationImageOn:'clock1.img' for:Clock selector:#start"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   538
    "ObjectMemory applicationImageOn:'clock2.img' for:Clock selector:#start"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   539
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   540
a27a279701f8 Initial revision
claus
parents:
diff changeset
   541
stripImage
a27a279701f8 Initial revision
claus
parents:
diff changeset
   542
    "remove all unneeded stuff from the image - much more is possible here"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   543
2
claus
parents: 1
diff changeset
   544
    "remove all class comments & source"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   545
2
claus
parents: 1
diff changeset
   546
    Smalltalk allBehaviorsDo:[:aClass |
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   547
        aClass setComment:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   548
        aClass methodDictionary do:[:aMethod |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   549
            aMethod source:''.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   550
            aMethod category:#none 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   551
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   552
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   553
    self garbageCollect
a27a279701f8 Initial revision
claus
parents:
diff changeset
   554
! !