[ 
https://issues.apache.org/jira/browse/DIRECTMEMORY-137?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13871680#comment-13871680
 ] 

Christoph Engelbert commented on DIRECTMEMORY-137:
--------------------------------------------------

A MemoryBuffer (as most other buffer, stream implementations is not threadsafe 
by design. It is meant to be fast and so synchronization is bad. The correct 
way would be to duplicate the buffer to have it's own writer/reader index for 
every access.

> Concurrent access to MemoryBuffer leads to BufferUnderflowException
> -------------------------------------------------------------------
>
>                 Key: DIRECTMEMORY-137
>                 URL: https://issues.apache.org/jira/browse/DIRECTMEMORY-137
>             Project: Apache DirectMemory
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 0.2
>            Reporter: Chetan Mehrotra
>         Attachments: DIRECTMEMORY-137.patch
>
>
> When same MemoryBuffer is accessed by multiple thread concurrently then it 
> can lead to BufferUnderflowException.
> MemoryManagerService.retrieve method performs following steps
> 1. Get MemoryBuffer associated with the Pointer
> 2. Set its readerIndex to 0
> 3. Call readBytes. Which for {{NioMemoryBuffer}} invokes following code
>     @Override
>     public int readBytes( byte[] bytes, int offset, int length )
>     {
>         byteBuffer.get( bytes, offset, length );
>         readerIndex += length;
>         return length;
>     }
> So if multiple thread invoke retrieve with same Pointer then readerIndex 
> might be set to wrong value leading to BufferUnderflowException 
> Refer to [1] for details
> [1] http://markmail.org/thread/yvevhzddta2fyal6



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)

Reply via email to