Skip to content

Commit

Permalink
Update NUMA_NODE_RELATIONSHIP to new variable size structure
Browse files Browse the repository at this point in the history
  • Loading branch information
dbwiddis committed Aug 8, 2021
1 parent 7027e33 commit 12dc9a3
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 8 deletions.
3 changes: 3 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ Features
* [#1352](https://github.com/java-native-access/jna/pull/1352): Add `BringWindowToTop` to `c.s.j.p.win32.User32` - [@kahgoh](https://github.com/kahgoh).
* [#1354](https://github.com/java-native-access/jna/pull/1352): Add `GetParent` to `c.s.j.p.win32.User32` - [@kahgoh](https://github.com/kahgoh).
* [#1360](https://github.com/java-native-access/jna/issues/1360): Add `CommandLineToArgvW` to `c.s.j.p.win32.Shell32` and corresponding util in `c.s.j.p.win32.Shell32Util` - [@dbwiddis](https://github.com/dbwiddis).
* [#1363](https://github.com/java-native-access/jna/issues/1363): Update `NUMA_NODE_RELATIONSHIP` in `c.s.j.p.win32.WinNT` to new version of the structure - [@dbwiddis](https://github.com/dbwiddis).

Update NUMA_NODE_RELATIONSHIP

Bug Fixes
---------
Expand Down
82 changes: 74 additions & 8 deletions contrib/platform/src/com/sun/jna/platform/win32/WinNT.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@
*/
package com.sun.jna.platform.win32;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.sun.jna.FromNativeContext;
import com.sun.jna.IntegerType;
import com.sun.jna.Memory;
Expand Down Expand Up @@ -3018,9 +3023,12 @@ public static SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX fromPointer(Pointer memory
switch (relationship) {
case LOGICAL_PROCESSOR_RELATIONSHIP.RelationProcessorCore:
case LOGICAL_PROCESSOR_RELATIONSHIP.RelationProcessorPackage:
case LOGICAL_PROCESSOR_RELATIONSHIP.RelationProcessorDie:
case LOGICAL_PROCESSOR_RELATIONSHIP.RelationProcessorModule:
result = new PROCESSOR_RELATIONSHIP(memory);
break;
case LOGICAL_PROCESSOR_RELATIONSHIP.RelationNumaNode:
case LOGICAL_PROCESSOR_RELATIONSHIP.RelationNumaNodeEx:
result = new NUMA_NODE_RELATIONSHIP(memory);
break;
case LOGICAL_PROCESSOR_RELATIONSHIP.RelationCache:
Expand Down Expand Up @@ -3126,33 +3134,89 @@ public void read() {
/**
* Represents information about a NUMA node in a processor group.
*/
@FieldOrder({ "nodeNumber", "reserved", "groupMask" })
@FieldOrder({ "nodeNumber", "reserved", "groupCount", "groupMask", "groupMasks" })
public static class NUMA_NODE_RELATIONSHIP extends SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX {

/**
* Identifies the NUMA node. Valid values are {@code 0} to the highest
* NUMA node number inclusive. A non-NUMA multiprocessor system will
* report that all processors belong to one NUMA node.
* Identifies the NUMA node. Valid values are {@code 0} to the highest NUMA node
* number inclusive. A non-NUMA multiprocessor system will report that all
* processors belong to one NUMA node.
*/
public int nodeNumber;

/**
* This member is reserved.
*/
public byte[] reserved = new byte[20];
public byte[] reserved = new byte[18];

/**
* The number of groups included in the GroupMasks array. This field was
* introduced in TBD Release Iron. On earlier versions, this value is always 0.
*/
public short groupCount;

/**
* A {@link GROUP_AFFINITY} structure that specifies a group number and
* processor affinity within the group.
* processor affinity within the group. This member is only relevant if
* {@code groupCount} is 0.
*/
public GROUP_AFFINITY groupMask;

/**
* An array of {@link GROUP_AFFINITY} structures that specifies a group number
* and processor affinity within the group. This member is only relevant if
* {@code groupCount} is 1 or greater.
*/
public GROUP_AFFINITY[] groupMasks = new GROUP_AFFINITY[1];

public NUMA_NODE_RELATIONSHIP() {
}

public NUMA_NODE_RELATIONSHIP(Pointer memory) {
super(memory);
}

/*
* Since the groupMasks array always has at least one element we copy it to the
* groupMask field for backwards compatibility in the case groupCount is 0 or 1.
* Otherwise we resize the array.
*/
@Override
public void read() {
readField("groupCount");
if (groupCount > 1) {
groupMasks = new GROUP_AFFINITY[groupCount];
}
super.read();
// Copy first value from array to older version of structure
groupMask = groupMasks[0];
}

/*
* getFieldList and getFieldOrder are overridden because there are two versions
* of this structure. We will always populate the groupMasks field in the newer
* version, but we will copy groupMasks[0] to the groupMask field elsewhere for
* backwards compatibility.
*/
@Override
protected List<Field> getFieldList() {
List<Field> fields = new ArrayList<Field>(super.getFieldList());
Iterator<Field> fieldIterator = fields.iterator();
while (fieldIterator.hasNext()) {
Field field = fieldIterator.next();
if ("groupMask".equals(field.getName())) {
fieldIterator.remove();
}
}
return fields;
}

@Override
protected List<String> getFieldOrder() {
List<String> fieldOrder = new ArrayList<String>(super.getFieldOrder());
fieldOrder.remove("groupMask");
return fieldOrder;
}
}

/**
Expand Down Expand Up @@ -3387,8 +3451,10 @@ public interface LOGICAL_PROCESSOR_RELATIONSHIP {

/**
* <p>
* Upcoming value of this enum added for forward compatibility. Documentation
* will be added when available.
* Introduced in TBD - Release Iron. Requests that the full affinity be
* returned. Unlike the other relation types, RelationNumaNodeEx is not used on
* input. It is simply a request for RelationNumaNode with full group
* information.
* </p>
*/
int RelationNumaNodeEx = 6;
Expand Down

0 comments on commit 12dc9a3

Please sign in to comment.