On Mon, 18 Dec 2023 07:49:04 GMT, David Holmes <dhol...@openjdk.org> wrote:

>> Before this patch, we always initialized the GrowableArray up to its 
>> `capacity`, and not just up to `length`. This is problematic for a few 
>> reasons:
>> 
>> - It is not expected. `std::vector` also only initializes the elements up to 
>> its size, and not to capacity.
>> - It requires a default-constructor for the element type. And the 
>> default-constructor is then used to fill in the elements between length and 
>> capacity. If the elements do any allocation themselves, then this is a waste 
>> of resources.
>> - The implementation also required the copy-assignment-operator for the 
>> element type. This is a lesser restriction. But the copy-assignment-operator 
>> was used in cases like `append` (where placement copy-construct would be 
>> expected), and not just in true assignment kinds of cases like `at_put`.
>> 
>> For this reason, I reworked a lot of the methods to ensure that only the 
>> "slots" up to `length` are ever initialized, and the space between `length` 
>> and `capacity` is always garbage.
>> 
>> -----
>> 
>> Also, before this patch, one can CHeap allocate both with `GrowableArray` 
>> and `GrowableArrayCHeap`. This is unnecessary. It required more complex 
>> verification in `GrowableArray` to deal with all cases. And 
>> `GrowableArrayCHeap` is already explicitly a smaller object, and should 
>> hence be preferred. Hence I changed all CHeap allocating cases of 
>> `GrowableArray` to `GrowableArrayCHeap`. This also allows for a clear 
>> separation:
>> - `GrowableArray` only deals with arena / resource area allocation. These 
>> are arrays that are regularly abandoned at the end of their use, rather than 
>> deleted or even cleared.
>> - `GrowableArrayCHeap` only deals with CHeap allocated memory. We expect 
>> that the destructor for it is called eventually, either when it goes out of 
>> scope or when `delete` is explicitly called. We expect that the elements 
>> could be allocating resources internally, and hence rely on the destructors 
>> for the elements being called, which may free up those internally allocated 
>> resources.
>> 
>> Therefore, we now only allow `GrowableArrayCHeap` to have element types with 
>> non-trivial destructors, but `GrowableArray` checks that element types do 
>> not have non-trivial destructors (since it is common practice to just 
>> abandon arena / resource area allocated arrays, rather than calling the 
>> destructor or clearing the array, which also destructs all elements). This 
>> more clearly separates the two worlds: clean-up your own mess (CHeap) vs 
>> abandon your mess (arena / resource area).
>> 
>> -----
>> 
>> I al...
>
> @eme64  Is it feasible to split this up to solve each of the problems you 
> identify in stages? There is also overlap here with JDK-8319709 IIUC. Thanks.

> @dholmes-ora These are the "parts":
> 
>     1. initialize up to capacity vs length
> 
>     2. update the test to verify this (complete refactoring)
> 
>     3. remove cheap use of GrowableArray -> use GrowableArrayCHeap instead
> 
> 
> The first 2 items are inseparable, I cannot make substantial changes to many 
> GrowableArray methods without there even being tests for them. And the tests 
> would not pass before the changes for item 1, since the tests also verify 
> what elements of the array are initialized. So adding the tests first would 
> not be very feasible.
> 
> The 3rd item could maybe be split, and be done before the rest. Though it 
> would also require lots of changes to the test, which then I would have to 
> completely refactor with items 1+2 anyway.
> 
> And the items are related conceptually, that is why I would felt ok pushing 
> them together. It is all about when (item 1) and what kinds of (item 3) 
> constructors / destructors are called for the elements of the arrays, and 
> verifying that thoroughly (item 2).
> 
> Hence: feasible probably, but lots of work overhead. Do you think it is worth 
> it?

I too would prefer that it be split up.  It's very easy to miss important 
details in amongst all the mostly relatively
simple renamings.  That is, I think 3 should be separate from the other changes.

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

PR Comment: https://git.openjdk.org/jdk/pull/16918#issuecomment-1861812983

Reply via email to