ObjectMemory.st
author claus
Sat, 11 Dec 1993 01:59:35 +0100
changeset 13 62303f84ff5f
parent 10 4f1f9a91e406
child 22 847106305963
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
"
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1992 by Claus Gittinger
1
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
10
claus
parents: 5
diff changeset
    22
                           IncrementalGCLimit
claus
parents: 5
diff changeset
    23
                           Dependents'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
       poolDictionaries:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    25
       category:'System-Support'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    27
a27a279701f8 Initial revision
claus
parents:
diff changeset
    28
ObjectMemory comment:'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    29
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
    30
COPYRIGHT (c) 1992 by Claus Gittinger
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    31
             All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
    32
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    33
$Header: /cvs/stx/stx/libbasic/ObjectMemory.st,v 1.6 1993-12-11 00:51:42 claus Exp $
2
claus
parents: 1
diff changeset
    34
'!
claus
parents: 1
diff changeset
    35
claus
parents: 1
diff changeset
    36
!ObjectMemory class methodsFor:'documentation'!
claus
parents: 1
diff changeset
    37
claus
parents: 1
diff changeset
    38
documentation
claus
parents: 1
diff changeset
    39
"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    40
This class contains access methods to the system memory -
a27a279701f8 Initial revision
claus
parents:
diff changeset
    41
in previous versions this stuff used to be in the Smalltalk class.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    42
It has been separated for better overall structure.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    43
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    44
Many methods here are for debuging purposes only, and not standard.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    45
Do not depend on them beeing there - some may vanish ...
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    46
(especially those, that depend on a specific GC implementation)
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    47
2
claus
parents: 1
diff changeset
    48
kludge:
claus
parents: 1
diff changeset
    49
The InterruptHandler variables are known by the runtime system -
claus
parents: 1
diff changeset
    50
they are the objects that get an interrupt message when the event
claus
parents: 1
diff changeset
    51
occurs.
claus
parents: 1
diff changeset
    52
claus
parents: 1
diff changeset
    53
ClassVariables:
claus
parents: 1
diff changeset
    54
claus
parents: 1
diff changeset
    55
InternalErrorHandler            gets informed, when some runtime error occurs
claus
parents: 1
diff changeset
    56
                                (usually fatal)
claus
parents: 1
diff changeset
    57
claus
parents: 1
diff changeset
    58
UserInterruptHandler            gets informed when CNTL-C is pressed
claus
parents: 1
diff changeset
    59
TimerInterruptHandler           gets alarm timer interrupts
claus
parents: 1
diff changeset
    60
SpyInterruptHandler             another alarm timer
claus
parents: 1
diff changeset
    61
StepInterruptHandler            gets single step interrupts
claus
parents: 1
diff changeset
    62
ExceptionInterruptHandler       gets floating point exceptions
claus
parents: 1
diff changeset
    63
ErrorInterruptHandler           gets graphic device errors
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    64
MemoryInterruptHandler          gets soon-out-of-memory conditions
2
claus
parents: 1
diff changeset
    65
SignalInterruptHandler          gets unix signals
claus
parents: 1
diff changeset
    66
ChildSignalInterruptHandler     gets child death signals
claus
parents: 1
diff changeset
    67
DisposeInterruptHandler         gets informed, when an object is disposed from 
claus
parents: 1
diff changeset
    68
                                a shadowArray
claus
parents: 1
diff changeset
    69
RecursionInterruptHandler       gets recursion limit violations
claus
parents: 1
diff changeset
    70
IOInterruptHandler              get SIGIO unix signals
claus
parents: 1
diff changeset
    71
claus
parents: 1
diff changeset
    72
AllocationFailureSignal         signal raised when a new fails (see Behavior)
claus
parents: 1
diff changeset
    73
IngrementalGCLimit              number of bytes, that must be allocated since
claus
parents: 1
diff changeset
    74
                                last full garbage collect to turn on incremental
claus
parents: 1
diff changeset
    75
                                collector.
10
claus
parents: 5
diff changeset
    76
Dependents                      keep my dependents locally (its faster) for
claus
parents: 5
diff changeset
    77
                                all those registries
2
claus
parents: 1
diff changeset
    78
"
claus
parents: 1
diff changeset
    79
! !
claus
parents: 1
diff changeset
    80
claus
parents: 1
diff changeset
    81
!ObjectMemory class methodsFor:'initialization'!
claus
parents: 1
diff changeset
    82
claus
parents: 1
diff changeset
    83
initialize
claus
parents: 1
diff changeset
    84
    AllocationFailureSignal isNil ifTrue:[
claus
parents: 1
diff changeset
    85
        AllocationFailureSignal := (Signal new) mayProceed:true.
claus
parents: 1
diff changeset
    86
        AllocationFailureSignal notifierString:'allocation failure'.
claus
parents: 1
diff changeset
    87
    ].
claus
parents: 1
diff changeset
    88
    IncrementalGCLimit := 500000.
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    89
    MemoryInterruptHandler := self
2
claus
parents: 1
diff changeset
    90
! !
claus
parents: 1
diff changeset
    91
claus
parents: 1
diff changeset
    92
!ObjectMemory class methodsFor:'signal access'!
claus
parents: 1
diff changeset
    93
claus
parents: 1
diff changeset
    94
allocationFailureSignal
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    95
    "return the signal raised when an object allocation failed"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    96
2
claus
parents: 1
diff changeset
    97
    ^ AllocationFailureSignal
claus
parents: 1
diff changeset
    98
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    99
10
claus
parents: 5
diff changeset
   100
!ObjectMemory class methodsFor:'dependents access'!
claus
parents: 5
diff changeset
   101
claus
parents: 5
diff changeset
   102
dependents
claus
parents: 5
diff changeset
   103
    "return the colleciton of my dependents"
claus
parents: 5
diff changeset
   104
claus
parents: 5
diff changeset
   105
    ^ Dependents
claus
parents: 5
diff changeset
   106
!
claus
parents: 5
diff changeset
   107
claus
parents: 5
diff changeset
   108
dependents:aCollection
claus
parents: 5
diff changeset
   109
    "set the dependents collection"
claus
parents: 5
diff changeset
   110
claus
parents: 5
diff changeset
   111
    Dependents := aCollection
claus
parents: 5
diff changeset
   112
! !
claus
parents: 5
diff changeset
   113
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   114
!ObjectMemory class methodsFor:'cache management'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   115
a27a279701f8 Initial revision
claus
parents:
diff changeset
   116
flushInlineCachesForClass:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   117
    "flush inlinecaches for calls to aClass"
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
    __flushInlineCachesFor(aClass);
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
flushInlineCachesWithArgs:nargs
a27a279701f8 Initial revision
claus
parents:
diff changeset
   125
    "flush inlinecaches for calls with nargs arguments"
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
    __flushInlineCaches(_intVal(nargs));
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
flushInlineCachesFor:aClass withArgs:nargs
a27a279701f8 Initial revision
claus
parents:
diff changeset
   133
    "flush inlinecaches for calls to aClass with nargs arguments"
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
    __flushInlineCachesForAndNargs(aClass, _intVal(nargs));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   137
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   138
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   139
a27a279701f8 Initial revision
claus
parents:
diff changeset
   140
flushInlineCaches
a27a279701f8 Initial revision
claus
parents:
diff changeset
   141
    "flush all inlinecaches"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   142
a27a279701f8 Initial revision
claus
parents:
diff changeset
   143
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   144
    __flushAllInlineCaches();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   145
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   146
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   147
a27a279701f8 Initial revision
claus
parents:
diff changeset
   148
flushMethodCacheFor:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   149
    "flush the method cache for sends to aClass"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   150
a27a279701f8 Initial revision
claus
parents:
diff changeset
   151
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   152
    __flushMethodCacheFor(aClass);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   153
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   154
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   155
a27a279701f8 Initial revision
claus
parents:
diff changeset
   156
flushMethodCache
a27a279701f8 Initial revision
claus
parents:
diff changeset
   157
    "flush the method cache"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   158
a27a279701f8 Initial revision
claus
parents:
diff changeset
   159
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   160
    __flushMethodCache();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   161
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   162
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   163
2
claus
parents: 1
diff changeset
   164
flushCachesFor:aClass
claus
parents: 1
diff changeset
   165
    "flush method and inline caches for aClass"
claus
parents: 1
diff changeset
   166
claus
parents: 1
diff changeset
   167
%{  /* NOCONTEXT */
claus
parents: 1
diff changeset
   168
    __flushMethodCacheFor(aClass);
claus
parents: 1
diff changeset
   169
    __flushInlineCachesFor(aClass);
claus
parents: 1
diff changeset
   170
%}
claus
parents: 1
diff changeset
   171
!
claus
parents: 1
diff changeset
   172
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   173
flushCaches
2
claus
parents: 1
diff changeset
   174
    "flush method and inline caches for all classes"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   175
a27a279701f8 Initial revision
claus
parents:
diff changeset
   176
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   177
    __flushMethodCache();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   178
    __flushAllInlineCaches();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   179
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   180
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   181
a27a279701f8 Initial revision
claus
parents:
diff changeset
   182
!ObjectMemory class methodsFor:'enumeration'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   183
a27a279701f8 Initial revision
claus
parents:
diff changeset
   184
allObjectsDo:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   185
    "evaluate the argument, aBlock for all objects in the system"
2
claus
parents: 1
diff changeset
   186
claus
parents: 1
diff changeset
   187
    |work|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   188
%{
2
claus
parents: 1
diff changeset
   189
    nonTenuringScavenge(__context);
claus
parents: 1
diff changeset
   190
    /*
claus
parents: 1
diff changeset
   191
     * allObjectsDo needs a temporary to hold newSpace objects
claus
parents: 1
diff changeset
   192
     */
claus
parents: 1
diff changeset
   193
    __allObjectsDo(&aBlock, &work COMMA_CON);
claus
parents: 1
diff changeset
   194
%}
claus
parents: 1
diff changeset
   195
!
claus
parents: 1
diff changeset
   196
claus
parents: 1
diff changeset
   197
allOldObjectsDo:aBlock
claus
parents: 1
diff changeset
   198
    "evaluate the argument, aBlock for all old objects in the system.
claus
parents: 1
diff changeset
   199
     For debugging and tests only - do not use"
claus
parents: 1
diff changeset
   200
%{
claus
parents: 1
diff changeset
   201
    __allObjectsDo(&aBlock, (OBJ *)0 COMMA_CON);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   202
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   203
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   204
2
claus
parents: 1
diff changeset
   205
!ObjectMemory class methodsFor:'handler access'!
claus
parents: 1
diff changeset
   206
claus
parents: 1
diff changeset
   207
internalErrorHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   208
    "return the handler for ST/X internal errors.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   209
     An internal error is reported for example when a methods
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   210
     bytecode is not a ByteArray, the selector table is not an Array
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   211
     etc.  Those should not occur in normal circumstances."
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   212
2
claus
parents: 1
diff changeset
   213
    ^ InternalErrorHandler
claus
parents: 1
diff changeset
   214
!
claus
parents: 1
diff changeset
   215
claus
parents: 1
diff changeset
   216
userInterruptHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   217
    "return the handler for CNTL-C interrupt handling"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   218
2
claus
parents: 1
diff changeset
   219
    ^ UserInterruptHandler
claus
parents: 1
diff changeset
   220
!
claus
parents: 1
diff changeset
   221
claus
parents: 1
diff changeset
   222
userInterruptHandler:aHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   223
    "set the handler for CNTL-C interrupt handling"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   224
2
claus
parents: 1
diff changeset
   225
    UserInterruptHandler := aHandler
claus
parents: 1
diff changeset
   226
!
claus
parents: 1
diff changeset
   227
claus
parents: 1
diff changeset
   228
timerInterruptHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   229
    "return the handler for timer interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   230
2
claus
parents: 1
diff changeset
   231
    ^ TimerInterruptHandler
claus
parents: 1
diff changeset
   232
!
claus
parents: 1
diff changeset
   233
10
claus
parents: 5
diff changeset
   234
timerInterruptHandler:aHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   235
    "set the handler for timer interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   236
10
claus
parents: 5
diff changeset
   237
    TimerInterruptHandler := aHandler
claus
parents: 5
diff changeset
   238
!
claus
parents: 5
diff changeset
   239
2
claus
parents: 1
diff changeset
   240
spyInterruptHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   241
    "return the handler for spy-timer interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   242
2
claus
parents: 1
diff changeset
   243
    ^ SpyInterruptHandler
claus
parents: 1
diff changeset
   244
!
claus
parents: 1
diff changeset
   245
claus
parents: 1
diff changeset
   246
spyInterruptHandler:aHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   247
    "set the handler for spy-timer interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   248
2
claus
parents: 1
diff changeset
   249
    SpyInterruptHandler := aHandler
claus
parents: 1
diff changeset
   250
!
claus
parents: 1
diff changeset
   251
claus
parents: 1
diff changeset
   252
stepInterruptHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   253
    "return the handler for single step interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   254
2
claus
parents: 1
diff changeset
   255
    ^ StepInterruptHandler
claus
parents: 1
diff changeset
   256
!
claus
parents: 1
diff changeset
   257
claus
parents: 1
diff changeset
   258
stepInterruptHandler:aHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   259
    "set the handler for single step interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   260
2
claus
parents: 1
diff changeset
   261
    StepInterruptHandler := aHandler
claus
parents: 1
diff changeset
   262
!
claus
parents: 1
diff changeset
   263
claus
parents: 1
diff changeset
   264
exceptionInterruptHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   265
    "return the handler for floating point exception interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   266
2
claus
parents: 1
diff changeset
   267
    ^ ExceptionInterruptHandler
claus
parents: 1
diff changeset
   268
!
claus
parents: 1
diff changeset
   269
claus
parents: 1
diff changeset
   270
errorInterruptHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   271
    "return the handler for display error interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   272
2
claus
parents: 1
diff changeset
   273
    ^ ErrorInterruptHandler
claus
parents: 1
diff changeset
   274
!
claus
parents: 1
diff changeset
   275
claus
parents: 1
diff changeset
   276
errorInterruptHandler:aHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   277
    "set the handler for display error interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   278
2
claus
parents: 1
diff changeset
   279
    ErrorInterruptHandler := aHandler
claus
parents: 1
diff changeset
   280
!
claus
parents: 1
diff changeset
   281
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   282
signalInterruptHandler
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   283
    "return the handler for UNIX-signal interrupts"
2
claus
parents: 1
diff changeset
   284
claus
parents: 1
diff changeset
   285
    ^ SignalInterruptHandler
claus
parents: 1
diff changeset
   286
!
claus
parents: 1
diff changeset
   287
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   288
signalInterruptHandler:aHandler
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   289
    "set the handler for UNIX-signal interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   290
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   291
    SignalInterruptHandler := aHandler
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   292
!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   293
2
claus
parents: 1
diff changeset
   294
childSignalInterruptHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   295
    "return the handler for UNIX-death-of-a-childprocess-signal interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   296
2
claus
parents: 1
diff changeset
   297
    ^ ChildSignalInterruptHandler
claus
parents: 1
diff changeset
   298
!
claus
parents: 1
diff changeset
   299
claus
parents: 1
diff changeset
   300
disposeInterruptHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   301
    "return the handler for object disposal interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   302
2
claus
parents: 1
diff changeset
   303
    ^ DisposeInterruptHandler
claus
parents: 1
diff changeset
   304
!
claus
parents: 1
diff changeset
   305
claus
parents: 1
diff changeset
   306
disposeInterruptHandler:aHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   307
    "set the handler for object disposal interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   308
2
claus
parents: 1
diff changeset
   309
    DisposeInterruptHandler := aHandler
claus
parents: 1
diff changeset
   310
!
claus
parents: 1
diff changeset
   311
claus
parents: 1
diff changeset
   312
recursionInterruptHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   313
    "return the handler for recursion/stack overflow interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   314
2
claus
parents: 1
diff changeset
   315
    ^ RecursionInterruptHandler
claus
parents: 1
diff changeset
   316
!
claus
parents: 1
diff changeset
   317
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   318
recursionInterruptHandler:aHandler
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   319
    "set the handler for recursion/stack overflow interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   320
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   321
    RecursionInterruptHandler := aHandler
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   322
!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   323
2
claus
parents: 1
diff changeset
   324
ioInterruptHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   325
    "return the handler for I/O available signal interrupts (SIGIO/SIGPOLL)"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   326
2
claus
parents: 1
diff changeset
   327
    ^ IOInterruptHandler
claus
parents: 1
diff changeset
   328
!
claus
parents: 1
diff changeset
   329
claus
parents: 1
diff changeset
   330
ioInterruptHandler:aHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   331
    "set the handler for I/O available signal interrupts (SIGIO/SIGPOLL)"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   332
2
claus
parents: 1
diff changeset
   333
    IOInterruptHandler := aHandler
claus
parents: 1
diff changeset
   334
! !
claus
parents: 1
diff changeset
   335
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   336
!ObjectMemory class methodsFor:'queries'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   337
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   338
newSpaceSize
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   339
    "return the total size of the new space - this is usually fix"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   340
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   341
%{  /* NOCONTEXT */
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   342
    RETURN ( _MKSMALLINT(__newSpaceSize()) );
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   343
%}
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   344
    "ObjectMemory newSpaceSize"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   345
!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   346
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   347
oldSpaceSize
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   348
    "return the total size of the old space. - may grow slowly"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   349
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   350
%{  /* NOCONTEXT */
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   351
    RETURN ( _MKSMALLINT(__oldSpaceSize()) );
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   352
%}
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   353
    "ObjectMemory oldSpaceSize"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   354
!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   355
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   356
newSpaceUsed
10
claus
parents: 5
diff changeset
   357
    "return the number of bytes allocated for new objects.
claus
parents: 5
diff changeset
   358
     The returned value is usually obsolete as soon as you do
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   359
     something with it ..."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   360
a27a279701f8 Initial revision
claus
parents:
diff changeset
   361
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   362
    RETURN ( _MKSMALLINT(__newSpaceUsed()) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   363
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   364
    "ObjectMemory newSpaceUsed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   365
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   366
a27a279701f8 Initial revision
claus
parents:
diff changeset
   367
oldSpaceUsed
10
claus
parents: 5
diff changeset
   368
    "return the number of bytes allocated for old objects.
claus
parents: 5
diff changeset
   369
     (This includes the free lists)"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   370
a27a279701f8 Initial revision
claus
parents:
diff changeset
   371
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   372
    RETURN ( _MKSMALLINT(__oldSpaceUsed()) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   373
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   374
    "ObjectMemory oldSpaceUsed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   375
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   376
10
claus
parents: 5
diff changeset
   377
freeSpace
claus
parents: 5
diff changeset
   378
    "return the number of bytes in the free lists.
claus
parents: 5
diff changeset
   379
     (which is included in oldSpaceUsed)"
claus
parents: 5
diff changeset
   380
claus
parents: 5
diff changeset
   381
%{  /* NOCONTEXT */
claus
parents: 5
diff changeset
   382
    RETURN ( _MKSMALLINT(__freeSpace()) );
claus
parents: 5
diff changeset
   383
%}
claus
parents: 5
diff changeset
   384
    "ObjectMemory freeSpace"
claus
parents: 5
diff changeset
   385
!
claus
parents: 5
diff changeset
   386
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   387
bytesUsed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   388
    "return the number of bytes allocated for objects -
a27a279701f8 Initial revision
claus
parents:
diff changeset
   389
     this number is not exact, since some objects may be dead"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   390
a27a279701f8 Initial revision
claus
parents:
diff changeset
   391
%{  /* NOCONTEXT */
10
claus
parents: 5
diff changeset
   392
    RETURN ( _MKSMALLINT(__oldSpaceUsed() + __newSpaceUsed() - __freeSpace()) );
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   393
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   394
    "ObjectMemory bytesUsed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   395
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   396
2
claus
parents: 1
diff changeset
   397
oldSpaceAllocatedSinceLastGC
claus
parents: 1
diff changeset
   398
    "return the number of bytes allocated for old objects since the
claus
parents: 1
diff changeset
   399
     last garbage collect occured"
claus
parents: 1
diff changeset
   400
claus
parents: 1
diff changeset
   401
%{  /* NOCONTEXT */
claus
parents: 1
diff changeset
   402
    RETURN ( _MKSMALLINT(__oldSpaceAllocatedSinceLastGC()) );
claus
parents: 1
diff changeset
   403
%}
claus
parents: 1
diff changeset
   404
    "ObjectMemory oldSpaceAllocatedSinceLastGC"
claus
parents: 1
diff changeset
   405
!
claus
parents: 1
diff changeset
   406
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   407
numberOfObjects
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   408
    "return the number of objects in the system."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   409
a27a279701f8 Initial revision
claus
parents:
diff changeset
   410
    |tally|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   411
a27a279701f8 Initial revision
claus
parents:
diff changeset
   412
    tally := 0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   413
    self allObjectsDo:[:obj | tally := tally + 1].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   414
    ^ tally
a27a279701f8 Initial revision
claus
parents:
diff changeset
   415
a27a279701f8 Initial revision
claus
parents:
diff changeset
   416
    "ObjectMemory numberOfObjects"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   417
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   418
a27a279701f8 Initial revision
claus
parents:
diff changeset
   419
printReferences:anObject
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   420
    "for debugging: print referents to anObject - will vanish.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   421
     use 'whoReferences:anObject' below (or 'anObject allOwners')"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   422
a27a279701f8 Initial revision
claus
parents:
diff changeset
   423
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   424
    _printRefChain(__context, anObject);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   425
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   426
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   427
a27a279701f8 Initial revision
claus
parents:
diff changeset
   428
whoReferences:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   429
    "return a collection of objects referencing the argument, anObject"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   430
a27a279701f8 Initial revision
claus
parents:
diff changeset
   431
    |aCollection|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   432
a27a279701f8 Initial revision
claus
parents:
diff changeset
   433
    aCollection := IdentitySet new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   434
    self allObjectsDo:[:o |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   435
        (o references:anObject) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   436
            aCollection add:o
a27a279701f8 Initial revision
claus
parents:
diff changeset
   437
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   438
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   439
    (aCollection size == 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   440
        "actually this cannot happen - there is always one"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   441
        ^ nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   442
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   443
    ^ aCollection
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   444
!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   445
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   446
addressOf:anObject
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   447
    "return the core address of anObject as an integer
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   448
     - since objects may move around, the returned value is invalid after the
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   449
     next scavenge/collect.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   450
     Use only for debugging."
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   451
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   452
%{  /* NOCONTEXT */
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   453
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   454
    if (! _isNonNilObject(anObject)) {
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   455
        RETURN ( nil );
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   456
    }
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   457
    RETURN ( _MKSMALLINT( (int)anObject ) );
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   458
%}
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   459
    "
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   460
    |p|
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   461
    p := Point new.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   462
    (ObjectMemory addressOf:p) printNewline.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   463
    ObjectMemory scavenge.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   464
    (ObjectMemory addressOf:p) printNewline.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   465
    "
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   466
!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   467
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   468
sizeOf:anObject
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   469
    "return the size of anObject in bytes.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   470
     Use only for debugging/memory monitoring."
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   471
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   472
%{  /* NOCONTEXT */
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   473
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   474
    RETURN ( _isNonNilObject(anObject) ? _MKSMALLINT(_qSize(anObject)) : _MKSMALLINT(0) )
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   475
%}
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   476
    "
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   477
     |hist big nw|
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   478
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   479
     hist := Array new:100 withAll:0.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   480
     big := 0.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   481
     ObjectMemory allObjectsDo:[:o |
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   482
         nw := (ObjectMemory sizeOf:o) // 4 + 1.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   483
         nw > 100 ifTrue:[
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   484
            big := big + 1
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   485
         ] ifFalse:[
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   486
            hist at:nw put:(hist at:nw) + 1
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   487
         ].
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   488
     ].
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   489
     hist printNewline.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   490
     big printNewline
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   491
    "
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   492
!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   493
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   494
spaceOf:anObject
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   495
    "return the memory space, in which anObject is.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   496
     - since objects may move between spaces, returned value is invalid after the
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   497
     next scavenge/collect.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   498
     Use only for debugging."
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   499
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   500
%{  /* NOCONTEXT */
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   501
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   502
    if (! _isNonNilObject(anObject)) {
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   503
        RETURN ( nil );
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   504
    }
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   505
    RETURN ( _MKSMALLINT( _qSpace(anObject) ) );
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   506
%}
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   507
    "
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   508
    |p|
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   509
    p := Point new.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   510
    (ObjectMemory spaceOf:p) printNewline.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   511
    1 to:100 do:[:i |
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   512
        ObjectMemory scavenge.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   513
    ].
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   514
    (ObjectMemory spaceOf:p) printNewline.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   515
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   516
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   517
a27a279701f8 Initial revision
claus
parents:
diff changeset
   518
!ObjectMemory class methodsFor:'garbage collector control'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   519
a27a279701f8 Initial revision
claus
parents:
diff changeset
   520
garbageCollect
a27a279701f8 Initial revision
claus
parents:
diff changeset
   521
    "search for and free garbage in the oldSpace
a27a279701f8 Initial revision
claus
parents:
diff changeset
   522
     (newSpace is cleaned automatically)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   523
     - can take a long time if paging is involved
a27a279701f8 Initial revision
claus
parents:
diff changeset
   524
     - when no paging is involved, its faster than I thought :-)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   525
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   526
    __garbageCollect(__context);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   527
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   528
a27a279701f8 Initial revision
claus
parents:
diff changeset
   529
    "ObjectMemory garbageCollect"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   530
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   531
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   532
moreOldSpace:howMuch
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   533
    "allocate howMuch bytes more for old objects.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   534
     This is done automatically, when running out of space.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   535
     This (currently) implies a compressing garbage collect - so its slow.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   536
     May vanish."
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   537
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   538
%{  
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   539
    if (_isSmallInteger(howMuch))
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   540
        _moreOldSpace(__context, _intVal(howMuch));
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   541
%}
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   542
    "ObjectMemory moreOldSpace:1000000"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   543
!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   544
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   545
scavenge
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   546
    "collect newspace stuff - for debugging only. will vanish"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   547
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   548
    nonTenuringScavenge(__context);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   549
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   550
a27a279701f8 Initial revision
claus
parents:
diff changeset
   551
    "ObjectMemory scavenge"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   552
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   553
a27a279701f8 Initial revision
claus
parents:
diff changeset
   554
tenure
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   555
    "force all new stuff into old-space - for debugging only. will vanish"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   556
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   557
    tenure(__context);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   558
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   559
a27a279701f8 Initial revision
claus
parents:
diff changeset
   560
    "ObjectMemory tenure"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   561
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   562
a27a279701f8 Initial revision
claus
parents:
diff changeset
   563
markAndSweep
a27a279701f8 Initial revision
claus
parents:
diff changeset
   564
    "mark/sweep garbage collector"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   565
a27a279701f8 Initial revision
claus
parents:
diff changeset
   566
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   567
    markAndSweep(__context);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   568
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   569
a27a279701f8 Initial revision
claus
parents:
diff changeset
   570
    "ObjectMemory markAndSweep"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   571
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   572
a27a279701f8 Initial revision
claus
parents:
diff changeset
   573
gcStep
a27a279701f8 Initial revision
claus
parents:
diff changeset
   574
    "one incremental garbage collect step"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   575
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   576
    incrGCstep(__context);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   577
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   578
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   579
2
claus
parents: 1
diff changeset
   580
incrementalGCLimit:aNumber
claus
parents: 1
diff changeset
   581
    "set the limit for incremental GC activation"
claus
parents: 1
diff changeset
   582
claus
parents: 1
diff changeset
   583
    IncrementalGCLimit := aNumber
claus
parents: 1
diff changeset
   584
claus
parents: 1
diff changeset
   585
    "ObjectMemory incrementalGCLimit:100000"
claus
parents: 1
diff changeset
   586
!
claus
parents: 1
diff changeset
   587
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   588
incrementalGCLimit
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   589
    "return the limit for incremental GC activation"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   590
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   591
    ^ IncrementalGCLimit
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   592
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   593
    "ObjectMemory incrementalGCLimit"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   594
!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   595
2
claus
parents: 1
diff changeset
   596
turnGarbageCollectorOff
claus
parents: 1
diff changeset
   597
    "turn off garbage collector by forcing new objects to be
claus
parents: 1
diff changeset
   598
     allocated in oldSpace (instead of newSpace)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   599
     this method is somewhat dangerous: if collector is turned off,
a27a279701f8 Initial revision
claus
parents:
diff changeset
   600
     and too many objects are created, the system may run into trouble.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   601
     Use this only for measurement purposes or when realtime behavior
2
claus
parents: 1
diff changeset
   602
     is required for a limited time period. No warranty"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   603
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   604
    allocForceSpace(0);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   605
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   606
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   607
2
claus
parents: 1
diff changeset
   608
turnGarbageCollectorOn
claus
parents: 1
diff changeset
   609
    "turn garbage collector on again"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   610
a27a279701f8 Initial revision
claus
parents:
diff changeset
   611
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   612
    allocForceSpace(1);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   613
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   614
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   615
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   616
!ObjectMemory class methodsFor:'low memory handling'!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   617
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   618
memoryInterrupt
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   619
    "when a low-memory condition arises, ask all classes to
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   620
     remove possibly cached data - this may help a bit"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   621
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   622
    Smalltalk allClasses do:[:aClass |
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   623
        aClass lowSpaceCleanup
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   624
    ].
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   625
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   626
    self error:'almost out of memory'
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   627
! !
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   628
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   629
!ObjectMemory class methodsFor:'system management'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   630
a27a279701f8 Initial revision
claus
parents:
diff changeset
   631
loadClassBinary:aClassName
a27a279701f8 Initial revision
claus
parents:
diff changeset
   632
    "find the object file for aClassName and -if found - load it;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   633
     this one loads precompiled object files"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   634
a27a279701f8 Initial revision
claus
parents:
diff changeset
   635
    |fName newClass upd|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   636
a27a279701f8 Initial revision
claus
parents:
diff changeset
   637
    fName := self fileNameForClass:aClassName.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   638
    fName notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   639
        upd := Class updateChanges:false.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   640
        [
a27a279701f8 Initial revision
claus
parents:
diff changeset
   641
            self loadBinary:(fName , '.o')
a27a279701f8 Initial revision
claus
parents:
diff changeset
   642
        ] valueNowOrOnUnwindDo:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   643
            Class updateChanges:upd
a27a279701f8 Initial revision
claus
parents:
diff changeset
   644
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   645
        newClass := self at:(aClassName asSymbol).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   646
        (newClass notNil and:[newClass implements:#initialize]) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   647
            newClass initialize
a27a279701f8 Initial revision
claus
parents:
diff changeset
   648
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   649
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   650
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   651
a27a279701f8 Initial revision
claus
parents:
diff changeset
   652
snapShot
a27a279701f8 Initial revision
claus
parents:
diff changeset
   653
    "create a snapshot"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   654
a27a279701f8 Initial revision
claus
parents:
diff changeset
   655
    ImageName isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   656
        ImageName := 'st.img'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   657
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   658
    self snapShotOn:ImageName
a27a279701f8 Initial revision
claus
parents:
diff changeset
   659
a27a279701f8 Initial revision
claus
parents:
diff changeset
   660
    "ObjectMemory snapShot"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   661
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   662
a27a279701f8 Initial revision
claus
parents:
diff changeset
   663
snapShotOn:aFileName
a27a279701f8 Initial revision
claus
parents:
diff changeset
   664
    "create a snapshot in the given file"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   665
a27a279701f8 Initial revision
claus
parents:
diff changeset
   666
    "give others a chance to fix things"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   667
    self changed:#save.
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   668
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   669
%{  /* STACK:32000 */
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   670
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   671
    OBJ __snapShotOn();
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   672
    OBJ retVal;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   673
a27a279701f8 Initial revision
claus
parents:
diff changeset
   674
    if (_isString(aFileName)) {
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   675
	BLOCKINTERRUPTS();
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   676
        retVal = __snapShotOn(__context, _stringVal(aFileName));
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   677
	UNBLOCKINTERRUPTS();
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   678
        RETURN ( retVal );
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   679
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   680
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   681
.
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   682
    ^ false
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   683
a27a279701f8 Initial revision
claus
parents:
diff changeset
   684
    "ObjectMemory snapShotOn:'myimage.img'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   685
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   686
a27a279701f8 Initial revision
claus
parents:
diff changeset
   687
applicationImageOn:aFileName for:startupClass selector:startupSelector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   688
    "create a snapshot which will come up without any views 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   689
     but starts up an application by sending startupClass the startupSelector"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   690
2
claus
parents: 1
diff changeset
   691
    |viewsKnown savedIdleBlocks savedTimeoutBlocks savedTranscript
claus
parents: 1
diff changeset
   692
     savedRoot|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   693
a27a279701f8 Initial revision
claus
parents:
diff changeset
   694
    viewsKnown := Display knownViews.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   695
    savedIdleBlocks := Display idleBlocks.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   696
    savedTimeoutBlocks := Display timeOutBlocks.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   697
    savedTranscript := Transcript.
2
claus
parents: 1
diff changeset
   698
    savedRoot := RootView.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   699
10
claus
parents: 5
diff changeset
   700
    "a kludge: save image with modified knownViews, no idle- and timeoutblocks
claus
parents: 5
diff changeset
   701
     and also Transcript set to StdErr ..."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   702
a27a279701f8 Initial revision
claus
parents:
diff changeset
   703
    Display knownViews:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   704
    Display idleBlocks:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   705
    Display timeOutBlocks:nil.
2
claus
parents: 1
diff changeset
   706
    RootView := nil.
claus
parents: 1
diff changeset
   707
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   708
    Transcript := Stderr.
10
claus
parents: 5
diff changeset
   709
    Smalltalk startupClass:startupClass selector:startupSelector arguments:nil.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   710
    self snapShotOn:aFileName.
10
claus
parents: 5
diff changeset
   711
    Smalltalk startupClass:nil selector:nil arguments:nil.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   712
2
claus
parents: 1
diff changeset
   713
    RootView := savedRoot.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   714
    Transcript := savedTranscript.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   715
    Display knownViews:viewsKnown.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   716
    Display idleBlocks:savedIdleBlocks.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   717
    Display timeOutBlocks:savedTimeoutBlocks
a27a279701f8 Initial revision
claus
parents:
diff changeset
   718
a27a279701f8 Initial revision
claus
parents:
diff changeset
   719
    "ObjectMemory applicationImageOn:'draw.img' for:DrawTool selector:#start"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   720
    "ObjectMemory applicationImageOn:'pm.img' for:PMSimulator selector:#start"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   721
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   722
a27a279701f8 Initial revision
claus
parents:
diff changeset
   723
minimumApplicationImageOn:aFileName for:startupClass selector:startupSelector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   724
    "create a snapshot which will come up without any views 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   725
     but starts up an application by sending startupClass the startupSelector.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   726
     All unneeded info is stripped from the saved image."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   727
a27a279701f8 Initial revision
claus
parents:
diff changeset
   728
    "create a temporary image, for continuation"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   729
    self snapShotOn:'temp.img'.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   730
a27a279701f8 Initial revision
claus
parents:
diff changeset
   731
    Display knownViews do:[:aView |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   732
        aView notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   733
            aView superView isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   734
                aView destroy
a27a279701f8 Initial revision
claus
parents:
diff changeset
   735
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   736
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   737
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   738
a27a279701f8 Initial revision
claus
parents:
diff changeset
   739
    self stripImage.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   740
a27a279701f8 Initial revision
claus
parents:
diff changeset
   741
    self applicationImageOn:aFileName for:startupClass selector:startupSelector.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   742
a27a279701f8 Initial revision
claus
parents:
diff changeset
   743
    "continue in old image"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   744
a27a279701f8 Initial revision
claus
parents:
diff changeset
   745
    OperatingSystem exec:(Arguments at:1)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   746
           withArguments:#('smalltalk' '-i' 'temp.img') , (Arguments copyFrom:2)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   747
a27a279701f8 Initial revision
claus
parents:
diff changeset
   748
    "ObjectMemory minimumApplicationImageOn:'clock1.img' for:Clock selector:#start"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   749
    "ObjectMemory applicationImageOn:'clock2.img' for:Clock selector:#start"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   750
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   751
a27a279701f8 Initial revision
claus
parents:
diff changeset
   752
stripImage
a27a279701f8 Initial revision
claus
parents:
diff changeset
   753
    "remove all unneeded stuff from the image - much more is possible here"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   754
2
claus
parents: 1
diff changeset
   755
    "remove all class comments & source"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   756
2
claus
parents: 1
diff changeset
   757
    Smalltalk allBehaviorsDo:[:aClass |
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   758
        aClass setComment:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   759
        aClass methodDictionary do:[:aMethod |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   760
            aMethod source:''.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   761
            aMethod category:#none 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   762
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   763
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   764
    self garbageCollect
a27a279701f8 Initial revision
claus
parents:
diff changeset
   765
! !