?? sdiskmgr.cpp
字號:
// Copyright 1993 Nildram Software. All rights reserved.
// May not be copied, except for backup purposes, without express written
// permission from Nildram Software
#include "stdafx.h"
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include "diskmgr.h"
const stEmpty = 0;
const stFull = 1;
const stDirty = 2;
static int no_instance = 0;
struct BUFFER
{
char *buf;
int nBuffLabel;
unsigned long lruval;
int fd;
long start;
unsigned len;
};
static int nobufs;
static BUFFER *buffer;
static long lrucount;
extern int DMCacheSize;
DiskMgr::DiskMgr(int ctype)
{
m_nType = ctype;
if (no_instance++ != 0)
return;
nobufs = DMCacheSize;
lrucount = 0;
buffer = new BUFFER[nobufs];
for (int x = 0; x < nobufs; x++) {
buffer[x].nBuffLabel = stEmpty;
}
for (x = 0; x < nobufs; x++) {
buffer[x].lruval = 0L;
buffer[x].fd = 0L;
buffer[x].start = 0;
buffer[x].len = 0;
}
}
DiskMgr::~DiskMgr(void)
{
if (--no_instance != 0)
return;
for (int x = 0; x < nobufs; x++)
if (buffer[x].nBuffLabel != stEmpty)
{
flush(x);
delete buffer[x].buf;
}
delete buffer;
}
int DiskMgr::open(const char *path, int access)
{
return sopen(path, access, SH_DENYRW);
}
long DiskMgr::seek(int fd, long offset)
{
return lseek(fd, offset, SEEK_SET);
}
int DiskMgr::close(int handle)
{
if (m_nType != caNoCache)
for (int x = 0; x < nobufs; x++)
if (buffer[x].fd == handle && buffer[x].nBuffLabel != stEmpty)
{
flush(x);
delete buffer[x].buf;
buffer[x].nBuffLabel = stEmpty;
}
return ::close(handle);
}
void DiskMgr::flush(int x)
{
if (buffer[x].nBuffLabel == stDirty)
{
seek(buffer[x].fd, buffer[x].start);
::write(buffer[x].fd, buffer[x].buf, buffer[x].len);
}
buffer[x].nBuffLabel = stFull;
}
int DiskMgr::read(int handle, void *buf, long start, unsigned len)
{
if (m_nType == caNoCache)
{
seek(handle, start);
return ::read(handle, buf, len);
}
for (int x = 0; x < nobufs; x++)
if (buffer[x].fd == handle && buffer[x].nBuffLabel != stEmpty &&
((buffer[x].start <= start && (buffer[x].start + buffer[x].len) > start &&
(buffer[x].start + buffer[x].len) < (start + len)) ||
(buffer[x].start > start && buffer[x].start < (start + len))))
{
flush(x);
delete buffer[x].buf;
buffer[x].nBuffLabel = stEmpty;
}
for (x = 0; x < nobufs; x++)
if (buffer[x].fd == handle && buffer[x].nBuffLabel != stEmpty &&
buffer[x].start <= start &&
(buffer[x].start + buffer[x].len) >= (start + len))
{
memcpy(buf, buffer[x].buf + (start - buffer[x].start), len);
buffer[x].lruval = lrucount++;
return len;
}
int lru_item = 0;
unsigned long lru_value = 0xFFFFFFFFL;
for (x = 0; x < nobufs; x++)
{
if (buffer[x].nBuffLabel == stEmpty)
break;
if (buffer[x].lruval < lru_value)
{
lru_item = x;
lru_value = buffer[x].lruval;
}
}
if (x == nobufs)
{
x = lru_item;
flush(x);
delete buffer[x].buf;
buffer[x].nBuffLabel = stEmpty;
}
seek(handle, start);
int retval = ::read(handle, buf, len);
if (retval != len)
return retval;
buffer[x].buf = new char[len];
buffer[x].nBuffLabel = stFull;
buffer[x].lruval = lrucount++;
buffer[x].fd = handle;
buffer[x].start = start;
buffer[x].len = len;
memcpy(buffer[x].buf, buf, len);
return len;
}
int DiskMgr::write(int handle, void *buf, long start, unsigned len)
{
if (m_nType == caNoCache)
{
seek(handle, start);
return ::write(handle, buf, len);
}
for (int x = 0; x < nobufs; x++)
if (buffer[x].fd == handle && buffer[x].nBuffLabel != stEmpty &&
((buffer[x].start <= start && (buffer[x].start + buffer[x].len) > start &&
(buffer[x].start + buffer[x].len) < (start + len)) ||
(buffer[x].start > start && buffer[x].start < (start + len))))
{
flush(x);
delete buffer[x].buf;
buffer[x].nBuffLabel = stEmpty;
}
for (x = 0; x < nobufs; x++)
if (buffer[x].fd == handle && buffer[x].nBuffLabel != stEmpty &&
buffer[x].start <= start &&
(buffer[x].start + buffer[x].len) >= (start + len))
{
memcpy(buffer[x].buf + (start - buffer[x].start), buf, len);
buffer[x].lruval = lrucount++;
buffer[x].nBuffLabel = stDirty;
return len;
}
int lru_item = 0;
unsigned long lru_value = 0xFFFFFFFFL;
for (x = 0; x < nobufs; x++)
{
if (buffer[x].nBuffLabel == stEmpty)
break;
if (buffer[x].lruval < lru_value)
{
lru_item = x;
lru_value = buffer[x].lruval;
}
}
if (x == nobufs)
{
x = lru_item;
flush(x);
delete buffer[x].buf;
}
buffer[x].buf = new char[len];
buffer[x].nBuffLabel = stDirty;
buffer[x].lruval = lrucount++;
buffer[x].fd = handle;
buffer[x].start = start;
buffer[x].len = len;
memcpy(buffer[x].buf, buf, len);
return len;
}
//void DiskMgr::unlock(int)
//{
//}
//void DiskMgr::unlock_head(int)
//{
//}
//void DiskMgr::lock_head(int)
//{
//}
//void DiskMgr::lock(int, long, long)
//{
//}
//void DiskMgr::lockfile(int)
//{
//}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -