dev@grizzly.java.net

Re: buffer dispose question

From: Oleksiy Stashok <oleksiy.stashok_at_oracle.com>
Date: Wed, 28 Mar 2012 11:18:04 +0200

On 03/22/2012 04:51 PM, Tigran Mkrtchyan wrote:
> On Thu, Mar 22, 2012 at 4:41 PM, Oleksiy Stashok
> <oleksiy.stashok_at_oracle.com> wrote:
>> On 03/22/2012 04:32 PM, Tigran Mkrtchyan wrote:
>>> we'll probably need to introduce another allowBufferDispose method in
>>> CompositeBuffer, which will propagate the dispose flag to underlying
>>> Buffers.
>>>
>>> Now when you dispose CompositeBuffer, if its allowInternalBuffersDispose
>>> flag is true, it iterates over all the internal Buffers and calls
>>> internalBuffer.tryDispose(). So it's up to each internal Buffer to decide
>>> if
>>> it wants to be disposed or not.
>>> This is OK if you know that buffer is composite, But I don't (well I
>>> can always ask isComposite).
>>>
>>> Buffer buffer = xdr.body();
>>> buffer.allowBufferDispose(true);
>>> _context.write(_context.getAddress(), buffer, null);
>>>
>>> buffer can be CompositeBuffer of HeapBuffer. This is what grzzly gives
>>> me depending on does message arrived at once or in multiple chinks.
>> AFAIR the Buffer, which represents incoming bytes, has to allow buffer
>> dispose by default, cause we know that this Buffer comes from Grizzly core
>> and we don't have any reference to it.
>> Isn't it the case?
> I believe not.
You're right.
Would you mind to file an issue?

Thanks.

WBR,
Alexey.

>
> Tigran.
>>
>>> Other question:
>>>
>>> In case a buffer is not disposed do I get memory leak or it will be GC
>>> and allocated a new one?
>> It will be GC'ed, the dispose functionality it's like an optimization bonus
>> you may want to use if you know what you do.
>>
>> Thanks.
>>
>> WBR,
>> Alexey.
>>
>>
>>> Tigran.
>>>
>>>> Specifically for CompositeBuffer, allowBufferDispose means whether this
>>>> CompositeBuffer instance will or will not be returned to a thread-local
>>>> object cache after CompositeBuffer.tryDispose is called.
>>>>
>>>> Thanks.
>>>>
>>>> WBR,
>>>> Alexey.
>>>>
>>>>
>>>> On 03/22/2012 04:03 PM, Tigran Mkrtchyan wrote:
>>>>> test case attached
>>>>>
>>>>> On Thu, Mar 22, 2012 at 3:43 PM, Tigran Mkrtchyan
>>>>> <tigran.mkrtchyan_at_desy.de> wrote:
>>>>>> Hi,
>>>>>>
>>>>>> I have a following code:
>>>>>>
>>>>>> Buffer buffer1 = ...;
>>>>>> Buffer buffer2 = ...;
>>>>>>
>>>>>> Buffer composite =
>>>>>> BuffersBuffer.create(MemoryManager.DEFAULT_MEMORY_MANAGER,
>>>>>> buffer1, buffer2 );
>>>>>> composite.allowBufferDispose(true);
>>>>>>
>>>>>> At this point I expect that
>>>>>>
>>>>>> composite.tryDispose() and composite.dispose() will dispose buffer1 and
>>>>>> buffer2.
>>>>>>
>>>>>> Nevertheless this is not the case. I think
>>>>>>
>>>>>> composite.allowBufferDispose(true);
>>>>>>
>>>>>> have to propagate to buffer1 and buffer2 or
>>>>>>
>>>>>> BuffersBuffer.removeAndDisposeBuffers have to call dispose on
>>>>>> underlying buffers instead of tryDispose.
>>>>>>
>>>>>> Tigran.
>>>>