diff --git a/contrib/platform/src/com/sun/jna/platform/win32/WinNT.java b/contrib/platform/src/com/sun/jna/platform/win32/WinNT.java index ba65d57dc9..ff75fcdaf5 100644 --- a/contrib/platform/src/com/sun/jna/platform/win32/WinNT.java +++ b/contrib/platform/src/com/sun/jna/platform/win32/WinNT.java @@ -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; @@ -3126,33 +3131,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 getFieldList() { + List fields = new ArrayList(super.getFieldList()); + Iterator fieldIterator = fields.iterator(); + while (fieldIterator.hasNext()) { + Field field = fieldIterator.next(); + if ("groupMask".equals(field.getName())) { + fieldIterator.remove(); + } + } + return fields; + } + + @Override + protected List getFieldOrder() { + List fieldOrder = new ArrayList(super.getFieldOrder()); + fieldOrder.remove("groupMask"); + return fieldOrder; + } } /**