Skip to content

Commit

Permalink
Update DDR code to comply with arrays not having NULL pointers
Browse files Browse the repository at this point in the history
Discontiguous arraylet do not have NULL arrayoids anymore;
theregore DDR was updated to reflect this change.

Related to: #9373
Fixes: #9971

Signed-off-by: Igor Braga <higorb1@gmail.com>
  • Loading branch information
bragaigor committed Jun 24, 2020
1 parent 8077864 commit 6548260
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 7 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 1991, 2019 IBM Corp. and others
* Copyright (c) 1991, 2020 IBM Corp. and others
*
* This program and the accompanying materials are made available under
* the terms of the Eclipse Public License 2.0 which accompanies this
Expand Down Expand Up @@ -45,8 +45,11 @@ public static GCArrayObjectModel from() throws CorruptDataException
AlgorithmVersion version = AlgorithmVersion.getVersionOf(AlgorithmVersion.GC_ARRAYLET_OBJECT_MODEL_VERSION);
switch (version.getAlgorithmVersion()) {
// Add case statements to handle new algorithm versions
default:
case 0:
case 1:
return new GCArrayletObjectModel_V1();
default:
return new GCArrayletObjectModel_V2();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
import com.ibm.j9ddr.vm29.types.U32;
import com.ibm.j9ddr.vm29.types.UDATA;

public abstract class GCArrayletObjectModelBase_V1 extends GCArrayObjectModel
public abstract class GCArrayletObjectModelBase extends GCArrayObjectModel
{
protected GC_ArrayletObjectModelPointer arrayletObjectModel;
protected VoidPointer arrayletRangeBase;
Expand All @@ -54,7 +54,7 @@ public abstract class GCArrayletObjectModelBase_V1 extends GCArrayObjectModel
protected UDATA arrayletLeafLogSize;
protected UDATA arrayletLeafSizeMask;

public GCArrayletObjectModelBase_V1() throws CorruptDataException
public GCArrayletObjectModelBase() throws CorruptDataException
{
arrayletObjectModel = GC_ArrayletObjectModelPointer.cast(GCBase.getExtensions().indexableObjectModel());
arrayletRangeBase = arrayletObjectModel._arrayletRangeBase();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 1991, 2018 IBM Corp. and others
* Copyright (c) 1991, 2020 IBM Corp. and others
*
* This program and the accompanying materials are made available under
* the terms of the Eclipse Public License 2.0 which accompanies this
Expand Down Expand Up @@ -28,7 +28,7 @@
import com.ibm.j9ddr.vm29.pointer.generated.J9IndexableObjectPointer;
import com.ibm.j9ddr.vm29.types.UDATA;

class GCArrayletObjectModel_V1 extends GCArrayletObjectModelBase_V1
class GCArrayletObjectModel_V1 extends GCArrayletObjectModelBase
{

public GCArrayletObjectModel_V1() throws CorruptDataException
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*******************************************************************************
* Copyright (c) 1991, 2020 IBM Corp. and others
*
* This program and the accompanying materials are made available under
* the terms of the Eclipse Public License 2.0 which accompanies this
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
* or the Apache License, Version 2.0 which accompanies this distribution and
* is available at https://www.apache.org/licenses/LICENSE-2.0.
*
* This Source Code may also be made available under the following
* Secondary Licenses when the conditions for such availability set
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
* General Public License, version 2 with the GNU Classpath
* Exception [1] and GNU General Public License, version 2 with the
* OpenJDK Assembly Exception [2].
*
* [1] https://www.gnu.org/software/classpath/license.html
* [2] http://openjdk.java.net/legal/assembly-exception.html
*
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception
*******************************************************************************/
package com.ibm.j9ddr.vm29.j9.gc;

import com.ibm.j9ddr.CorruptDataException;
import com.ibm.j9ddr.vm29.pointer.generated.J9IndexableObjectPointer;
import com.ibm.j9ddr.vm29.types.UDATA;

class GCArrayletObjectModel_V2 extends GCArrayletObjectModelBase
{

public GCArrayletObjectModel_V2() throws CorruptDataException
{
}

@Override
public UDATA getSizeInBytesWithHeader(J9IndexableObjectPointer array) throws CorruptDataException
{
return super.getSpineSize(array);
}

/**
* Return the total number of arraylets for an indexable object with a size of dataInSizeByte, including a (possibly empty) leaf in the spine.
* @param dataSizeInBytes size of an array in bytes (not elements)
* @return the number of arraylets used for an array of dataSizeInBytes bytes
*/
@Override
protected UDATA numArraylets(UDATA dataSizeInBytes) throws CorruptDataException
{
UDATA numberOfArraylets = new UDATA(1);
if (!UDATA.MAX.eq(arrayletLeafSize)) {
/* CMVC 135307 : following logic for calculating the leaf count would not overflow dataSizeInBytes.
* the assumption is leaf size is order of 2. It's identical to:
* if (dataSizeInBytes % leafSize) is 0
* leaf count = dataSizeInBytes >> leafLogSize
* else
* leaf count = (dataSizeInBytes >> leafLogSize) + 1
*/
numberOfArraylets = dataSizeInBytes.rightShift(arrayletLeafLogSize).add(dataSizeInBytes.bitAnd(arrayletLeafSizeMask).add(arrayletLeafSizeMask).rightShift(arrayletLeafLogSize));
}
return numberOfArraylets;
}

@Override
public UDATA getTotalFootprintInBytesWithHeader(J9IndexableObjectPointer arrayPtr) throws CorruptDataException {
UDATA spineSize = getSizeInBytesWithHeader(arrayPtr);
UDATA externalArrayletSize = externalArrayletsSize(arrayPtr);
UDATA totalFootprint = spineSize.add(externalArrayletSize);
return totalFootprint;
}
}
2 changes: 1 addition & 1 deletion runtime/ddr/algorithm_versions.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
#define VM_LINE_NUMBER_TABLE_VERSION 1
#define VM_LOCAL_VARIABLE_TABLE_VERSION 1
#define VM_CAN_ACCESS_LOCALS_VERSION 1
#define ALG_GC_ARRAYLET_OBJECT_MODEL_VERSION 1
#define ALG_GC_ARRAYLET_OBJECT_MODEL_VERSION 2
#define VM_HASHTABLE_VERSION 1
#define ALG_VM_J9CLASS_VERSION 1
#define ALG_GC_OBJECT_HEAP_ITERATOR_SEGREGATED_ORDERED_LIST_VERSION 1
Expand Down

0 comments on commit 6548260

Please sign in to comment.