RFR: 8313708: NMT: cleanup _mst_marker

Johan Sjölen jsjolen at openjdk.org
Fri Aug 11 00:35:28 UTC 2023


On Thu, 3 Aug 2023 18:44:43 GMT, Gerard Ziemski <gziemski at openjdk.org> wrote:

> While learning the NMT code I came across _mst_marker and I don't really like how it combines 16bit index and 16bit position into single 32bit mst_marker using bit sizzling.
> 
> Consequently, right now we need the following 3 APIs: build_marker(), bucket_idx_from_marker(), pos_idx_from_marker() to support this. They are really not adding any value, in my opinion, and in fact obfuscate the code.
> 
> I'd like to propose that we simplify the code and pass a struct value (as suggested by Thomas) which hides away the 2 individual fields that are implementation detail.

Yes, the packing of two values into one is perhaps a bit unnecessary, but I do prefer the struct approach. Perhaps something like:

```c++
struct alignas(uint32_t) MSTM  {
  const uint16_t _bucket_idx;
  const uint16_t _bucket_pos;
};
STATIC_ASSERT(sizeof(MSTM) == sizeof(uint32_t), "must");

(Shouldn't `MallocHeader` be a packed data structure by the way?)

>the point of the marker is to quickly resolve MST entries. But that could be done in a better way, without having to manually walk bucket chains and count buckets with O(n). For example, by storing MST entries in a linear array (they never go away, so one would not have to deal with deletion) and redefining the mst_marker to be an index into that table. That way, access to these entries would be O(1).

This would be very nice.

-------------

PR Comment: https://git.openjdk.org/jdk/pull/15145#issuecomment-1669220456


More information about the hotspot-runtime-dev mailing list