My favorites | Sign in
Project Home Downloads Wiki Issues Source
Checkout   Browse   Changes    
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
* Copyright 2011 LMAX Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.lmax.disruptor;

/**
* Ring based store of reusable entries containing the data representing an event being exchanged between event publisher and {@link EventProcessor}s.
*
* @param <T> implementation storing the data for sharing during exchange or parallel coordination of an event.
*/
public final class RingBuffer<T> extends Sequencer
{
private final int indexMask;
private final Object[] entries;

/**
* Construct a RingBuffer with the full option set.
*
* @param eventFactory to newInstance entries for filling the RingBuffer
* @param claimStrategy threading strategy for publisher claiming entries in the ring.
* @param waitStrategy waiting strategy employed by processorsToTrack waiting on entries becoming available.
*
* @throws IllegalArgumentException if bufferSize is not a power of 2
*/
public RingBuffer(final EventFactory<T> eventFactory,
final ClaimStrategy claimStrategy,
final WaitStrategy waitStrategy)
{
super(claimStrategy, waitStrategy);

if (Integer.bitCount(claimStrategy.getBufferSize()) != 1)
{
throw new IllegalArgumentException("bufferSize must be a power of 2");
}

indexMask = claimStrategy.getBufferSize() - 1;
entries = new Object[claimStrategy.getBufferSize()];

fill(eventFactory);
}

/**
* Construct a RingBuffer with default strategies of:
* {@link MultiThreadedClaimStrategy} and {@link BlockingWaitStrategy}
*
* @param eventFactory to newInstance entries for filling the RingBuffer
* @param bufferSize of the RingBuffer that will be rounded up to the next power of 2
*/
public RingBuffer(final EventFactory<T> eventFactory, final int bufferSize)
{
this(eventFactory,
new MultiThreadedClaimStrategy(bufferSize),
new BlockingWaitStrategy());
}

/**
* Get the event for a given sequence in the RingBuffer.
*
* @param sequence for the event
* @return event for the sequence
*/
@SuppressWarnings("unchecked")
public T get(final long sequence)
{
return (T)entries[(int)sequence & indexMask];
}

private void fill(final EventFactory<T> eventFactory)
{
for (int i = 0; i < entries.length; i++)
{
entries[i] = eventFactory.newInstance();
}
}
}

Change log

r498 by mjpt777 on Dec 18, 2011   Diff
Javadoc correction
Go to: 
Project members, sign in to write a code review

Older revisions

r497 by mikeb01 on Dec 17, 2011   Diff
Move existing
MultithreadedClaimStrategy to be a low
contention strategy.  Make
MultithreadedClaimStrategyV2 from
experimental to be the default
r469 by mjpt777 on Nov 2, 2011   Diff
Opened up claim and wait strategies so
user defined ones can be applied.
r449 by mjpt777 on Oct 24, 2011   Diff
Rename size to bufferSize
All revisions of this file

File info

Size: 3034 bytes, 87 lines
Powered by Google Project Hosting