01: /*
02: * Javolution - Java(TM) Solution for Real-Time and Embedded Systems
03: * Copyright (C) 2006 - Javolution (http://javolution.org/)
04: * All rights reserved.
05: *
06: * Permission to use, copy, modify, and distribute this software is
07: * freely granted, provided that this notice is preserved.
08: */
09: package javolution.context;
10:
11: /**
12: * <p> This class represents an object allocator; instances of this class
13: * are generated by {@link AllocatorContext}.</p>
14: *
15: * <p> If an allocator has recycled objects available, those are returned
16: * first, before allocating new ones.</p>
17: *
18: * <p> Allocator instances are thread-safe without synchronization,
19: * they are the "production lines" of the {@link ObjectFactory factories},
20: * their implementation is derived from the {@link AllocatorContext}
21: * to which they belong (e.g. heap allocators for {@link HeapContext}).</p>
22: *
23: * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
24: * @version 5.2, August 14, 2007
25: * @see AllocatorContext#getAllocator(ObjectFactory)
26: */
27: public abstract class Allocator /*<T>*/{
28:
29: /**
30: * Holds the current user or <code>null</code> if deactivated.
31: */
32: protected Thread user;
33:
34: /**
35: * Holds the queue of available objects (typically recycled).
36: */
37: protected Object/*{T}*/[] queue = (Object/*{T}*/[]) new Object[16];
38:
39: /**
40: * Holds the number of objects in this allocator queue.
41: */
42: protected int queueSize;
43:
44: /**
45: * Indicates if the objects from the queue should be kept in the queue.
46: */
47: protected boolean keepInQueue;
48:
49: /**
50: * Default constructor.
51: */
52: protected Allocator() {
53: }
54:
55: /**
56: * Returns the next available object from this allocator queue or
57: * {@link #allocate} one if none available.
58: *
59: * @return the next available object ready to use.
60: */
61: public final Object/*{T}*/next() {
62: return queueSize > 0 ? (keepInQueue ? queue[--queueSize]
63: : removeLast()) : allocate();
64: }
65:
66: private final Object/*{T}*/removeLast() {
67: Object/*{T}*/obj = queue[--queueSize];
68: queue[queueSize] = null;
69: return obj;
70: }
71:
72: /**
73: * Allocates a new object, this method is called when the allocator queue
74: * is empty.
75: *
76: * @return the allocated object.
77: */
78: protected abstract Object/*{T}*/allocate();
79:
80: /**
81: * Recycles the specified object to this queue.
82: *
83: * @param object the object to recycle.
84: */
85: protected abstract void recycle(Object/*{T}*/object);
86:
87: /**
88: * Resizes this allocator queue (hopefully rare as implementation should
89: * keep the queue small).
90: */
91: void resize() {
92: Object/*{T}*/[] tmp = (Object/*{T}*/[]) new Object[queue.length * 2];
93: System.arraycopy(queue, 0, tmp, 0, queue.length);
94: queue = tmp;
95: }
96:
97: }
|