ObjMem.st
author claus
Fri, 25 Feb 1994 14:00:53 +0100
changeset 56 be0ed17e6f85
parent 22 847106305963
child 68 59faa75185ba
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
56
be0ed17e6f85 *** empty log message ***
claus
parents: 22
diff changeset
    33
$Header: /cvs/stx/stx/libbasic/Attic/ObjMem.st,v 1.8 1994-02-25 13:00:45 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.
56
be0ed17e6f85 *** empty log message ***
claus
parents: 22
diff changeset
    45
Do not depend on them being there - some may vanish ...
13
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|
22
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   188
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   189
%{  /* NOREGISTER - work may not be placed into a register here */
2
claus
parents: 1
diff changeset
   190
    nonTenuringScavenge(__context);
claus
parents: 1
diff changeset
   191
    /*
claus
parents: 1
diff changeset
   192
     * allObjectsDo needs a temporary to hold newSpace objects
claus
parents: 1
diff changeset
   193
     */
claus
parents: 1
diff changeset
   194
    __allObjectsDo(&aBlock, &work COMMA_CON);
claus
parents: 1
diff changeset
   195
%}
claus
parents: 1
diff changeset
   196
!
claus
parents: 1
diff changeset
   197
claus
parents: 1
diff changeset
   198
allOldObjectsDo:aBlock
claus
parents: 1
diff changeset
   199
    "evaluate the argument, aBlock for all old objects in the system.
claus
parents: 1
diff changeset
   200
     For debugging and tests only - do not use"
claus
parents: 1
diff changeset
   201
%{
claus
parents: 1
diff changeset
   202
    __allObjectsDo(&aBlock, (OBJ *)0 COMMA_CON);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   203
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   204
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   205
2
claus
parents: 1
diff changeset
   206
!ObjectMemory class methodsFor:'handler access'!
claus
parents: 1
diff changeset
   207
claus
parents: 1
diff changeset
   208
internalErrorHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   209
    "return the handler for ST/X internal errors.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   210
     An internal error is reported for example when a methods
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   211
     bytecode is not a ByteArray, the selector table is not an Array
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   212
     etc.  Those should not occur in normal circumstances."
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   213
2
claus
parents: 1
diff changeset
   214
    ^ InternalErrorHandler
claus
parents: 1
diff changeset
   215
!
claus
parents: 1
diff changeset
   216
claus
parents: 1
diff changeset
   217
userInterruptHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   218
    "return the handler for CNTL-C interrupt handling"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   219
2
claus
parents: 1
diff changeset
   220
    ^ UserInterruptHandler
claus
parents: 1
diff changeset
   221
!
claus
parents: 1
diff changeset
   222
claus
parents: 1
diff changeset
   223
userInterruptHandler:aHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   224
    "set the handler for CNTL-C interrupt handling"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   225
2
claus
parents: 1
diff changeset
   226
    UserInterruptHandler := aHandler
claus
parents: 1
diff changeset
   227
!
claus
parents: 1
diff changeset
   228
claus
parents: 1
diff changeset
   229
timerInterruptHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   230
    "return the handler for timer interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   231
2
claus
parents: 1
diff changeset
   232
    ^ TimerInterruptHandler
claus
parents: 1
diff changeset
   233
!
claus
parents: 1
diff changeset
   234
10
claus
parents: 5
diff changeset
   235
timerInterruptHandler:aHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   236
    "set the handler for timer interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   237
10
claus
parents: 5
diff changeset
   238
    TimerInterruptHandler := aHandler
claus
parents: 5
diff changeset
   239
!
claus
parents: 5
diff changeset
   240
2
claus
parents: 1
diff changeset
   241
spyInterruptHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   242
    "return the handler for spy-timer interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   243
2
claus
parents: 1
diff changeset
   244
    ^ SpyInterruptHandler
claus
parents: 1
diff changeset
   245
!
claus
parents: 1
diff changeset
   246
claus
parents: 1
diff changeset
   247
spyInterruptHandler:aHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   248
    "set the handler for spy-timer interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   249
2
claus
parents: 1
diff changeset
   250
    SpyInterruptHandler := aHandler
claus
parents: 1
diff changeset
   251
!
claus
parents: 1
diff changeset
   252
claus
parents: 1
diff changeset
   253
stepInterruptHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   254
    "return the handler for single step interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   255
2
claus
parents: 1
diff changeset
   256
    ^ StepInterruptHandler
claus
parents: 1
diff changeset
   257
!
claus
parents: 1
diff changeset
   258
claus
parents: 1
diff changeset
   259
stepInterruptHandler:aHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   260
    "set the handler for single step interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   261
2
claus
parents: 1
diff changeset
   262
    StepInterruptHandler := aHandler
claus
parents: 1
diff changeset
   263
!
claus
parents: 1
diff changeset
   264
claus
parents: 1
diff changeset
   265
exceptionInterruptHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   266
    "return the handler for floating point exception interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   267
2
claus
parents: 1
diff changeset
   268
    ^ ExceptionInterruptHandler
claus
parents: 1
diff changeset
   269
!
claus
parents: 1
diff changeset
   270
claus
parents: 1
diff changeset
   271
errorInterruptHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   272
    "return the handler for display error interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   273
2
claus
parents: 1
diff changeset
   274
    ^ ErrorInterruptHandler
claus
parents: 1
diff changeset
   275
!
claus
parents: 1
diff changeset
   276
claus
parents: 1
diff changeset
   277
errorInterruptHandler:aHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   278
    "set the handler for display error interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   279
2
claus
parents: 1
diff changeset
   280
    ErrorInterruptHandler := aHandler
claus
parents: 1
diff changeset
   281
!
claus
parents: 1
diff changeset
   282
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   283
signalInterruptHandler
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   284
    "return the handler for UNIX-signal interrupts"
2
claus
parents: 1
diff changeset
   285
claus
parents: 1
diff changeset
   286
    ^ SignalInterruptHandler
claus
parents: 1
diff changeset
   287
!
claus
parents: 1
diff changeset
   288
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   289
signalInterruptHandler:aHandler
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   290
    "set the handler for UNIX-signal interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   291
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   292
    SignalInterruptHandler := aHandler
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   293
!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   294
2
claus
parents: 1
diff changeset
   295
childSignalInterruptHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   296
    "return the handler for UNIX-death-of-a-childprocess-signal interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   297
2
claus
parents: 1
diff changeset
   298
    ^ ChildSignalInterruptHandler
claus
parents: 1
diff changeset
   299
!
claus
parents: 1
diff changeset
   300
claus
parents: 1
diff changeset
   301
disposeInterruptHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   302
    "return the handler for object disposal interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   303
2
claus
parents: 1
diff changeset
   304
    ^ DisposeInterruptHandler
claus
parents: 1
diff changeset
   305
!
claus
parents: 1
diff changeset
   306
claus
parents: 1
diff changeset
   307
disposeInterruptHandler:aHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   308
    "set the handler for object disposal interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   309
2
claus
parents: 1
diff changeset
   310
    DisposeInterruptHandler := aHandler
claus
parents: 1
diff changeset
   311
!
claus
parents: 1
diff changeset
   312
claus
parents: 1
diff changeset
   313
recursionInterruptHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   314
    "return the handler for recursion/stack overflow interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   315
2
claus
parents: 1
diff changeset
   316
    ^ RecursionInterruptHandler
claus
parents: 1
diff changeset
   317
!
claus
parents: 1
diff changeset
   318
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   319
recursionInterruptHandler:aHandler
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   320
    "set the handler for recursion/stack overflow interrupts"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   321
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   322
    RecursionInterruptHandler := aHandler
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   323
!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   324
2
claus
parents: 1
diff changeset
   325
ioInterruptHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   326
    "return the handler for I/O available signal interrupts (SIGIO/SIGPOLL)"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   327
2
claus
parents: 1
diff changeset
   328
    ^ IOInterruptHandler
claus
parents: 1
diff changeset
   329
!
claus
parents: 1
diff changeset
   330
claus
parents: 1
diff changeset
   331
ioInterruptHandler:aHandler
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   332
    "set the handler for I/O available signal interrupts (SIGIO/SIGPOLL)"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   333
2
claus
parents: 1
diff changeset
   334
    IOInterruptHandler := aHandler
claus
parents: 1
diff changeset
   335
! !
claus
parents: 1
diff changeset
   336
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   337
!ObjectMemory class methodsFor:'queries'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   338
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   339
newSpaceSize
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   340
    "return the total size of the new space - this is usually fix"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   341
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   342
%{  /* NOCONTEXT */
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   343
    RETURN ( _MKSMALLINT(__newSpaceSize()) );
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   344
%}
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   345
    "ObjectMemory newSpaceSize"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   346
!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   347
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   348
oldSpaceSize
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   349
    "return the total size of the old space. - may grow slowly"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   350
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   351
%{  /* NOCONTEXT */
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   352
    RETURN ( _MKSMALLINT(__oldSpaceSize()) );
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   353
%}
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   354
    "ObjectMemory oldSpaceSize"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   355
!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   356
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   357
newSpaceUsed
10
claus
parents: 5
diff changeset
   358
    "return the number of bytes allocated for new objects.
claus
parents: 5
diff changeset
   359
     The returned value is usually obsolete as soon as you do
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   360
     something with it ..."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   361
a27a279701f8 Initial revision
claus
parents:
diff changeset
   362
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   363
    RETURN ( _MKSMALLINT(__newSpaceUsed()) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   364
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   365
    "ObjectMemory newSpaceUsed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   366
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   367
a27a279701f8 Initial revision
claus
parents:
diff changeset
   368
oldSpaceUsed
10
claus
parents: 5
diff changeset
   369
    "return the number of bytes allocated for old objects.
claus
parents: 5
diff changeset
   370
     (This includes the free lists)"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   371
a27a279701f8 Initial revision
claus
parents:
diff changeset
   372
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   373
    RETURN ( _MKSMALLINT(__oldSpaceUsed()) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   374
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   375
    "ObjectMemory oldSpaceUsed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   376
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   377
10
claus
parents: 5
diff changeset
   378
freeSpace
claus
parents: 5
diff changeset
   379
    "return the number of bytes in the free lists.
claus
parents: 5
diff changeset
   380
     (which is included in oldSpaceUsed)"
claus
parents: 5
diff changeset
   381
claus
parents: 5
diff changeset
   382
%{  /* NOCONTEXT */
claus
parents: 5
diff changeset
   383
    RETURN ( _MKSMALLINT(__freeSpace()) );
claus
parents: 5
diff changeset
   384
%}
claus
parents: 5
diff changeset
   385
    "ObjectMemory freeSpace"
claus
parents: 5
diff changeset
   386
!
claus
parents: 5
diff changeset
   387
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   388
bytesUsed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   389
    "return the number of bytes allocated for objects -
a27a279701f8 Initial revision
claus
parents:
diff changeset
   390
     this number is not exact, since some objects may be dead"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   391
a27a279701f8 Initial revision
claus
parents:
diff changeset
   392
%{  /* NOCONTEXT */
10
claus
parents: 5
diff changeset
   393
    RETURN ( _MKSMALLINT(__oldSpaceUsed() + __newSpaceUsed() - __freeSpace()) );
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   394
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   395
    "ObjectMemory bytesUsed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   396
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   397
2
claus
parents: 1
diff changeset
   398
oldSpaceAllocatedSinceLastGC
claus
parents: 1
diff changeset
   399
    "return the number of bytes allocated for old objects since the
claus
parents: 1
diff changeset
   400
     last garbage collect occured"
claus
parents: 1
diff changeset
   401
claus
parents: 1
diff changeset
   402
%{  /* NOCONTEXT */
claus
parents: 1
diff changeset
   403
    RETURN ( _MKSMALLINT(__oldSpaceAllocatedSinceLastGC()) );
claus
parents: 1
diff changeset
   404
%}
claus
parents: 1
diff changeset
   405
    "ObjectMemory oldSpaceAllocatedSinceLastGC"
claus
parents: 1
diff changeset
   406
!
claus
parents: 1
diff changeset
   407
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   408
numberOfObjects
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   409
    "return the number of objects in the system."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   410
a27a279701f8 Initial revision
claus
parents:
diff changeset
   411
    |tally|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   412
a27a279701f8 Initial revision
claus
parents:
diff changeset
   413
    tally := 0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   414
    self allObjectsDo:[:obj | tally := tally + 1].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   415
    ^ tally
a27a279701f8 Initial revision
claus
parents:
diff changeset
   416
a27a279701f8 Initial revision
claus
parents:
diff changeset
   417
    "ObjectMemory numberOfObjects"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   418
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   419
a27a279701f8 Initial revision
claus
parents:
diff changeset
   420
printReferences:anObject
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   421
    "for debugging: print referents to anObject - will vanish.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   422
     use 'whoReferences:anObject' below (or 'anObject allOwners')"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   423
a27a279701f8 Initial revision
claus
parents:
diff changeset
   424
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   425
    _printRefChain(__context, anObject);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   426
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   427
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   428
a27a279701f8 Initial revision
claus
parents:
diff changeset
   429
whoReferences:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   430
    "return a collection of objects referencing the argument, anObject"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   431
a27a279701f8 Initial revision
claus
parents:
diff changeset
   432
    |aCollection|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   433
a27a279701f8 Initial revision
claus
parents:
diff changeset
   434
    aCollection := IdentitySet new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   435
    self allObjectsDo:[:o |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   436
        (o references:anObject) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   437
            aCollection add:o
a27a279701f8 Initial revision
claus
parents:
diff changeset
   438
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   439
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   440
    (aCollection size == 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   441
        "actually this cannot happen - there is always one"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   442
        ^ nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   443
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   444
    ^ aCollection
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   445
!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   446
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   447
addressOf:anObject
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   448
    "return the core address of anObject as an integer
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   449
     - since objects may move around, the returned value is invalid after the
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   450
     next scavenge/collect.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   451
     Use only for debugging."
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   452
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   453
%{  /* NOCONTEXT */
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   454
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   455
    if (! _isNonNilObject(anObject)) {
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   456
        RETURN ( nil );
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   457
    }
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   458
    RETURN ( _MKSMALLINT( (int)anObject ) );
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   459
%}
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   460
    "
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   461
    |p|
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   462
    p := Point new.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   463
    (ObjectMemory addressOf:p) printNewline.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   464
    ObjectMemory scavenge.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   465
    (ObjectMemory addressOf:p) printNewline.
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
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   469
sizeOf:anObject
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   470
    "return the size of anObject in bytes.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   471
     Use only for debugging/memory monitoring."
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   472
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   473
%{  /* NOCONTEXT */
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   474
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   475
    RETURN ( _isNonNilObject(anObject) ? _MKSMALLINT(_qSize(anObject)) : _MKSMALLINT(0) )
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   476
%}
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   477
    "
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   478
     |hist big nw|
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   479
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   480
     hist := Array new:100 withAll:0.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   481
     big := 0.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   482
     ObjectMemory allObjectsDo:[:o |
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   483
         nw := (ObjectMemory sizeOf:o) // 4 + 1.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   484
         nw > 100 ifTrue:[
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   485
            big := big + 1
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   486
         ] ifFalse:[
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   487
            hist at:nw put:(hist at:nw) + 1
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   488
         ].
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   489
     ].
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   490
     hist printNewline.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   491
     big printNewline
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
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   495
spaceOf:anObject
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   496
    "return the memory space, in which anObject is.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   497
     - since objects may move between spaces, returned value is invalid after the
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   498
     next scavenge/collect.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   499
     Use only for debugging."
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   500
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   501
%{  /* NOCONTEXT */
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   502
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   503
    if (! _isNonNilObject(anObject)) {
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   504
        RETURN ( nil );
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   505
    }
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   506
    RETURN ( _MKSMALLINT( _qSpace(anObject) ) );
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   507
%}
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   508
    "
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   509
    |p|
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   510
    p := Point new.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   511
    (ObjectMemory spaceOf:p) printNewline.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   512
    1 to:100 do:[:i |
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   513
        ObjectMemory scavenge.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   514
    ].
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   515
    (ObjectMemory spaceOf:p) printNewline.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   516
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   517
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   518
a27a279701f8 Initial revision
claus
parents:
diff changeset
   519
!ObjectMemory class methodsFor:'garbage collector control'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   520
a27a279701f8 Initial revision
claus
parents:
diff changeset
   521
garbageCollect
a27a279701f8 Initial revision
claus
parents:
diff changeset
   522
    "search for and free garbage in the oldSpace
a27a279701f8 Initial revision
claus
parents:
diff changeset
   523
     (newSpace is cleaned automatically)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   524
     - can take a long time if paging is involved
a27a279701f8 Initial revision
claus
parents:
diff changeset
   525
     - when no paging is involved, its faster than I thought :-)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   526
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   527
    __garbageCollect(__context);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   528
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   529
a27a279701f8 Initial revision
claus
parents:
diff changeset
   530
    "ObjectMemory garbageCollect"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   531
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   532
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   533
moreOldSpace:howMuch
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   534
    "allocate howMuch bytes more for old objects.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   535
     This is done automatically, when running out of space.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   536
     This (currently) implies a compressing garbage collect - so its slow.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   537
     May vanish."
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   538
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   539
%{  
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   540
    if (_isSmallInteger(howMuch))
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   541
        _moreOldSpace(__context, _intVal(howMuch));
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   542
%}
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   543
    "ObjectMemory moreOldSpace:1000000"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   544
!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   545
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   546
scavenge
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   547
    "collect newspace stuff - for debugging only. will vanish"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   548
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   549
    nonTenuringScavenge(__context);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   550
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   551
a27a279701f8 Initial revision
claus
parents:
diff changeset
   552
    "ObjectMemory scavenge"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   553
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   554
a27a279701f8 Initial revision
claus
parents:
diff changeset
   555
tenure
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   556
    "force all new stuff into old-space - for debugging only. will vanish"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   557
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   558
    tenure(__context);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   559
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   560
a27a279701f8 Initial revision
claus
parents:
diff changeset
   561
    "ObjectMemory tenure"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   562
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   563
a27a279701f8 Initial revision
claus
parents:
diff changeset
   564
markAndSweep
a27a279701f8 Initial revision
claus
parents:
diff changeset
   565
    "mark/sweep garbage collector"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   566
a27a279701f8 Initial revision
claus
parents:
diff changeset
   567
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   568
    markAndSweep(__context);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   569
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   570
a27a279701f8 Initial revision
claus
parents:
diff changeset
   571
    "ObjectMemory markAndSweep"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   572
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   573
a27a279701f8 Initial revision
claus
parents:
diff changeset
   574
gcStep
a27a279701f8 Initial revision
claus
parents:
diff changeset
   575
    "one incremental garbage collect step"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   576
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   577
    incrGCstep(__context);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   578
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   579
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   580
2
claus
parents: 1
diff changeset
   581
incrementalGCLimit:aNumber
claus
parents: 1
diff changeset
   582
    "set the limit for incremental GC activation"
claus
parents: 1
diff changeset
   583
claus
parents: 1
diff changeset
   584
    IncrementalGCLimit := aNumber
claus
parents: 1
diff changeset
   585
claus
parents: 1
diff changeset
   586
    "ObjectMemory incrementalGCLimit:100000"
claus
parents: 1
diff changeset
   587
!
claus
parents: 1
diff changeset
   588
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   589
incrementalGCLimit
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   590
    "return the limit for incremental GC activation"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   591
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   592
    ^ IncrementalGCLimit
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   593
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   594
    "ObjectMemory incrementalGCLimit"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   595
!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   596
2
claus
parents: 1
diff changeset
   597
turnGarbageCollectorOff
claus
parents: 1
diff changeset
   598
    "turn off garbage collector by forcing new objects to be
claus
parents: 1
diff changeset
   599
     allocated in oldSpace (instead of newSpace)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   600
     this method is somewhat dangerous: if collector is turned off,
a27a279701f8 Initial revision
claus
parents:
diff changeset
   601
     and too many objects are created, the system may run into trouble.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   602
     Use this only for measurement purposes or when realtime behavior
2
claus
parents: 1
diff changeset
   603
     is required for a limited time period. No warranty"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   604
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   605
    allocForceSpace(0);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   606
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   607
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   608
2
claus
parents: 1
diff changeset
   609
turnGarbageCollectorOn
claus
parents: 1
diff changeset
   610
    "turn garbage collector on again"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   611
a27a279701f8 Initial revision
claus
parents:
diff changeset
   612
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   613
    allocForceSpace(1);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   614
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   615
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   616
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   617
!ObjectMemory class methodsFor:'low memory handling'!
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   618
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   619
memoryInterrupt
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   620
    "when a low-memory condition arises, ask all classes to
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   621
     remove possibly cached data - this may help a bit"
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   622
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   623
    Smalltalk allClasses do:[:aClass |
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   624
        aClass lowSpaceCleanup
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   625
    ].
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   626
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   627
    self error:'almost out of memory'
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   628
! !
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   629
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   630
!ObjectMemory class methodsFor:'system management'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   631
a27a279701f8 Initial revision
claus
parents:
diff changeset
   632
loadClassBinary:aClassName
a27a279701f8 Initial revision
claus
parents:
diff changeset
   633
    "find the object file for aClassName and -if found - load it;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   634
     this one loads precompiled object files"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   635
a27a279701f8 Initial revision
claus
parents:
diff changeset
   636
    |fName newClass upd|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   637
a27a279701f8 Initial revision
claus
parents:
diff changeset
   638
    fName := self fileNameForClass:aClassName.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   639
    fName notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   640
        upd := Class updateChanges:false.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   641
        [
a27a279701f8 Initial revision
claus
parents:
diff changeset
   642
            self loadBinary:(fName , '.o')
a27a279701f8 Initial revision
claus
parents:
diff changeset
   643
        ] valueNowOrOnUnwindDo:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   644
            Class updateChanges:upd
a27a279701f8 Initial revision
claus
parents:
diff changeset
   645
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   646
        newClass := self at:(aClassName asSymbol).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   647
        (newClass notNil and:[newClass implements:#initialize]) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   648
            newClass initialize
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
22
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   653
nameForSnapshot
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   654
    "return the filename of the current image or,
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   655
     if not running from an image, the default name 'st.img'"
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   656
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   657
    (ImageName isNil or:[ImageName isBlank]) ifTrue:[
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   658
        ^ 'st.img'
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   659
    ].
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   660
    ^ ImageName
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   661
!
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   662
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   663
snapShot
a27a279701f8 Initial revision
claus
parents:
diff changeset
   664
    "create a snapshot"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   665
a27a279701f8 Initial revision
claus
parents:
diff changeset
   666
    ImageName isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   667
        ImageName := 'st.img'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   668
    ].
22
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   669
    self snapShotOn:(self nameForSnapshot)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   670
a27a279701f8 Initial revision
claus
parents:
diff changeset
   671
    "ObjectMemory snapShot"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   672
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   673
a27a279701f8 Initial revision
claus
parents:
diff changeset
   674
snapShotOn:aFileName
a27a279701f8 Initial revision
claus
parents:
diff changeset
   675
    "create a snapshot in the given file"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   676
22
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   677
    |ok|
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   678
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   679
    "give others a chance to fix things"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   680
    self changed:#save.
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   681
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   682
%{  /* STACK:32000 */
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   683
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   684
    OBJ __snapShotOn();
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   685
    OBJ retVal;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   686
56
be0ed17e6f85 *** empty log message ***
claus
parents: 22
diff changeset
   687
    if (__isString(aFileName)) {
22
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   688
        BLOCKINTERRUPTS();
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   689
        ok = __snapShotOn(__context, _stringVal(aFileName));
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   690
        UNBLOCKINTERRUPTS();
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   691
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   692
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   693
.
22
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   694
    ok ifTrue:[
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   695
        Class addChangeRecordForSnapshot:aFileName
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   696
    ].
847106305963 *** empty log message ***
claus
parents: 13
diff changeset
   697
    ^ ok
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   698
a27a279701f8 Initial revision
claus
parents:
diff changeset
   699
    "ObjectMemory snapShotOn:'myimage.img'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   700
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   701
a27a279701f8 Initial revision
claus
parents:
diff changeset
   702
applicationImageOn:aFileName for:startupClass selector:startupSelector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   703
    "create a snapshot which will come up without any views 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   704
     but starts up an application by sending startupClass the startupSelector"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   705
2
claus
parents: 1
diff changeset
   706
    |viewsKnown savedIdleBlocks savedTimeoutBlocks savedTranscript
claus
parents: 1
diff changeset
   707
     savedRoot|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   708
a27a279701f8 Initial revision
claus
parents:
diff changeset
   709
    viewsKnown := Display knownViews.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   710
    savedIdleBlocks := Display idleBlocks.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   711
    savedTimeoutBlocks := Display timeOutBlocks.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   712
    savedTranscript := Transcript.
2
claus
parents: 1
diff changeset
   713
    savedRoot := RootView.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   714
10
claus
parents: 5
diff changeset
   715
    "a kludge: save image with modified knownViews, no idle- and timeoutblocks
claus
parents: 5
diff changeset
   716
     and also Transcript set to StdErr ..."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   717
a27a279701f8 Initial revision
claus
parents:
diff changeset
   718
    Display knownViews:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   719
    Display idleBlocks:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   720
    Display timeOutBlocks:nil.
2
claus
parents: 1
diff changeset
   721
    RootView := nil.
claus
parents: 1
diff changeset
   722
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   723
    Transcript := Stderr.
10
claus
parents: 5
diff changeset
   724
    Smalltalk startupClass:startupClass selector:startupSelector arguments:nil.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   725
    self snapShotOn:aFileName.
10
claus
parents: 5
diff changeset
   726
    Smalltalk startupClass:nil selector:nil arguments:nil.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   727
2
claus
parents: 1
diff changeset
   728
    RootView := savedRoot.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   729
    Transcript := savedTranscript.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   730
    Display knownViews:viewsKnown.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   731
    Display idleBlocks:savedIdleBlocks.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   732
    Display timeOutBlocks:savedTimeoutBlocks
a27a279701f8 Initial revision
claus
parents:
diff changeset
   733
a27a279701f8 Initial revision
claus
parents:
diff changeset
   734
    "ObjectMemory applicationImageOn:'draw.img' for:DrawTool selector:#start"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   735
    "ObjectMemory applicationImageOn:'pm.img' for:PMSimulator selector:#start"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   736
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   737
a27a279701f8 Initial revision
claus
parents:
diff changeset
   738
minimumApplicationImageOn:aFileName for:startupClass selector:startupSelector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   739
    "create a snapshot which will come up without any views 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   740
     but starts up an application by sending startupClass the startupSelector.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   741
     All unneeded info is stripped from the saved image."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   742
a27a279701f8 Initial revision
claus
parents:
diff changeset
   743
    "create a temporary image, for continuation"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   744
    self snapShotOn:'temp.img'.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   745
a27a279701f8 Initial revision
claus
parents:
diff changeset
   746
    Display knownViews do:[:aView |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   747
        aView notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   748
            aView superView isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   749
                aView destroy
a27a279701f8 Initial revision
claus
parents:
diff changeset
   750
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   751
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   752
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   753
a27a279701f8 Initial revision
claus
parents:
diff changeset
   754
    self stripImage.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   755
a27a279701f8 Initial revision
claus
parents:
diff changeset
   756
    self applicationImageOn:aFileName for:startupClass selector:startupSelector.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   757
a27a279701f8 Initial revision
claus
parents:
diff changeset
   758
    "continue in old image"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   759
a27a279701f8 Initial revision
claus
parents:
diff changeset
   760
    OperatingSystem exec:(Arguments at:1)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   761
           withArguments:#('smalltalk' '-i' 'temp.img') , (Arguments copyFrom:2)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   762
a27a279701f8 Initial revision
claus
parents:
diff changeset
   763
    "ObjectMemory minimumApplicationImageOn:'clock1.img' for:Clock selector:#start"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   764
    "ObjectMemory applicationImageOn:'clock2.img' for:Clock selector:#start"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   765
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   766
a27a279701f8 Initial revision
claus
parents:
diff changeset
   767
stripImage
a27a279701f8 Initial revision
claus
parents:
diff changeset
   768
    "remove all unneeded stuff from the image - much more is possible here"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   769
2
claus
parents: 1
diff changeset
   770
    "remove all class comments & source"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   771
2
claus
parents: 1
diff changeset
   772
    Smalltalk allBehaviorsDo:[:aClass |
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   773
        aClass setComment:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   774
        aClass methodDictionary do:[:aMethod |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   775
            aMethod source:''.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   776
            aMethod category:#none 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   777
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   778
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   779
    self garbageCollect
a27a279701f8 Initial revision
claus
parents:
diff changeset
   780
! !