Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update NUMA_NODE_RELATIONSHIP to new variable size structure #1363

Merged
merged 1 commit into from
Aug 10, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ 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 and improve support for future values of `c.s.j.p.win32.WinNT.LOGICAL_PROCESSOR_RELATIONSHIP` - [@dbwiddis](https://github.com/dbwiddis).

Bug Fixes
---------
Expand Down
83 changes: 73 additions & 10 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 @@ -3118,41 +3126,91 @@ public PROCESSOR_RELATIONSHIP(Pointer memory) {
@Override
public void read() {
readField("groupCount");
groupMask = new GROUP_AFFINITY[groupCount];
// Resize if needed
if (groupCount != groupMask.length) {
groupMask = new GROUP_AFFINITY[groupCount];
}
super.read();
}
}

/**
* Represents information about a NUMA node in a processor group.
*/
@FieldOrder({ "nodeNumber", "reserved", "groupMask" })
@FieldOrder({ "nodeNumber", "reserved", "groupCount", "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);
}

@Override
public void read() {
readField("groupCount");
// In older version of structure this is part of reserved array and has 0 value.
// Force a minimum array size of 1.
int actualGroupCount = Math.max(1, groupCount);
// Resize if needed
if (actualGroupCount != groupMasks.length) {
groupMasks = new GROUP_AFFINITY[actualGroupCount];
}
super.read();
// Copy first value from array to older version of structure for compatibility
groupMask = groupMasks[0];
}

/*
* The groupMask field is provided as a public instance variable for
* compatibility. getFieldList is overridden to remove it before comparing
* against the structure field order.
*/
@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;
}
}

/**
Expand Down Expand Up @@ -3248,7 +3306,10 @@ public GROUP_RELATIONSHIP(Pointer memory) {
@Override
public void read() {
readField("activeGroupCount");
groupInfo = new PROCESSOR_GROUP_INFO[activeGroupCount];
// Resize if needed
if (activeGroupCount != groupInfo.length) {
groupInfo = new PROCESSOR_GROUP_INFO[activeGroupCount];
}
super.read();
}
}
Expand Down Expand Up @@ -3387,8 +3448,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