src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1HeapRegionTable.java
author ysuenaga
Wed, 31 Jan 2018 11:35:42 +0100
changeset 48820 9a411a9a17f0
parent 47619 74f5b6c267e3
permissions -rw-r--r--
8194249: SA: G1HeapRegionTable#getByAddress() returns incorrect HeapRegion Summary: Fix conversion of addresses to HeapRegions. Reviewed-by: jgeorge, tschatzl
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20731
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
     1
/*
48820
9a411a9a17f0 8194249: SA: G1HeapRegionTable#getByAddress() returns incorrect HeapRegion
ysuenaga
parents: 47619
diff changeset
     2
 * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
20731
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
     4
 *
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
     7
 * published by the Free Software Foundation.
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
     8
 *
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    13
 * accompanied this code).
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    14
 *
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    18
 *
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    21
 * questions.
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    22
 *
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    23
 */
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    24
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 26157
diff changeset
    25
package sun.jvm.hotspot.gc.g1;
20731
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    26
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    27
import java.util.Iterator;
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    28
import java.util.Observable;
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    29
import java.util.Observer;
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    30
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    31
import sun.jvm.hotspot.debugger.Address;
47602
d4380ee1cbe9 8187403: [Unknown generation] is shown in Stack Memory on HSDB
ysuenaga
parents: 47216
diff changeset
    32
import sun.jvm.hotspot.debugger.OopHandle;
20731
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    33
import sun.jvm.hotspot.runtime.VM;
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    34
import sun.jvm.hotspot.runtime.VMObject;
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    35
import sun.jvm.hotspot.runtime.VMObjectFactory;
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    36
import sun.jvm.hotspot.types.AddressField;
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    37
import sun.jvm.hotspot.types.CIntegerField;
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    38
import sun.jvm.hotspot.types.Type;
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    39
import sun.jvm.hotspot.types.TypeDataBase;
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    40
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    41
// Mirror class for G1HeapRegionTable. It's essentially an index -> HeapRegion map.
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    42
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    43
public class G1HeapRegionTable extends VMObject {
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    44
    // HeapRegion** _base;
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    45
    static private AddressField baseField;
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    46
    // uint _length;
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    47
    static private CIntegerField lengthField;
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    48
    // HeapRegion** _biased_base
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    49
    static private AddressField biasedBaseField;
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    50
    // size_t _bias
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    51
    static private CIntegerField biasField;
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    52
    // uint _shift_by
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    53
    static private CIntegerField shiftByField;
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    54
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    55
    static {
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    56
        VM.registerVMInitializedObserver(new Observer() {
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    57
                public void update(Observable o, Object data) {
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    58
                    initialize(VM.getVM().getTypeDataBase());
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    59
                }
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    60
            });
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    61
    }
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    62
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    63
    static private synchronized void initialize(TypeDataBase db) {
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    64
        Type type = db.lookupType("G1HeapRegionTable");
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    65
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    66
        baseField = type.getAddressField("_base");
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    67
        lengthField = type.getCIntegerField("_length");
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    68
        biasedBaseField = type.getAddressField("_biased_base");
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    69
        biasField = type.getCIntegerField("_bias");
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    70
        shiftByField = type.getCIntegerField("_shift_by");
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    71
    }
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    72
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    73
    private HeapRegion at(long index) {
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    74
        Address arrayAddr = baseField.getValue(addr);
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    75
        // Offset of &_base[index]
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    76
        long offset = index * VM.getVM().getAddressSize();
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    77
        Address regionAddr = arrayAddr.getAddressAt(offset);
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    78
        return (HeapRegion) VMObjectFactory.newObject(HeapRegion.class,
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    79
                                                      regionAddr);
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    80
    }
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    81
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    82
    public long length() {
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    83
        return lengthField.getValue(addr);
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    84
    }
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    85
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    86
    public long bias() {
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    87
        return biasField.getValue(addr);
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    88
    }
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    89
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    90
    public long shiftBy() {
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    91
        return shiftByField.getValue(addr);
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    92
    }
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    93
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    94
    private class HeapRegionIterator implements Iterator<HeapRegion> {
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    95
        private long index;
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    96
        private long length;
26157
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
    97
        private HeapRegion next;
20731
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
    98
26157
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
    99
        public HeapRegion positionToNext() {
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
   100
          HeapRegion result = next;
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
   101
          while (index < length && at(index) == null) {
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
   102
            index++;
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
   103
          }
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
   104
          if (index < length) {
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
   105
            next = at(index);
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
   106
            index++; // restart search at next element
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
   107
          } else {
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
   108
            next = null;
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
   109
          }
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
   110
          return result;
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
   111
        }
20731
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
   112
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
   113
        @Override
26157
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
   114
        public boolean hasNext() { return next != null;     }
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
   115
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
   116
        @Override
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
   117
        public HeapRegion next() { return positionToNext(); }
20731
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
   118
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
   119
        @Override
26157
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
   120
        public void remove()     { /* not supported */      }
20731
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
   121
26157
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
   122
        HeapRegionIterator(long totalLength) {
20731
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
   123
            index = 0;
26157
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
   124
            length = totalLength;
70eddb655686 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 21918
diff changeset
   125
            positionToNext();
20731
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
   126
        }
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
   127
    }
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
   128
21918
c1c826e0e2ec 8029329: tmtools tests fail with NPE (in the tool) when run with G1 and FlightRecorder
sjohanss
parents: 20731
diff changeset
   129
    public Iterator<HeapRegion> heapRegionIterator(long committedLength) {
c1c826e0e2ec 8029329: tmtools tests fail with NPE (in the tool) when run with G1 and FlightRecorder
sjohanss
parents: 20731
diff changeset
   130
        return new HeapRegionIterator(committedLength);
20731
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
   131
    }
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
   132
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
   133
    public G1HeapRegionTable(Address addr) {
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
   134
        super(addr);
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
   135
    }
47602
d4380ee1cbe9 8187403: [Unknown generation] is shown in Stack Memory on HSDB
ysuenaga
parents: 47216
diff changeset
   136
48820
9a411a9a17f0 8194249: SA: G1HeapRegionTable#getByAddress() returns incorrect HeapRegion
ysuenaga
parents: 47619
diff changeset
   137
    public HeapRegion getByAddress(Address target) {
9a411a9a17f0 8194249: SA: G1HeapRegionTable#getByAddress() returns incorrect HeapRegion
ysuenaga
parents: 47619
diff changeset
   138
        Address arrayAddr = biasedBaseField.getValue(addr);
9a411a9a17f0 8194249: SA: G1HeapRegionTable#getByAddress() returns incorrect HeapRegion
ysuenaga
parents: 47619
diff changeset
   139
        long biasedIndex = target.asLongValue() >>> shiftBy();
47619
74f5b6c267e3 8189069: regression after push of 8187403: "AssertionFailure: addr should be OopHandle"
ysuenaga
parents: 47602
diff changeset
   140
        long offset = biasedIndex * HeapRegion.getPointerSize();
48820
9a411a9a17f0 8194249: SA: G1HeapRegionTable#getByAddress() returns incorrect HeapRegion
ysuenaga
parents: 47619
diff changeset
   141
        Address regionAddr = arrayAddr.getAddressAt(offset);
9a411a9a17f0 8194249: SA: G1HeapRegionTable#getByAddress() returns incorrect HeapRegion
ysuenaga
parents: 47619
diff changeset
   142
        return (HeapRegion)VMObjectFactory.newObject(HeapRegion.class, regionAddr);
47602
d4380ee1cbe9 8187403: [Unknown generation] is shown in Stack Memory on HSDB
ysuenaga
parents: 47216
diff changeset
   143
    }
20731
079142abff59 8025925: jmap fails with "field _length not found in type HeapRegionSeq"
tschatzl
parents:
diff changeset
   144
}