KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > jofti > store > PageManager


1 package com.jofti.store;
2
3 import java.nio.ByteBuffer JavaDoc;
4
5 import com.jofti.btree.BTree;
6 import com.jofti.btree.IPage;
7 import com.jofti.core.IStoreManager;
8 import com.jofti.exception.JoftiException;
9
10 import edu.emory.mathcs.backport.java.util.concurrent.LinkedBlockingQueue;
11
12 /**
13  * @author xenephon
14  *
15  * TODO To change the template for this generated type comment go to Window -
16  * Preferences - Java - Code Style - Code Templates
17  */

18 public class PageManager {
19
20     /**
21      *
22      */

23     /**
24      *
25      */

26     LinkedBlockingQueue bufQueue = null;
27
28     LinkedBlockingQueue largeBufQueue = null;
29
30     LinkedBlockingQueue pageQueue = null;
31
32     private int blockSize = 0;
33
34     private int maxPages = 100;
35
36     private int pageNumber = 10;
37
38     long waitingTime = 0;
39
40     private long newPages = 0;
41
42     long accesses = 0;
43
44     long newBuffers=0;
45     
46     long bufferAccesses=0;
47     
48     
49     
50     IStoreManager manager = null;
51     IEntrySerializer serializer =null;
52
53     public PageManager() {
54         super();
55     }
56
57     public void init(int blockSize, int maxPages, int pageNumber,
58             IStoreManager manager, IEntrySerializer serializer) throws JoftiException
59     {
60         // allocate all the free buffers to the freeQueue
61
this.blockSize = blockSize;
62         this.maxPages = maxPages;
63         this.manager = manager;
64         this.serializer = serializer;
65
66         // set up the buffer pools
67
bufQueue = new LinkedBlockingQueue(maxPages);
68         largeBufQueue = new LinkedBlockingQueue(maxPages);
69         pageQueue = new LinkedBlockingQueue(maxPages);
70
71         //allocate pages
72
for (int i = 0; i < pageNumber; i++) {
73             int[] arr = new int[BTree.getMaxNodeSize()];
74             for (int j = 0; j < arr.length; j++) {
75                 arr[j] = -1;
76             }
77             ByteBuffer JavaDoc buf = ByteBuffer.allocate(blockSize);
78             buf.flip();
79             Page page = new Page(arr, buf, manager,serializer);
80             pageQueue.add(page);
81         }
82
83         //allocate normal buffers
84
for (int i = 0; i < pageNumber; i++) {
85             ByteBuffer JavaDoc buf = ByteBuffer.allocate(blockSize);
86             buf.flip();
87             bufQueue.add(buf);
88         }
89
90         //allocate large buffers
91
for (int i = 0; i < pageNumber; i++) {
92             ByteBuffer JavaDoc buf = ByteBuffer.allocate(blockSize * 2);
93             buf.flip();
94             largeBufQueue.add(buf);
95         }
96         this.pageNumber = pageNumber;
97
98     }
99
100     
101     public IPage acquirePage(int size) throws JoftiException
102     {
103
104         accesses++;
105
106         Page page = (Page) pageQueue.poll();
107
108         // we must be out of buffers so we can create one
109
if (page == null) {
110
111             ++newPages;
112             // create a new buffer and nset up the pointers
113
int[] arr = new int[BTree.getMaxNodeSize()];
114             for (int j = 0; j < arr.length; j++) {
115                 arr[j] = -1;
116             }
117             
118             page = new Page(arr, acquireBuffer(size), manager,serializer);
119
120         } else {
121             if ((size > blockSize && page.buf.capacity() == blockSize)
122                     || (size <= blockSize && page.buf.capacity() > blockSize)) {
123                 // offer the old buffer back to the pool
124
bufQueue.offer(page.buf);
125                 page.buf = acquireBuffer(size);
126             }
127         }
128         return page;
129     }
130
131     /**
132      * releases a buffer into the freeQueue
133      *
134      * @param buffer
135      * LogBuffer to be released
136      */

137     public void releasePage(IPage page) {
138
139         page.reset();
140
141         
142         if (!pageQueue.offer(page)){
143             releaseBuffer(page.getBuffer());
144         }
145
146     }
147
148     public ByteBuffer JavaDoc acquireBuffer(int size) {
149         ++bufferAccesses;
150         ByteBuffer JavaDoc buf = null;
151         if (size > blockSize) {
152             buf = (ByteBuffer JavaDoc) largeBufQueue.poll();
153             if (buf == null || size > buf.capacity()) {
154                 ++newBuffers;
155                 buf = ByteBuffer.allocate(size);
156                 buf.flip();
157             }
158
159         } else {
160             buf = (ByteBuffer JavaDoc) bufQueue.poll();
161             if (buf == null) {
162                 ++newBuffers;
163                 buf = ByteBuffer.allocate(blockSize);
164                 buf.flip();
165             }
166         }
167         return buf;
168     }
169
170     public void releaseBuffer(ByteBuffer JavaDoc buf) {
171         buf.clear();
172         buf.flip();
173         if (buf.capacity() <= blockSize) {
174             bufQueue.offer(buf);
175         } else {
176             largeBufQueue.offer(buf);
177         }
178     }
179
180 }
Popular Tags