> On Feb 22, 2016, at 1:56 PM, Roger Riggs <roger.ri...@oracle.com> wrote:
> 
> Hi Mandy,
> 
> On 2/22/2016 4:41 PM, Mandy Chung wrote:
>>> On Feb 21, 2016, at 10:55 AM, Peter Levart <peter.lev...@gmail.com> wrote:
>>> 
> 
>>> I added new method to Cleaner:
>>> 
>>>    public boolean helpClean() { }
>>> 
>> I’m in two minds of making this a public method. An explicit way to enqueue 
>> pending references as well as invoke Cleanable::clean.  If it goes in, the 
>> method name needs to be renamed.
> I would suggest a name related to cleaning a single Cleanable.
>> 
>> The existing way to do that is to register phantom references in your own 
>> ReferenceQueue and then drain the queue at appropriate point.  Would you 
>> consider having a method to return ReferenceQueue maintained by the cleaner 
>> instead?
> If the queue is exposed, there is no assurance that the cleanable function 
> would be called.
> Any caller could introduce a bug by not doing the proper cleaning.
> 
> I was more concerned with the crossing of Reference.tryHandlePending with the 
> cleaning thread.
> The method description does not mention anything related to the Reference 
> processing thread
> though that is all implementation.  The @implNote might be a bit more concise 
> and less informal.
> 

I agree the spec needs some work if it’s a public method.  This seems better to 
file a RFE to follow up.

Mandy

> Roger
> 
>> 
>> Other than this new method, the change looks good to me.
>> 
>> Mandy
>> 
>>> I think this form of method that just does one quantum of work and returns 
>>> a boolean indicating whether there's more work waiting is a better fit for 
>>> some clients that might want to do just a limited amount of work at once 
>>> (like for example sun.java2d.Disposer.pollRemove that you mentioned). This 
>>> method also deals with helping the ReferenceHandler thread, which is 
>>> necessary to be able to "squeeze" out all outstanding work. As Cleaner is 
>>> in the same package as Reference and helping ReferenceHandler thread is 
>>> implicitly included in Cleaner.helpClean(), the JavaLangRefAccess interface 
>>> and a field in SharedSecrets can be removed.
>>> 
>>> I also simplified the API in sun.nio.fs.NativeBuffer and replaced the 
>>> accessor of Cleanable with a simple void free() method (called free because 
>>> it deallocates memory).
>>> 
>>> I think this will have to be submitted to CCC for approval, right? Can you 
>>> help me with it?
>>> 
>>> 
>>> Regards, Peter
>>> 
>>> On 02/17/2016 11:34 PM, Kim Barrett wrote:
>>>>> On Feb 17, 2016, at 4:06 AM, Peter Levart <peter.lev...@gmail.com> wrote:
>>>>> 
>>>>> Hi Kim,
>>>>> 
>>>>> Thanks for looking into this. Answers inline…
>>>> Peter,
>>>> 
>>>> Thanks for the explanations.
>>>> 
>>>>> On 02/17/2016 01:20 AM, Kim Barrett wrote:
>>>>>>> However, I recall Roger saying there were existing tests that
>>>>>> failed when certain uses of sun.misc.Cleaner were replaced with
>>>>>> java.lang.ref.Cleaner. I don't remember the details, but maybe Roger
>>>>>> does.
>>>>> If the failing test was the following:
>>>>> 
>>>>> java/nio/Buffer/DirectBufferAllocTest.java
>>>>> 
>>>>> ...then it has been taken care of (see Bits.java).
>>>> That looks familiar. And yes, I see what you did there, and I don't
>>>> think Roger's initial prototype testing did anything similar, so
>>>> indeed this is likely the failure he encountered.
>>>> 
>>>> Though I'm still inclined to object to that form of drainQueue (see
>>>> below).
>>>> 
>>>>>> I don't understand why CleanerImpl needs to be changed to public in
>>>>>> order to provide access to the new drainQueue. Wouldn't it be better
>>>>>> to add Cleaner.drainQueue?
>>>>> An interesting idea. But I don't know if such functionality is generally 
>>>>> useful enough to commit to it in a public API.
>>>> java.desktop:sun.java2d.Disposer.pollRemove seems to me to be
>>>> addressing an essentially similar requirement, with
>>>> java.desktop:sun.font.StrikeCache being the user of that API.
>>>> 
>>>> Of course, that's already got all the scaffolding for using phantom
>>>> references, and there's no need to rewrite it to use
>>>> java.lang.ref.Cleaner.  But maybe there are others like this?
>>>> 
>>>> In any case, I really dislike the approach of exposing the CleanerImpl
>>>> object to get at this functionality.
>>>> 
>>>>>> Some of the other changes here don't seem related to the problem at
>>>>>> hand. ...
>>>>> One thing that this change unfortunately requires is to get rid of 
>>>>> lambdas and method references in the implementation and dependencies of 
>>>>> java.land.ref.Cleaner API, because it gets used early in the boot-up 
>>>>> sequence when java.lang.invoke infrastructure is not ready yet.
>>>> Oh, right!  Bootstrapping issues!
>>>> 
>>>>> The alternative to CleanerCleanable is a no-op Runnable implementation 
>>>>> passed to PhantomCleanableRef constructor. …
>>>> OK.  Now I understand.
>>>> 
>>>>> Making CleanerImpl implement Runnable …
>>>> I'd be fine with this if the CleanerImpl wasn't exposed as part of the
>>>> drainQueue functionality.
>>>> 
>>>>>> ------------------------------------------------------------------------------
>>>>>> src/java.base/share/classes/sun/nio/fs/NativeBuffer.java
>>>>>>   76     Cleaner.Cleanable cleanable() {
>>>>>>   77         return cleanable;
>>>>>>   78     }
>>>>>> 
>>>>>> [pre-existing, but if we're changing things anyway...]
>>>>>> 
>>>>>> I'm kind of surprised by an accessor function (both here and in the
>>>>>> original code) rather than a cleanup function.  Is there a use case
>>>>>> for anything other than buffer.cleanable().clean()?
>>>>> It can't be, since both old Cleaner and new Cleanable have only got a 
>>>>> single method - clean().
>>>> So this could be replaced with
>>>> 
>>>>   void clean() {
>>>>     cleanable.clean();
>>>>   }
>>>> 
>>>> To me, that seems better.
>>>> 
>>>>>> Similarly for the DirectBuffer interface.
>>>>> This one is a critical method, used by various 3rd party softwares...
>>>> I want to cover my ears when people start talking about some of the
>>>> things that have done…  OK.
>>>> 
>>>> 
>>>> 
>>>> 
> 

Reply via email to