Mark,

On 9/16/15 2:11 PM, Mark Thomas wrote:
> On 16/09/2015 14:29, Christopher Schultz wrote:
>> Mark,
>>
>> On 9/15/15 5:10 PM, ma...@apache.org wrote:
>>> Author: markt
>>> Date: Tue Sep 15 21:10:30 2015
>>> New Revision: 1703290
>>>
>>> URL: http://svn.apache.org/r1703290
>>> Log:
>>> Follow-up to r1703177.
>>> Ensure that members never contains an intermediate result of the sorting 
>>> process.
>>>
>>> Modified:
>>>     tomcat/trunk/java/org/apache/catalina/tribes/membership/Membership.java
>>>
>>> Modified: 
>>> tomcat/trunk/java/org/apache/catalina/tribes/membership/Membership.java
>>> URL: 
>>> http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/tribes/membership/Membership.java?rev=1703290&r1=1703289&r2=1703290&view=diff
>>> ==============================================================================
>>> --- tomcat/trunk/java/org/apache/catalina/tribes/membership/Membership.java 
>>> (original)
>>> +++ tomcat/trunk/java/org/apache/catalina/tribes/membership/Membership.java 
>>> Tue Sep 15 21:10:30 2015
>>> @@ -66,7 +66,7 @@ public class Membership implements Clone
>>>              final HashMap<Member, MbrEntry> tmpclone = (HashMap<Member, 
>>> MbrEntry>) map.clone();
>>>              clone.map = tmpclone;
>>>              clone.members = new Member[members.length];
>>> -            System.arraycopy(members,0,clone.members,0,members.length);
>>> +            System.arraycopy(members, 0, clone.members, 0, members.length);
>>>              return clone;
>>>          }
>>>      }
>>> @@ -134,7 +134,12 @@ public class Membership implements Clone
>>>                      
>>> updateMember.setMemberAliveTime(member.getMemberAliveTime());
>>>                      updateMember.setPayload(member.getPayload());
>>>                      updateMember.setCommand(member.getCommand());
>>> -                    Arrays.sort(members, memberComparator);
>>> +                    // Re-order. Can't sort in place since a call to
>>> +                    // getMembers() may then receive an intermediate 
>>> result.
>>> +                    Member[] newMembers = new Member[members.length];
>>> +                    System.arraycopy(members, 0, newMembers, 0, 
>>> members.length);
>>> +                    Arrays.sort(newMembers, memberComparator);
>>> +                    members = newMembers;
>>
>> Consider using Member[].clone here instead of creating your own array
>> and manually calling System.arraycopy. Less code and fewer opportunities
>> to mass things up. Same performance.
> 
> I'll get this done shortly but I did want to say you should feel free to
> make this sort of change directly. I'm happy to do it as a review
> comment on one of my patches but I'm not going complain if you want to
> go ahead and do this yourself.

Okay. I mostly didn't want to step on your toes if you were doing more
refactoring. For the tribes classes, you commented recently that there
looked to be a great many improvements to be made in there... I wasn't
sure if you had some kind of refactoring in-progress.

As for System.arraycopy() -> array[].clone, I also wasn't sure if you
were doing it for a reason that wasn't obvious from the diff posted
here, or if you had a moral objection to that kind of change :)

Oddly enough, array[].clone() is JVM magic: I can't discover it's actual
implementation... a debugger steps right over the call just like it
would for an assignment. As far as Eclipse is concerned, array[].clone
is *not* a method call.

-chris

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to