ObjMem.st
author claus
Fri, 16 Jul 1993 11:39:45 +0200
changeset 1 a27a279701f8
child 2 6526dde5f3ac
permissions -rw-r--r--
Initial revision
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1992-93 by Claus Gittinger
a27a279701f8 Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
Object subclass:#ObjectMemory
a27a279701f8 Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    15
       classVariableNames:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    16
       poolDictionaries:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    17
       category:'System-Support'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
ObjectMemory comment:'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
a27a279701f8 Initial revision
claus
parents:
diff changeset
    22
COPYRIGHT (c) 1992 -93 by Claus Gittinger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
             All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
a27a279701f8 Initial revision
claus
parents:
diff changeset
    25
This class contains access methods to the system memory -
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
in previous versions this stuff used to be in the Smalltalk class.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    27
It has been separated for better overall structure.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    28
a27a279701f8 Initial revision
claus
parents:
diff changeset
    29
%W% %E%
a27a279701f8 Initial revision
claus
parents:
diff changeset
    30
'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    31
a27a279701f8 Initial revision
claus
parents:
diff changeset
    32
!ObjectMemory class methodsFor:'cache management'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    33
a27a279701f8 Initial revision
claus
parents:
diff changeset
    34
flushInlineCachesForClass:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
    35
    "flush inlinecaches for calls to aClass"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    36
a27a279701f8 Initial revision
claus
parents:
diff changeset
    37
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
    38
    __flushInlineCachesFor(aClass);
a27a279701f8 Initial revision
claus
parents:
diff changeset
    39
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
    40
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    41
a27a279701f8 Initial revision
claus
parents:
diff changeset
    42
flushInlineCachesWithArgs:nargs
a27a279701f8 Initial revision
claus
parents:
diff changeset
    43
    "flush inlinecaches for calls with nargs arguments"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    44
a27a279701f8 Initial revision
claus
parents:
diff changeset
    45
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
    46
    __flushInlineCaches(_intVal(nargs));
a27a279701f8 Initial revision
claus
parents:
diff changeset
    47
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
    48
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    49
a27a279701f8 Initial revision
claus
parents:
diff changeset
    50
flushInlineCachesFor:aClass withArgs:nargs
a27a279701f8 Initial revision
claus
parents:
diff changeset
    51
    "flush inlinecaches for calls to aClass with nargs arguments"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    52
a27a279701f8 Initial revision
claus
parents:
diff changeset
    53
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
    54
    __flushInlineCachesForAndNargs(aClass, _intVal(nargs));
a27a279701f8 Initial revision
claus
parents:
diff changeset
    55
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
    56
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    57
a27a279701f8 Initial revision
claus
parents:
diff changeset
    58
flushInlineCaches
a27a279701f8 Initial revision
claus
parents:
diff changeset
    59
    "flush all inlinecaches"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    60
a27a279701f8 Initial revision
claus
parents:
diff changeset
    61
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
    62
    __flushAllInlineCaches();
a27a279701f8 Initial revision
claus
parents:
diff changeset
    63
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
    64
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    65
a27a279701f8 Initial revision
claus
parents:
diff changeset
    66
flushMethodCacheFor:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
    67
    "flush the method cache for sends to aClass"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    68
a27a279701f8 Initial revision
claus
parents:
diff changeset
    69
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
    70
    __flushMethodCacheFor(aClass);
a27a279701f8 Initial revision
claus
parents:
diff changeset
    71
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
    72
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    73
a27a279701f8 Initial revision
claus
parents:
diff changeset
    74
flushMethodCache
a27a279701f8 Initial revision
claus
parents:
diff changeset
    75
    "flush the method cache"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    76
a27a279701f8 Initial revision
claus
parents:
diff changeset
    77
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
    78
    __flushMethodCache();
a27a279701f8 Initial revision
claus
parents:
diff changeset
    79
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
    80
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    81
a27a279701f8 Initial revision
claus
parents:
diff changeset
    82
flushCaches
a27a279701f8 Initial revision
claus
parents:
diff changeset
    83
    "flush method and inline caches"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    84
a27a279701f8 Initial revision
claus
parents:
diff changeset
    85
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
    86
    __flushMethodCache();
a27a279701f8 Initial revision
claus
parents:
diff changeset
    87
    __flushAllInlineCaches();
a27a279701f8 Initial revision
claus
parents:
diff changeset
    88
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
    89
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
    90
a27a279701f8 Initial revision
claus
parents:
diff changeset
    91
!ObjectMemory class methodsFor:'enumeration'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    92
a27a279701f8 Initial revision
claus
parents:
diff changeset
    93
allObjectsDo:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
    94
    "evaluate the argument, aBlock for all objects in the system"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    95
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
    96
#ifdef THIS_CONTEXT
a27a279701f8 Initial revision
claus
parents:
diff changeset
    97
    __allObjectsDo(&aBlock);
a27a279701f8 Initial revision
claus
parents:
diff changeset
    98
#else
a27a279701f8 Initial revision
claus
parents:
diff changeset
    99
    __allObjectsDo(&aBlock, __context);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   100
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
   101
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   102
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   103
a27a279701f8 Initial revision
claus
parents:
diff changeset
   104
!ObjectMemory class methodsFor:'queries'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   105
a27a279701f8 Initial revision
claus
parents:
diff changeset
   106
newSpaceUsed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   107
    "return the number of bytes allocated for new objects"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   108
a27a279701f8 Initial revision
claus
parents:
diff changeset
   109
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   110
    RETURN ( _MKSMALLINT(__newSpaceUsed()) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   111
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   112
    "ObjectMemory newSpaceUsed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   113
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   114
a27a279701f8 Initial revision
claus
parents:
diff changeset
   115
oldSpaceUsed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   116
    "return the number of bytes allocated for old objects"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   117
a27a279701f8 Initial revision
claus
parents:
diff changeset
   118
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   119
    RETURN ( _MKSMALLINT(__oldSpaceUsed()) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   120
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   121
    "ObjectMemory oldSpaceUsed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   122
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   123
a27a279701f8 Initial revision
claus
parents:
diff changeset
   124
bytesUsed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   125
    "return the number of bytes allocated for objects -
a27a279701f8 Initial revision
claus
parents:
diff changeset
   126
     this number is not exact, since some objects may be dead"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   127
a27a279701f8 Initial revision
claus
parents:
diff changeset
   128
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
   129
    RETURN ( _MKSMALLINT(__oldSpaceUsed() + __newSpaceUsed()) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   130
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   131
    "ObjectMemory bytesUsed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   132
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   133
a27a279701f8 Initial revision
claus
parents:
diff changeset
   134
numberOfObjects
a27a279701f8 Initial revision
claus
parents:
diff changeset
   135
    "return the number of objects in the system"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   136
a27a279701f8 Initial revision
claus
parents:
diff changeset
   137
    |tally|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   138
a27a279701f8 Initial revision
claus
parents:
diff changeset
   139
    tally := 0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   140
    self allObjectsDo:[:obj | tally := tally + 1].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   141
    ^ tally
a27a279701f8 Initial revision
claus
parents:
diff changeset
   142
a27a279701f8 Initial revision
claus
parents:
diff changeset
   143
    "ObjectMemory numberOfObjects"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   144
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   145
a27a279701f8 Initial revision
claus
parents:
diff changeset
   146
printReferences:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   147
    "debugging: print referents to anObject"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   148
a27a279701f8 Initial revision
claus
parents:
diff changeset
   149
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   150
    _printRefChain(__context, anObject);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   151
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   152
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   153
a27a279701f8 Initial revision
claus
parents:
diff changeset
   154
whoReferences:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   155
    "return a collection of objects referencing the argument, anObject"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   156
a27a279701f8 Initial revision
claus
parents:
diff changeset
   157
    |aCollection|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   158
a27a279701f8 Initial revision
claus
parents:
diff changeset
   159
    aCollection := IdentitySet new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   160
    self allObjectsDo:[:o |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   161
        (o references:anObject) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   162
            aCollection add:o
a27a279701f8 Initial revision
claus
parents:
diff changeset
   163
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   164
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   165
    (aCollection size == 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   166
        "actually this cannot happen - there is always one"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   167
        ^ nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   168
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   169
    ^ aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
   170
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   171
a27a279701f8 Initial revision
claus
parents:
diff changeset
   172
!ObjectMemory class methodsFor:'garbage collector control'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   173
a27a279701f8 Initial revision
claus
parents:
diff changeset
   174
garbageCollect
a27a279701f8 Initial revision
claus
parents:
diff changeset
   175
    "search for and free garbage in the oldSpace
a27a279701f8 Initial revision
claus
parents:
diff changeset
   176
     (newSpace is cleaned automatically)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   177
     - can take a long time if paging is involved
a27a279701f8 Initial revision
claus
parents:
diff changeset
   178
     - when no paging is involved, its faster than I thought :-)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   179
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   180
    __garbageCollect(__context);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   181
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   182
a27a279701f8 Initial revision
claus
parents:
diff changeset
   183
    "ObjectMemory garbageCollect"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   184
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   185
a27a279701f8 Initial revision
claus
parents:
diff changeset
   186
scavenge
a27a279701f8 Initial revision
claus
parents:
diff changeset
   187
    "for debugging only - collect newspace stuff"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   188
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   189
    nonTenuringScavenge(__context);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   190
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   191
a27a279701f8 Initial revision
claus
parents:
diff changeset
   192
    "ObjectMemory scavenge"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   193
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   194
a27a279701f8 Initial revision
claus
parents:
diff changeset
   195
tenure
a27a279701f8 Initial revision
claus
parents:
diff changeset
   196
    "forcae all new stuff into old-space"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   197
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   198
    tenure(__context);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   199
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   200
a27a279701f8 Initial revision
claus
parents:
diff changeset
   201
    "ObjectMemory tenure"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   202
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   203
a27a279701f8 Initial revision
claus
parents:
diff changeset
   204
markAndSweep
a27a279701f8 Initial revision
claus
parents:
diff changeset
   205
    "mark/sweep garbage collector"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   206
a27a279701f8 Initial revision
claus
parents:
diff changeset
   207
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   208
    markAndSweep(__context);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   209
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   210
a27a279701f8 Initial revision
claus
parents:
diff changeset
   211
    "ObjectMemory markAndSweep"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   212
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   213
a27a279701f8 Initial revision
claus
parents:
diff changeset
   214
gcStep
a27a279701f8 Initial revision
claus
parents:
diff changeset
   215
    "one incremental garbage collect step"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   216
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   217
    incrGCstep(__context);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   218
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   219
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   220
a27a279701f8 Initial revision
claus
parents:
diff changeset
   221
turnOffGarbageCollector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   222
    "turn off garbage collector.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   223
     this method is somewhat dangerous: if collector is turned off,
a27a279701f8 Initial revision
claus
parents:
diff changeset
   224
     and too many objects are created, the system may run into trouble.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   225
     Use this only for measurement purposes or when realtime behavior
a27a279701f8 Initial revision
claus
parents:
diff changeset
   226
     is required for a limited time period. No waranty"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   227
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   228
    allocForceSpace(0);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   229
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   230
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   231
a27a279701f8 Initial revision
claus
parents:
diff changeset
   232
turnOnGarbageCollector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   233
    "turn it on again"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   234
a27a279701f8 Initial revision
claus
parents:
diff changeset
   235
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   236
    allocForceSpace(1);
a27a279701f8 Initial revision
claus
parents:
diff changeset
   237
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   238
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   239
a27a279701f8 Initial revision
claus
parents:
diff changeset
   240
!ObjectMemory class methodsFor:'system management'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   241
a27a279701f8 Initial revision
claus
parents:
diff changeset
   242
loadClassBinary:aClassName
a27a279701f8 Initial revision
claus
parents:
diff changeset
   243
    "find the object file for aClassName and -if found - load it;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   244
     this one loads precompiled object files"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   245
a27a279701f8 Initial revision
claus
parents:
diff changeset
   246
    |fName newClass upd|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   247
a27a279701f8 Initial revision
claus
parents:
diff changeset
   248
    fName := self fileNameForClass:aClassName.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   249
    fName notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   250
        upd := Class updateChanges:false.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   251
        [
a27a279701f8 Initial revision
claus
parents:
diff changeset
   252
            self loadBinary:(fName , '.o')
a27a279701f8 Initial revision
claus
parents:
diff changeset
   253
        ] valueNowOrOnUnwindDo:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   254
            Class updateChanges:upd
a27a279701f8 Initial revision
claus
parents:
diff changeset
   255
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   256
        newClass := self at:(aClassName asSymbol).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   257
        (newClass notNil and:[newClass implements:#initialize]) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   258
            newClass initialize
a27a279701f8 Initial revision
claus
parents:
diff changeset
   259
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   260
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   261
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   262
a27a279701f8 Initial revision
claus
parents:
diff changeset
   263
snapShot
a27a279701f8 Initial revision
claus
parents:
diff changeset
   264
    "create a snapshot"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   265
a27a279701f8 Initial revision
claus
parents:
diff changeset
   266
    ImageName isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   267
        ImageName := 'st.img'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   268
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   269
    self snapShotOn:ImageName
a27a279701f8 Initial revision
claus
parents:
diff changeset
   270
a27a279701f8 Initial revision
claus
parents:
diff changeset
   271
    "ObjectMemory snapShot"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   272
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   273
a27a279701f8 Initial revision
claus
parents:
diff changeset
   274
snapShotOn:aFileName
a27a279701f8 Initial revision
claus
parents:
diff changeset
   275
    "create a snapshot in the given file"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   276
a27a279701f8 Initial revision
claus
parents:
diff changeset
   277
    "give others a chance to fix things"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   278
    self changed:#save.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   279
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   280
    OBJ __snapShotOn();
a27a279701f8 Initial revision
claus
parents:
diff changeset
   281
a27a279701f8 Initial revision
claus
parents:
diff changeset
   282
    if (_isString(aFileName)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
   283
        RETURN ( __snapShotOn(__context, _stringVal(aFileName)) );
a27a279701f8 Initial revision
claus
parents:
diff changeset
   284
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
   285
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   286
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   287
    ^ self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
   288
a27a279701f8 Initial revision
claus
parents:
diff changeset
   289
    "ObjectMemory snapShotOn:'myimage.img'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   290
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   291
a27a279701f8 Initial revision
claus
parents:
diff changeset
   292
applicationImageOn:aFileName for:startupClass selector:startupSelector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   293
    "create a snapshot which will come up without any views 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   294
     but starts up an application by sending startupClass the startupSelector"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   295
a27a279701f8 Initial revision
claus
parents:
diff changeset
   296
    |viewsKnown savedIdleBlocks savedTimeoutBlocks savedTranscript|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   297
a27a279701f8 Initial revision
claus
parents:
diff changeset
   298
    viewsKnown := Display knownViews.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   299
    savedIdleBlocks := Display idleBlocks.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   300
    savedTimeoutBlocks := Display timeOutBlocks.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   301
    savedTranscript := Transcript.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   302
a27a279701f8 Initial revision
claus
parents:
diff changeset
   303
    "a kludge: save image with modified knownViews ..."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   304
a27a279701f8 Initial revision
claus
parents:
diff changeset
   305
    Display knownViews:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   306
    Display idleBlocks:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   307
    Display timeOutBlocks:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   308
    Transcript := Stderr.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   309
    StartupClass := startupClass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   310
    StartupSelector := startupSelector.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   311
a27a279701f8 Initial revision
claus
parents:
diff changeset
   312
    self snapShotOn:aFileName.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   313
a27a279701f8 Initial revision
claus
parents:
diff changeset
   314
    StartupClass := nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   315
    StartupSelector := nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   316
    Transcript := savedTranscript.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   317
    Display knownViews:viewsKnown.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   318
    Display idleBlocks:savedIdleBlocks.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   319
    Display timeOutBlocks:savedTimeoutBlocks
a27a279701f8 Initial revision
claus
parents:
diff changeset
   320
a27a279701f8 Initial revision
claus
parents:
diff changeset
   321
    "ObjectMemory applicationImageOn:'draw.img' for:DrawTool selector:#start"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   322
    "ObjectMemory applicationImageOn:'pm.img' for:PMSimulator selector:#start"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   323
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   324
a27a279701f8 Initial revision
claus
parents:
diff changeset
   325
minimumApplicationImageOn:aFileName for:startupClass selector:startupSelector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   326
    "create a snapshot which will come up without any views 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   327
     but starts up an application by sending startupClass the startupSelector.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   328
     All unneeded info is stripped from the saved image."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   329
a27a279701f8 Initial revision
claus
parents:
diff changeset
   330
    "create a temporary image, for continuation"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   331
    self snapShotOn:'temp.img'.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   332
a27a279701f8 Initial revision
claus
parents:
diff changeset
   333
    Display knownViews do:[:aView |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   334
        aView notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   335
            aView superView isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   336
                aView destroy
a27a279701f8 Initial revision
claus
parents:
diff changeset
   337
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   338
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   339
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   340
a27a279701f8 Initial revision
claus
parents:
diff changeset
   341
    self stripImage.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   342
a27a279701f8 Initial revision
claus
parents:
diff changeset
   343
    self applicationImageOn:aFileName for:startupClass selector:startupSelector.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   344
a27a279701f8 Initial revision
claus
parents:
diff changeset
   345
    "continue in old image"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   346
a27a279701f8 Initial revision
claus
parents:
diff changeset
   347
    OperatingSystem exec:(Arguments at:1)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   348
           withArguments:#('smalltalk' '-i' 'temp.img') , (Arguments copyFrom:2)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   349
a27a279701f8 Initial revision
claus
parents:
diff changeset
   350
    "ObjectMemory minimumApplicationImageOn:'clock1.img' for:Clock selector:#start"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   351
    "ObjectMemory applicationImageOn:'clock2.img' for:Clock selector:#start"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   352
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   353
a27a279701f8 Initial revision
claus
parents:
diff changeset
   354
stripImage
a27a279701f8 Initial revision
claus
parents:
diff changeset
   355
    "remove all unneeded stuff from the image - much more is possible here"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   356
a27a279701f8 Initial revision
claus
parents:
diff changeset
   357
    "remove all class comments"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   358
a27a279701f8 Initial revision
claus
parents:
diff changeset
   359
    Smalltalk allClassesDo:[:aClass |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   360
        aClass setComment:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   361
        aClass methodDictionary do:[:aMethod |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   362
            aMethod source:''.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   363
            aMethod category:#none 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   364
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   365
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   366
    self garbageCollect
a27a279701f8 Initial revision
claus
parents:
diff changeset
   367
! !