📄 lrubuffer.java
字号:
package neustore.base;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Vector;
/**
* The LRU buffer.
*
* @author Donghui Zhang <donghui@ccs.neu.edu>
*/
public class LRUBuffer extends DBBuffer {
protected Vector buffer;
public LRUBuffer(int bufferSize, int pageSize) {
super(bufferSize, pageSize);
buffer = new Vector();
}
/**
* Finds a page in buffer.
* If found, move to the beginning of buffer.
* Note: do not increase bufferReadIO.
*
* @param pageID the page ID
* @return an instance of DBBufferStoredElement if found; <i>null</i>otherwise.
*/
protected DBBufferStoredElement find(RandomAccessFile file, int pageID) {
int i;
for ( i=0; i<buffer.size(); i++ ) {
DBBufferStoredElement stored = (DBBufferStoredElement)buffer.elementAt(i);
if ( stored.file == file && stored.pageID == pageID ) {
buffer.remove(i);
buffer.add(0,stored);
return stored;
}
}
return null;
}
/**
* Adds a page to the buffer.
* Note: do not increase bufferReadIO.
* The element should not exist in the buffer already.
*
* @param stored the stored element
*/
protected void add( DBBufferStoredElement stored ) throws IOException{
if ( buffer.size() >= bufferSize ) {
// find a page to switch out
int i = buffer.size()-1;
DBBufferStoredElement s = null;
assert i>=0;
while ( i >= 0 ) {
s = (DBBufferStoredElement)buffer.get(i);
if ( s.pinCount == 0 ) break;
i--;
}
assert i>=0 : "Buffer full! No page to switch out!";
buffer.remove(i);
// write to disk if dirty
if ( s.dirty ) {
byte[] page = new byte[pageSize];
if ( s.parsed ) {
((DBPage)s.object).write( page );
}
else {
System.arraycopy((byte[])s.object, 0, page, 0, pageSize );
}
save(s.file, page, s.pageID);
}
}
buffer.add( 0, stored );
}
/**
* Flushes the buffer pages of a given file.
* Makes the buffer empty, while saving modified pages to disk.
*
* @throws IOException
*/
protected void flush (RandomAccessFile file) throws IOException {
byte[] page = new byte[pageSize];
int i = 0;
while ( i < buffer.size() ) {
DBBufferStoredElement stored = (DBBufferStoredElement)buffer.elementAt(i);
if ( stored.file == file ) {
buffer.remove(i);
if ( stored.dirty ) {
if ( stored.parsed ) {
((DBPage)stored.object).write( page );
}
else {
System.arraycopy((byte[])stored.object, 0, page, 0, pageSize );
}
save(stored.file, page, stored.pageID);
}
}
else {
i ++ ;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -