Skip to content

Commit 4c1d0ef

Browse files
committed
ObjectCache redesigned.
1 parent 62ffe2b commit 4c1d0ef

File tree

4 files changed

+34
-51
lines changed

4 files changed

+34
-51
lines changed

core/src/org/jsl/collider/ObjectCache.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ public abstract class ObjectCache<TYPE>
3030
private final TYPE [] m_cache;
3131
private int m_size;
3232
private int m_gets;
33-
private int m_miss;
3433
private int m_puts;
34+
private int m_miss;
3535

3636
protected abstract TYPE allocateObject();
3737

@@ -86,22 +86,20 @@ public final TYPE get()
8686
return allocateObject();
8787
}
8888

89-
public final void clear( Logger logger, int initialSize )
89+
public final void clear( Logger logger )
9090
{
9191
for (int idx=0; idx<m_size; idx++)
9292
{
9393
assert( m_cache[idx] != null );
9494
m_cache[idx] = null;
9595
}
9696

97-
if (m_size < initialSize)
97+
if (m_puts != m_gets)
9898
{
9999
if (logger.isLoggable(Level.WARNING))
100100
{
101101
logger.log( Level.WARNING,
102-
m_name + ": resource leak detected: current size " +
103-
m_size + " less than initial size " + initialSize +
104-
" (get=" + m_gets + ", miss=" + m_miss + ", put=" + m_puts + ")." );
102+
m_name + ": resource leak detected: gets=" + m_gets + ", puts=" + m_puts + "." );
105103
}
106104
}
107105
else
@@ -117,7 +115,7 @@ public final void clear( Logger logger, int initialSize )
117115
m_size = 0;
118116
}
119117

120-
public final String clear( int initialSize )
118+
public String clear( int initialSize )
121119
{
122120
for (int idx=0; idx<m_size; idx++)
123121
{
@@ -128,11 +126,11 @@ public final String clear( int initialSize )
128126
final int size = m_size;
129127
m_size = 0;
130128

131-
if (size < initialSize)
129+
if (m_puts != m_gets)
132130
{
133131
return m_name + ": WARNING: resource leak detected: current size " +
134132
size + " less than initial size " + initialSize +
135-
" (" + m_gets + ", " + m_miss + ", " + m_puts + ").";
133+
" (" + m_gets + ", " + m_miss + ", " + m_puts + ").";
136134
}
137135
else
138136
{

core/src/org/jsl/collider/RetainableByteBuffer.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,12 +123,18 @@ public final boolean clearSafe()
123123
return false;
124124
}
125125

126-
public RetainableByteBuffer slice()
126+
public final RetainableByteBuffer slice()
127127
{
128128
retain();
129129
return new Slice( m_buf.slice() );
130130
}
131131

132+
public final RetainableByteBuffer duplicate()
133+
{
134+
retain();
135+
return new Slice( m_buf.duplicate() );
136+
}
137+
132138
/*
133139
* ByteBuffer interface mimic.
134140
*/

core/src/org/jsl/collider/RetainableByteBufferCache.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,38 +23,39 @@
2323

2424
public class RetainableByteBufferCache extends ObjectCache<RetainableByteBuffer>
2525
{
26-
private class BufferImpl extends RetainableByteBufferImpl
26+
private static class BufferImpl extends RetainableByteBufferImpl
2727
{
28-
public BufferImpl( ByteBuffer buf )
28+
private RetainableByteBufferCache m_cache;
29+
30+
public BufferImpl( ByteBuffer buf, RetainableByteBufferCache cache )
2931
{
3032
super( buf );
33+
m_cache = cache;
3134
}
3235

3336
protected void finalRelease()
3437
{
3538
super.finalRelease();
36-
RetainableByteBufferCache.this.put( this );
39+
m_cache.put( this );
3740
}
3841
}
3942

40-
private final int m_bufferCapacity;
4143
private final boolean m_useDirectBuffer;
44+
private final int m_bufferCapacity;
4245

4346
protected BufferImpl allocateObject()
4447
{
45-
final ByteBuffer buf =
48+
final ByteBuffer buf =
4649
m_useDirectBuffer
4750
? ByteBuffer.allocateDirect( m_bufferCapacity )
4851
: ByteBuffer.allocate( m_bufferCapacity );
49-
return new BufferImpl( buf );
52+
return new BufferImpl( buf, this );
5053
}
5154

52-
public RetainableByteBufferCache( int bufferCapacity, boolean useDirectBuffer, int maxSize, int initialSize )
55+
public RetainableByteBufferCache( boolean useDirectBuffer, int bufferCapacity, int size )
5356
{
54-
super( RetainableByteBuffer.class.getSimpleName() + "-" + bufferCapacity, new RetainableByteBuffer[maxSize] );
55-
m_bufferCapacity = bufferCapacity;
57+
super( RetainableByteBufferCache.class.getSimpleName() + "-" + bufferCapacity, new RetainableByteBuffer[size] );
5658
m_useDirectBuffer = useDirectBuffer;
57-
for (int idx=0; idx<initialSize; idx++)
58-
put( allocateObject() );
59+
m_bufferCapacity = bufferCapacity;
5960
}
6061
}

core/src/org/jsl/collider/RetainableByteBufferPool.java

Lines changed: 8 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -68,41 +68,24 @@ public final void release( int bytes )
6868

6969
private static class ChunkCache extends ObjectCache<Chunk>
7070
{
71-
private final boolean m_useDirectBuffers;
71+
private final boolean m_useDirectBuffer;
7272
private final int m_bufferCapacity;
73-
private final int m_initialSize;
7473

75-
public ChunkCache( boolean useDirectBuffers, int bufferCapacity, int maxCacheSize, int initialSize )
74+
public ChunkCache( boolean useDirectBuffer, int bufferCapacity, int maxCacheSize )
7675
{
7776
super( "ByteBufferPool[" + bufferCapacity + "]", new Chunk[maxCacheSize] );
78-
79-
m_useDirectBuffers = useDirectBuffers;
77+
m_useDirectBuffer = useDirectBuffer;
8078
m_bufferCapacity = bufferCapacity;
81-
m_initialSize = initialSize;
82-
83-
for (int cc=initialSize; cc>0; cc--)
84-
put( allocateObject() );
8579
}
8680

8781
protected Chunk allocateObject()
8882
{
89-
ByteBuffer buf;
90-
if (m_useDirectBuffers)
91-
buf = ByteBuffer.allocateDirect( m_bufferCapacity );
92-
else
93-
buf = ByteBuffer.allocate( m_bufferCapacity );
83+
final ByteBuffer buf =
84+
m_useDirectBuffer
85+
? ByteBuffer.allocateDirect( m_bufferCapacity )
86+
: ByteBuffer.allocate( m_bufferCapacity );
9487
return new Chunk( this, buf );
9588
}
96-
97-
public final void clear( Logger logger )
98-
{
99-
clear( logger, m_initialSize );
100-
}
101-
102-
public final String clear()
103-
{
104-
return clear( m_initialSize );
105-
}
10689
}
10790

10891
private static class BufferImpl extends RetainableByteBuffer
@@ -267,7 +250,7 @@ public RetainableByteBufferPool( int chunkSize )
267250
public RetainableByteBufferPool( int chunkSize, boolean useDirectBuffers )
268251
{
269252
m_useDirectBuffers = useDirectBuffers;
270-
m_cache = new ChunkCache( m_useDirectBuffers, chunkSize, 128, 2 );
253+
m_cache = new ChunkCache( m_useDirectBuffers, chunkSize, 128 );
271254
m_chunkSize = chunkSize;
272255
m_chunk = m_cache.get();
273256
}
@@ -384,9 +367,4 @@ public final void clear( Logger logger )
384367
{
385368
m_cache.clear( logger );
386369
}
387-
388-
public final String clear()
389-
{
390-
return m_cache.clear();
391-
}
392370
}

0 commit comments

Comments
 (0)